Storm技术总结
1.storm基本原语
spout : 消息源,不停的发送消息到集群中,我们主要的代码实现。
bolt : 消息处理节点,可以过滤,集合等,我们主要的代码实现。
topology : 整体的分布式计算结构,由多个spout和多个bolt组成。
tuple : 一次消息传递的基本单元,消息都封装为tuple,通过spout发送的集群。
整体数据流向为从固定数据源读取数据(比如kafka, rocketMQ等),数据封装为tuple,通过spout不停的发送消息,bolt对接收到的消息做处理,处理完成以后再丢给下个bolt处理,直到整个流程处理完成。storm只是提供一个计算的框架,真正的计算逻辑还是需要自己来写,当然storm本身也提供一些计算,聚合的类。
2.storm集群核心组件
Nimbus主节点:storm的守护进程,管理集群中的节点,分配任务和监测故障。
Supervisor工作节点:storm守护进程,管理worker来执行 spout/bolt task。
Zookeeper:Supervisor和Nimbus之间协调的服务。
Worker : 一个JVM,JVM里面会有多条spout,bolt线程在执行。一个supervisor可以有多个workers。
Task:spout/bolt线程
通过下面这个图,我们来简单的理解下整个集群是怎么工作的。
1.首先我们建立storm集群由一个主节点nimbus,多个supervisor组成
2.上传topology到nimbus,每个supervisor都会得到这个topology。到这一步整个集群搭建完成,等待数据进来。
3.在数据进来之前,worker,spout,bolt都已经初始化完成,一个supervisor中有多少个worker,一个worker里面有多少个spout线程,多少个bolt线程都是可配置的。
4.数据进来后,就通过spout不断的发送数据到bolt,bolt处理完成后就到下一个bolt,直到处理完成为止。
3.storm集群的并发性
我们可以通过下面的方式来提高整个storm的并发行,从而提高storm集群的效率。
1.线程级 —— 增加spout和bolt的线程执行数量。
2.worker级 —— 增加一个执行节点的worker数量。
3.supervisor级 —— 增加执行节点。
4.数据流分组
storm集群由多个spout的task,多个bolt的task,数据通过spout发送到哪一个bolt的task,bolt处理完成的数据发送下面哪一个bolt就是数据流分组。
数据通过spout发送到bolt的方式,bolt发送到下一个bolt的方式就是数据分组。下面是8中分组方式,在不同的情景下使用不同的分组方式。
1.shuffleGrouping(随机分组)
2.fieldsGrouping(按照字段分组,在这里即是同一个单词只能发送给一个Bolt)
3.allGrouping(广播发送,即每一个Tuple,每一个Bolt都会收到)
4.globalGrouping(全局分组,将Tuple分配到task id值最低的task里面)
5.noneGrouping(随机分派)
6.directGrouping(直接分组,指定Tuple与Bolt的对应发送关系)
7.Local or shuffle Grouping
8.customGrouping (自定义的Grouping)
5.storm容错机制
1.集群节点宕机
Worker —— Supervisor会重新启动这个进程。如果启动过程中仍然一直失败,并且无法向Nimbus发送心跳,Nimbus会将该Worker重新
Nimbus服务器 —— 因为是单节点可以添加报警,但并不会影响supervisor的执行。
Supervisor服务器 —— 该节点上所有Task任务都会超时,Nimbus会将这些Task任务重新分配到其他服务器上运行。 2.进程挂掉分配到其他服务器上。
3.消息的完整性
spout和bolt处理的时候都有成功失败的反馈,如果失败spout会重新发送tuple。storm自己无法解决消息重复发送的问题。
6.storm相对于hadoop的优势。
实时性,hadoop会先录入数据到HDFS中。
7.storm常见问题
1.storm数据存放在哪里 —— storm不保存数据,数据的保存依赖我们自己来做。
2.容错机制导致重复处理的问题 —— 自己解决,下面三种方式可参考:
(1)不处理,这也算是种策略。因为实时计算通常并不要求很高的精确度,后续的批处理计算会更正实时计算的误差。
(2)使用第三方集中存储来过滤,比如利用mysql,memcached或者redis根据逻辑主键来去重。
(3)使用bloom filter做过滤,简单高效。
3.nimbus单节点的容错性怎么保证 —— 不保证,因为短时间类不会影响Supervisor节点的正常运行,不过最好加上报警,nimbus出问题后及时处理。
8.我的项目是怎么使用storm。
storm本身对于计算,聚合函数并没有太多的支持,计算部分我们依赖于复杂事件处理引擎esper来进行数据的过滤和计算。