storm
1.task是spout和bolt的实例对象,一个task就是一个spout或bolt对象,spout和bolt中的declareOutputFields方法是在,提交topology时,创建对象时调用的,open和prepare方法是在,分配任务excutor创建任务反序列化spout和bolt对象时调用
2,topology是由nimbus分配任务,由supervisor创建woker进程,worker创建excutor执行task,一个excutor可以执行多个task,一个excutor只执行一个component的一个或者多个task,一个task只会被同一个excutor执行,
excutor的数目小于等于task数目
3.task数目在整个topology运行的过程中是不能改变的,excutor可以通过rebalance storm来改变,task数目只是用来增加并行度时使用,例如,增加节点或增加进程和线程数目,task就会被分配到增加的节点或进程中,但是如果节点或者进程以及线程不变,
一个线程执行的任务,将会在本线程内,串行执行
4.ack机制
spout可以定义ack(),fail()方法,storm有一个acker bolt,对topology中的tuple进行跟踪,默认情况下由一个线程执行
spout在emit消息时,SpoutOutputCollector.ack()会向acker发送消息,并将生成的tuple id进行异或运算,结果一起发送给acker,acker接收消息开始跟踪,当Bolt处理tuple,emit(old tuple,new tuple)会将新的tuple关联到原始的tuple,ack()方法会通知acker(),并将接收到的tuple和生成的tuple id进行异或运算,结果发送给acker;
acker将spout发送的tuple信息异或的结果与Bolt发送的tuple信息异或的结果进行异或,如果为零,则tuple消息处理成功调用spout的ack(),不为零,则tuple消息处理失败,调用spout的fail()方法,这里的零是一个tuple经过的所有spout和bolt的异或结果,基础的spout ack,fail方法需要我们自己实现,storm是不会重发tuple,之所以说重发,
是因为storm提供spout方法让我们实现,例如kafkaSpout,可以重发tuple,是基于spout上实现了将消息重新放回队列,后面重新发送。
消息分发策略:
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)
Local or shuffle grouping:如果目标bolt有一个或者多个task在同一个工作进程中,tuple将会被随机发生给这些tasks。否则,和普通的Shuffle Grouping行为一致。

浙公网安备 33010602011771号