码迷,mamicode.com
首页 > 其他好文 > 详细

Storm的并发概念

时间:2015-07-31 21:54:02      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:

在Spouts和bolts中出现了 Executors 执行器和Tasks 任务的概念
 
在Toplogy 中有个workers,Toplogy运行在workers上面,Workers 上面一般指进程数
 
 
Storm集群中的一台机器 可以运行一个或多个workers process,
workers大小可以设置和toplogy无关.一个workers上面可以运行多个toplogy
workers process是进程的概念,一个workers可以执行特定toplogy上的Executors。

一个或者多个Executors可以运行在一个或者多个work进程中,每一个excutors是一个线程
每一个excutors可以跑一个或者多个Task,
Task就是真正做数据处理的,(类似于MR中自定义的mp和rd,是真正干活的)
 
workers是和storm集群配置有关的,在toplogy运行之前已经存在
spout和bolt统称为component。
 技术分享
技术分享
 
 
 
 
在Storm中分为 进程层级,excutors线程层级,一个为Task层级。
 
 
层级关系。
下图所示:
一个Toplogy中运行在两个worker Process进程上面。
简单可以把work进程理解为storm集群中的每一个supervisor。一个supervision就是一个worker Process进程。
 
两个workers 进程运行本质上是执行Spouts和bolts。
component(Spouts和bolts),在执行的时候可以分线程执行,每一个线程称为excutors。
 
excutors内部跑task任务。
 
下图所示
绿:
蓝 :
spout组件,在运行的时候表现为task,在执行task的时候真正执行了spout的内容。
下图中每一个workers上面跑一个spout。
 
--------------------------
在一个work进程中跑5个excutors线程。每一个线程上面跑的是数量不等的task。这就是程序的并发。
 
技术分享
技术分享
 
 
 
设置Storm的并发度:

Config conf = new Config();

conf.setNumWorkers(2); // 使用两个进程

 

topologyBuilder.setSpout("blue-spout", new BlueSpout(), 2); //设置两个excutors线程

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) //设置两个excutors线程

               .setNumTasks(4)    //设置task任务4个

               .shuffleGrouping("blue-spout");

 

topologyBuilder.setBolt("yellow-bolt", new YellowBolt(), 6)//设置6个excutors线程

               .shuffleGrouping("green-bolt");//默认1个task

 

StormSubmitter.submitTopology(

        "mytopology",

        conf,

        topologyBuilder.createTopology()

    );

 
设置work,excutors,Task有什么影响吗?
work为分布式的并行,在每一个work又会起很多excutors线程
线程回去跑component,多线程要注意并发,
excutors为什么有task呢?主要是为了明确职责,task只负责运行。
excutors做为管理者的角色,真正执行的为task。
excutors中的task 只读取自己的数据,处理的数据不一样。多个task处理完就是完整的数据。
 
 
 
 
Stream grouping分类
 
技术分享Shuffle Grouping: 随机分组, 随机派发stream里面的tuple, 保证每个bolt接收到的tuple数目相同. 负载均衡
技术分享Fields Grouping:按字段分组, 比如按userid来分组, 具有同样userid的tuple会被分到相同的Bolts, 而不同的userid则会被分配到不同的Bolts. 
技术分享All Grouping: 广播发送, 对于每一个tuple, 所有的Bolts都会收到.
技术分享Global Grouping: 全局分组,这个tuple被分配到storm中的一个bolt的其中一个task.再具体一点就是分配给id值最低的那个task.
技术分享Non Grouping: 不分组,意思是说stream不关心到底谁会收到它的tuple.目前他和Shuffle grouping是一样的效果,有点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程去执行.
技术分享Direct Grouping: 直接分组,这是一种比较特别的分组方法,用这种分组意味着消息的发送者举鼎由消息接收者的哪个task处理这个消息.只有被声明为Direct Stream的消息流可以声明这种分组方法.而且这种消息tuple必须使用emitDirect方法来发射.消息处理者可以通过TopologyContext来或者处理它的消息的taskid (OutputCollector.emit方法也会返回taskid)
 

 
 
 
 
 
 

Storm的并发概念

标签:

原文地址:http://www.cnblogs.com/thinkpad/p/4693144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!