初识Storm

408 阅读3分钟

Storm的一些基本概念

  1. Topology:数据流串连起来多个计算单元的执行图
  2. Tuple:数据传输的形式
  3. Stream:两个计算单元(节点)之间的Tuples无界序列
  4. Spout:从数据源获取数据,不处理数据
  5. Bolt:对数据进行转换或者计算
  6. Parallism hit:设置创建Spout或者Bolt实例的线程数
  7. Exetutors:JVM的一个线程,他能在运行时做改变,以应对数据增长,比如增长 到与tasks数量一致
  8. Tasks:在一个executor里面的Spouts或者Bolts实例,运行时不好改变,比如 fields grouping,hash的bolts数量变了,无法找到之前的bolt
  9. Anchoring:把当前节点的tuple锚定到输入的tuple树上去,手动emit需要加上 tuple一起
  10. Ack:事件被成功处理,outputCollector标记,Spout发现tuple被完全处理 了,会调用这个方法
  11. Fail:分不同的情况标记tuple处理失败,会重新从Spout再走一遍流程,Spout 在fail的情况会调用这个方法
  12. worker:每一个worker process是一个JVM
  13. worker Node:一个worker Node有多个worker,他是一个物理机或者是虚拟 机器
  14. master:有且仅有一个;Nimbus:master节点运行的后台,他发现一个worker node挂掉的时候,会自动重启它;Supervisor:worker node运行的后台,与Nimbus通信通过Zookeeper

Storm的Grouping策略

  • Stream Grouping:数据如何在多个Spout实例和多个Bolt实例之间传送
  • shuffle grouping:每个bolt实例之间收到的tuple数量基本是一致的
  • fields grouping:同一个值的字段会被送到同一个bolt实例
  • global grouping:整个流的tuple都会进入同一个bolt实例【相当于只有1 个实例的shuffle grouping】

Storm的一些方法基本用途

  • BaseRichSpout:
 	declareOutputFields:定义传送tuple中值的名字  
	open:连接数据源,获取数据  
	nextTuple:当storm已经练接好数据源,它来发送数据到下游  
	SpoutOutputCollector:发送tuple,处理失败的tuple  
  • BaseBasicBolt:自动锚定并ack,适用于单个tuple进来,单个tuple出去
	exetute:处理上游tuple,并发送tuple到下游,一个bolt的实例,它的	
		execute方法每次只处理一个tuple  
	prepare:初始化时候用  
	BasicOutputCollector:发送tuple,处理失败的tuple  
  • TopologyBuilder:定义Spout与Bolt之间的关系,以及流分组的方式
  • Config:做拓扑级别的配置
  • StormTopology:TopologyBuilder的产物,并提交到集群
  • TickTuple:bolt级别设置定时触发器,首先在config中设置Tick触发时机,然后 通过tuple的streamId判断是否是是Ticktuple.触发的频率storm会努力做 到预设值一致

Storm的重试

  1. 至多一次处理
    tuple处理成功就成功,失败就失败,不做任何处理,即不保证可用。spout不传tuple就可以了
  2. 至少一次处理
    每个tuple必须处理成功至少一次,需要保证在spout,数据源,流锚定,tuple被ack或者fail
  3. 只处理一次
    每个tuple一单被处理成功,不能再次被处理。需要考虑:A 处理的任务是单元化的,B记录单元化任务处理的结果。同时A,B两步操作必须是原子操作。在处理单元任务,如果单元任务非幂等,那么再次重做相当于至多处理了一次【场景1】,所以单元任务处理必须得保证是幂等的。

BaseBasicBolt和BaseRichBolt的一些差异

  • baseBasicBolt:自动锚定。
    锚定的时机:执行emit方法的那一刻;
    ack:execute方法执行结束;
    fail:execute执行过程中出现任何问题;
  • baseRichBolt: 需要编码实现锚定ack和fail 。
    锚定操作:emit的时候添加tuple -> emit(tuple,new Values(..));
    ack:使用outputcollector.ack(tuple);
    fail:要重发需要自己发送保存好的数据

Storm中各个节点之间的关系

附录

本文来自<Storm实战>。推荐。这本书可以基本理解storm。