Strom安装

Strom启动

./zkServer.sh start
启动nimbus主节点: nohup bin/storm nimbus >> /dev/null &
启动supervisor从节点: nohup bin/storm supervisor >> /dev/null &
都启动完毕之后,启动strom ui管理界面: bin/storm ui &
使用了drpc,要启动drpc: nohup bin/storm drpc &

Storm简介

  • 低延迟。高性能。可扩展。
  • 分布式。系统都是为应用场景而生的,如果你的应用场景、你的数据和计算单机就能搞定,那么不用考虑这些复杂的问题了。我们所说的是单机搞不定的情况。
  • 容错。一个节点挂了不影响应用。

实现一个实时计算系统。如果仅仅需要解决这5个问题,可能会有无数种方案,使用消息队列+分布在各个机器上的工作进程不就ok啦?

  1. 容易在上面开发应用程序。设计的系统需要应用程序开发人员考虑各个处理组件的分布、消息的传递吗?那就有点麻烦啊,开发人员可能会用不好,也不会想去用。
  2. 消息不丢失。用户发布的一个宝贝消息不能在实时处理的时候给丢了;更严格一点,如果是一个精确数据统计的应用,那么它处理的消息要不多不少才行。Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。
  3. 消息严格有序。有些消息之间是有强相关性的,比如同一个宝贝的更新和删除操作消息,如果处理时搞乱顺序完全是不一样的效果了。
  4. 快速。系统的设计保证了消息能得到快速的处理,使用ZeroMQ作为其底层消息队列。

Storm的架构、基本概念

  • Nimbus:主节点,负责资源分配和任务调度。

  • Supervisor:每个工作节点都运行了一个名为“Supervisor”的守护进程,负责接收nimbus分配的任务,启动和停止自己管理的N个worker进程。

  • Worker:运行具体处理组件逻辑的进程。一个Worker对应一个Topo,conf.setNumWorkers(2); 一个worker对应一个端口对应一个JVM进程!不是对应一台机器!

  • Topology:storm中运行的一个实时应用程序(相当于MR),(Spout + Bolt = Topo = Component,Spout,Bolt的名字就是ComponentId)形成有向图。点是计算节点,边是数据流。

  • Executor执行线程:就是setBolt制定的那个数字!!用来设置线程数。

  • Task:task不与物理线程对应,同一个spout/bolt的task可能会共享一个物理线程executor。代表最大并发度。用来设置要执行的task数目,处理逻辑的数目。


  • Spout:Topology中的数据流源头。通常情况下spout会从外部数据源中读取数据,然后转换为Topology内部的源数据,然后封装成Tuple形式,之后发送到Stream中,Bolt再接收任意多个输入stream, 作一些业务处理。Spout是一个主动的角色,其接口中有个nextTuple()函数,storm框架会不停地调用此函数,用户只要在其中生成源数据即可。

  • Bolt:一个Topology中接受数据然后执行处理的逻辑处理组件。Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)函数,在接受到消息后会调用此函数。

  • Tuple:Bolt之间一次消息传递的基本单元:有序元素的列表。通常建模为一组逗号分隔的值,所以就是一个value list。

  • Stream:tuple的序列流。

Storm分组机制

Stream Grouping 定义了一个流在Bolt Task间该如何被切分进行接收由接收数据的bolt来设置

Bolt在多线程下有7种类型的stream grouping ,单线程下都是All Grouping:

  1. Shuffle Grouping(随机分组): 随机派发stream里面的tuple, 保证Bolt的每个Task接收到的tuple数目相同平均分配。(Spout 100条,Bolt的两个Task每个获得50条Tuple)

  2. Fields Grouping(按字段分组): 比如按userid来分组, 具有同样userid的tuple会被分到相同的Bolts, 而不同的userid则会被分配到不同的Bolts。

    作用:(1)过滤多输出Field中选择某些Field;去重操作,Join。

    (2)相同的tuple会分给同一个Task处理,比如WordCount,相同的单词给同一个Task统计才能准确,而使用Shuffle Grouping就不行!!

  3. Non Grouping (不分组):不关心到底谁会收到它的tuple。这种分组和Shuffle grouping是一样的效果,不平均分配。

  4. LocalOrShuffleGrouping:如果目标Bolt中的一个或者多个Task和当前产生数据的Task在同一个Worker进程里面,那么就走内部的线程间通信,将Tuple直接发给在当前Worker进程的目的Task。否则,同shuffleGrouping。该方式数据传输性能优于shuffleGrouping,因为在Worker内部传输,只需要通过Disruptor队列就可以完成,没有网络开销和序列化开销。因此在数据处理的复杂度不高,而网络开销和序列化开销占主要地位的情况下,可以优先使用localOrShuffleGrouping来代替shuffleGrouping

  5. DirectGrouping :这种方式发送者可以指定下游的哪个Task可以接收这个元组。只有在数据流被声明为直接数据流时才能够使用直接分组方式。使用直接数据流发送元组需要使用 OutputCollector 的 emitDirect 方法。Bolt 可以通过 TopologyContext 来获取它的下游消费者的任务 id,也可以通过跟踪 OutputCollector 的 emit 方法(该方法会返回它所发送元组的目标任务的 id)的数据来获取任务 id。

  6. All Grouping (广播发送): 对于每一个tuple, 所有的Bolts都会收到。(Spout 100条,两个Bolt每个获得100条Tuple,一共200条)

  7. Global Grouping (全局分组): tuple被分配到一个bolt的其中一个task。再具体一点就是分配给id值最低的那个task。

并发度相关概念

Executor数代表实际并发数(worker进程中的线程数),这样设置一个并发数:setBolt(xx, xx, 1);

Task数代表最大并发度,是具体的处理逻辑实例,这样设置2个task:setBolt(xx, xx, 1).setTask(2);

这样就两个task共享一个executor线程,互相抢executor线程来执行bolt的execute方法。

通过storm rebalance命令:一个component的task数是不会改变的, 但是一个componet的executer数目是会发生变化的

看看下面的例子:

Config conf = new Config();
// 2个进程
conf.setNumWorkers(2); topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2)
.setNumTasks(4)
.shuffleGrouping("blue-spout"); topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)
.shuffleGrouping("green-bolt"); StormSubmitter.submitTopology("mytopology", conf, topologyBuilder.createTopology());

通过setBolt和setSpout一共定义 2 + 2 + 6 = 10个 executor threads;

前面 setNumWorkers 设置2个workers, 所以storm会平均在每个worker上run 5个executors !!!!

而对于green-bolt, 定义了4个tasks, 所以每个executor中有2个tasks。

Storm使用总结的更多相关文章

  1. Storm如何保证可靠的消息处理

    作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文主要翻译自Storm官方文档Guaranteeing messag ...

  2. Storm

    2016-11-14  22:05:29 有哪些典型的Storm应用案例? 数据处理流:Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去.不像其它的流处理系统,Storm不 ...

  3. Storm介绍(一)

    作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 内容简介 本文是Storm系列之一,介绍了Storm的起源,Storm ...

  4. 理解Storm并发

    作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 注:本文主要内容翻译自understanding-the-parall ...

  5. Storm构建分布式实时处理应用初探

    最近利用闲暇时间,又重新研读了一下Storm.认真对比了一下Hadoop,前者更擅长的是,实时流式数据处理,后者更擅长的是基于HDFS,通过MapReduce方式的离线数据分析计算.对于Hadoop, ...

  6. Storm内部的消息传递机制

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 一个Storm拓扑,就是一个复杂的多阶段的流式计算.Storm中的组件 ...

  7. Storm介绍(二)

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是Storm系列之一,主要介绍Storm的架构设计,推荐读者在阅读 ...

  8. Storm介绍及与Spark Streaming对比

    Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...

  9. 交易系统使用storm,在消息高可靠情况下,如何避免消息重复

    概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理.这个时候仅仅开启storm的ack机制并不能解决上述问题.那么该如何设计出一个好的方案 ...

  10. 由提交storm项目jar包引发对jar的原理的探索

    序:在开发storm项目时,提交项目jar包当把依赖的第三方jar包都打进去提交storm集群启动时报了发现多个同名的文件错误由此开始了一段对jar包的深刻理解之路. java.lang.Runtim ...

随机推荐

  1. 阿里云MaxCompute 2019-6月刊

    您好,MaxCompute 2019.6月刊为您带来6月产品.技术最新动态,欢迎阅读. 导读 [功能发布]6月产品重要发布 [文档更新]6月重要文档更新推荐 [干货精选]6月精选技术文章推荐 [活动回 ...

  2. Servlet过虑器

    过滤器是在请求的预处理和后处理时调用的对象. 主要用于执行转换,日志记录,压缩,加解密,输入验证等过滤任务. servlet过滤器是可插拔的,即它在web.xml文件中定义,如果从web.xml文件中 ...

  3. 利用backtrace和ucontex定位segment错误

    C程序运行时,经常会碰到"segmentfault"错误.这是由于程序中非法访问内存导致的.当操作系统的内存保护机制发现进程访问了非法内存的时候会向此进程发送一个SIGSEGV信号 ...

  4. 【NS2】Installing ns-2.29 in Ubuntu 12.04

    Installing ns-2.29 in Ubuntu 12.04     Off late, we try to use(install) a old software in a new Oper ...

  5. 【git基本操作】总结

    "git fetch GitLab: Your account has been blocked.fatal: Could not read from remote repository. ...

  6. Java练习 SDUT-2272_Time

    Time Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description Digital clock use 4 digits to e ...

  7. 阿里云IPv6 DDoS防御被工信部认定为“网络安全技术应用试点示范项目”

    ​​近日,阿里云数据中心骨干网IPv6 DDoS网络安全防御被工业和信息化部认定为“网络安全技术应用试点示范项目”,本次评选由工业和信息部网络安全管理局发起,从实用性.创新性.先进性.可推广性等维度展 ...

  8. QQ 聊天机器人API

    QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称. 都说小Q妹妹聪明好学,我们能够教她说话.也能够请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. ...

  9. oracle函数 mod(x,y)

    [功能]返回x除以y的余数 [参数]x,y,数字型表达式 [返回]数字 [示例] select mod(23,8),mod(24,8) from dual; 返回:7,0

  10. 【Pandas】Pandas求某列字符串的长度,总结经验教训

    测试集大小: test.shape(898, 11) 对某列的字符串做统计长度1.for遍历法:start = time.time()for i in test.index.values: test. ...