storm 随笔

一:

继承BaseBasicBolt的bolt 在使用emit方法的时候,会自动调用ack()

但是继承BaseRichBolt 需要手动调用ack

二:

Trident persistentAggregate()聚合方法的执行

persistentAggregate(StateFactory stateFactory, Fields inputFields, CombinerAggregator agg, Fields functionFields)

stateFactory数据聚合后储存的位置 ,自定义储存 实现IBackingMap接口,实现方法multiGet(),multiPut()

 public List<List<Object>> multiGet(List<List<Object>> keys)

 将之前聚合数据的结果取出(可以从redis,数据库。。。)  List<Object>为之前分组的字段,seize和分组字段的数量一致,List<List<Object>>size以分组字段分组的数量,也就是分了多少个组

返回值:将每个分组的结果取出 然后返回  然后下一批数据进行聚合时候 agg()方法会调用返回值,在返回值的基础上进行新的聚合

 void multiPut(List<List<Object>> keys, List<T> vals)

将聚合完成的数据更新(更新到redis,数据库。。。),keys与上面的key含义相同,vals为agg()聚合完成的结果

三:

当我们使用aggregate计算global aggregation时,如果通过parallelismHint设置了并发数为n,trident的做法是通过轮循的方式让不同的批次依次在n个partition中执行,实际上还是在串行执行,意义不大。因此使用aggregate做global aggregation时,并不能实现并发的功能,只适用于数据量不大的场景,这时候最好把并发设成1,否则对资源是一种浪费。

CombinerAggregator<T> 聚合方法是先在局部bolt聚合,然后通过网络传输到第二个bolt汇总,此时使用aggregate并给并行度时,在局部会开启并行度。

四:底层队列,消息ack和fail的原理

storm底层的队列 ZeroMQ ,保证消息能快速被处理。依靠消息队列,来完成消息的ack以及fail

一个消息只会由发送它的那个 spout 任务来调用 ack 或fail。如果系统中某个 spout 由多个任务运行,消息也只会由创建它的 spout 任务来应答(ack 或 fail),决不会由其他的 spout 任务来应答。在给发送的消息标记messageId时,只能在spout中标记。

当 KestrelSpout 从 kestrel 队列中读取一个消息,表示它“打开”了队列中某个消息。这意味着,此消息并未从队列中真正的删除,而是将此消息设置为“pending”状态,它等待来自客户端的应答,被应答以后,此消息才会被真正的从队列中删除。处于“pending”状态的消息不会被其他的客户端看到。另外,如果一个客户端意外的断开连接,则由此客户端“打开”的所有消息都会被重新加入到队列中。当消息被“打开”的时候,kestrel 队列同时会为这个消息提供一个唯一的标识。KestrelSpout 就 是 使 用 这 个 唯 一 的 标 识 作 为 这 个 tuple 的messageID 的。稍后当 ack 或 fail 被调用的时候,KestrelSpout 会把 ack 或者 fail 连同 messageID 一起发送给 kestrel 队列,kestrel会将消息从队列中真正删除或者将它重新放回队列中。

五:失败

1、任务级失败

 bolt 任务失败。此时,acker 中所有与此 bolt 任务关联的消息都会因为超时而失败,对应 spout 的 fail 方法将被调用。

 acker 任务失败。如果 acker 任务本身失败了,它在失败之前持有的所有消息都将会因为超时而失败。Spout 的 fail 方法将被调用。

 Spout 任务失败。这种情况下,Spout 任务对接的外部设备(如MQ)负责消息的完整性。例如当客户端异常的情况下,kestrel队列会将处于 pending 状态的所有的消息重新放回到队列中。其他的 spout 数据源,可能需要我们自行维护这个消息的完整性。

2、任务槽(slot) 故障

 worker 失败。每个 worker 中包含数个 bolt(或 spout)任务。supervisor 负责监控这些任务,当 worker 失败后,supervisor会尝试在本机重启它。

  supervisor 失败。supervisor 是无状态的,因此 supervisor 的失败不会影响当前正在运行的任务,只要及时的将它重新启动即可。supervisor 不是自举的,需要外部监控来及时重启。

nimbus 失败。nimbus 是无状态的,因此 nimbus 的失败不会影响当前正在运行的任务(nimbus 失败时,无法提交新的任务),只要及时的将它重新启动即可。nimbus 不是自举的,需要外部监控来及时重启。

3、集群节点(机器)故障 、集群节点(机器)故障 、集群节点(机器)故障 、集群节点(机器)故障

 storm 集群中的节点故障。此时 nimbus 会将此机器上所有正在运行的任务转移到其他可用的机器上运行。

 zookeeper 集群中的节点故障。zookeeper 保证少于半数的机器宕机仍可正常运行,及时修复故障机器即可。








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值