您的位置:首页 > 编程语言

Storm 编程模型 核心组件 Stream Grouping 数据分组策略

2017-11-12 18:23 627 查看
官网: http://storm.apache.org/

Apache Storm是一个免费的开源分布式实时计算系统。Storm可以很容易地可靠地处理无限的数据流,从而实时处理Hadoop为批处理所做的事情。Storm很简单,可以和任何编程语言一起使用

Storm编程模型



其中Spout 一条一条从数据源获取外部数据

Spout 在内部发送Tuple给Bolt ; Bolt 根据业务进行处理

Bolt 可以发送Tuple给另一个Bolt 进行业务处理

Bolt 可以多线程处理同一个业务步骤(Bolt可以有多个处理同一个业务)

Bolt 最后将结果保存到数据库(redis?)

Bolt 可以接受多个Spout 发送过来的数据(一个Storm 程序可以获取多个数据源)

类似在Hadoop中 以上过程叫MapReduce

在Storm 中 叫 Topology(拓扑)

*   Topology:Storm中运行的一个实时应用程序的名称。(拓扑)
*   Spout:在一个topology中获取源数据流的组件。
通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。
*   Bolt:接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作。
*   Tuple:一次消息传递的基本单元,理解为一组消息就是一个Tuple。
*   Stream:表示数据的流向。


Storm核心组件



Supervisor中有多个Worker,每个Worker中运行着Spout任务或Bolt任务。

- Nimbus:负责资源分配和任务调度。

- Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。—通过配置文件设置当前supervisor上启动多少个worker。

- Worker:运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。

- Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,不同spout/bolt的task可能会共享一个物理线程,该线程称为executor。

Stream Grouping 数据分组策略

hadoop 中 默认实现 HashGrouping(hashCode%num)

Storm里面有7种主要类型的stream grouping

Shuffle Group
4000
ing
: 随机分组, 随机派发stream里面的tuple,保证每个bolt接收到的tuple数目大致相同。(random.nexInt(2))

Fields Grouping:按字段分组,比如按userid来分组,具有同样userid的tuple会被分到相同的Bolts里的一个task,而不同的userid则会被分配到不同的bolts里的task。(hashcode%num)

All Grouping:广播发送,对于每一个tuple,所有的bolts都会收到。

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

Non Grouping:不分组,这stream grouping个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。

Direct Grouping: 直接分组, 这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。只有被声明为Direct Stream的消息流可以声明这种分组方法。而且这种消息tuple必须使用emitDirect方法来发射。消息处理者可以通过TopologyContext来获取处理它的消息的task的id (OutputCollector.emit方法也会返回task的id)。

Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。(先发本地,避免网络传输)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: