1、简要介绍Storm。
Strom是分布式的实时计算系统,处理速度很快,可以达到毫秒级别,处理数据是一条一条的处理。组成是由一个个topology(拓扑)组成,一个拓扑可以包含多个spout和多个blot。
spout只负责接收数据,将数据转换为Tuple(元组)流到blot;
blot可以将spout流过来的数据进行处理,处理后的数据转换Tuple可以继续流向下一个blot或打印到控制台或存入数据库。
2、Strom的四个并发级别
1)Node – 服务器级别
属于Strom集群的一份子,执行topology的部分运算;
2)Worker – 进程级别
属于Node中的一份子,指的是Node中的JVM进程;
3)Executor – 线程级别
属于Worker的一份子,指的是Worker中的一个Java线程;
4)Task – 任务
默认情况下一个Executor有一个Task,是spout和blot的实例。
3、Strom的并发控制
默认的并发:一个topology会被分配到一个Node的Worker中,一个Worker中可能运行多个executor,一个executor负责一个task。
修改并发数(以下number是对应运行的数量):
Worker:通过API或配置文件修改,config.setNameWorker(number);
Executor:builder.setSpout(spout_id,number)或builder.setBlot(blot_id,number);
Task:builder.setSpout(…).setNumTask(number);
4、在Blot之间数据流分组方式
ShuffleGrouping(随机分组):随机分发数据流中的tuple到各个Blot;
FiledsGrouping(按字段分组):根据指定的字段进行分组,保证相同的字段分配到同一个Blot;
GlobalGrouping(全局分组):将同一个topology下的且在该Blot之前的所有Blot的数据流Tuple汇总起来,(实际生产环境下少用,避免服务器崩溃);
AllGrouping(全复制分组):所有的Tuple复制后分发到后续Blot的所有的Blot;
DirectGrouping(指向性分组):只能流向指定的Blot;
LocalOrShuffleGrouping(本地或随机分组):优先分发到同一个Worker的下一个Blot,否则,随机分发到Blot。
5、Strom的可靠性保证
(关于可靠性保证可参考本人博客:理解分布式数据处理的三个级别)
1)至多一次:默认情况下,Strom是此级别的可靠性保证。在网络不稳定的情况下,可能造成数据丢失;
2)至少一次:在Strom中,提供了ack-fail机制来实现至少一次,保证数据一定到达,可能会有多条相同的数据。成功结束调用ack()方法,失败调用fail()方法;
3)恰好一次(了解):借助于API – TransactionTopology来实现。
6、Strom的集群介绍
Strom集群遵从主/从结构。由一个主节点(nimbus)和一个或多个(supervisor)组成。借助于ZooKeeper进行协调服务。
1)nimbus:一个守护进程,管理、协调和监控在集群上运行的topology,主要任务包括topology的发布,任务的指派,事件处理失败后重新指派任务。
半容错机制:nimbus守护进程在topology运行时宕机,但分配的supervisor和worker正常运行,topology还会一直处理数据,这就是半容错机制。
2)supervisor:一个守护进程,等待nimbus分配任务后生成并监控worker执行任务。当worker异常退出后,尝试重新生成worker进程。