Storm 0.9.0中trident的Spout接口变化

来源:互联网 发布:nginx 负载均衡 编辑:程序博客网 时间:2024/05/18 03:39

在Storm 0.9.0中trident的Spout接口稍有变动,以IPartitionedTridentSpout为例,在0.9.0之前是IPartitionedTridentSpout< T >,之后变成IPartitionedTridentSpout< Partitions, Partition extends ISpoutPartition, T >

T是序列化到ZK中用于中间状态存储的,通常用来存储消息偏移量等信息。
0.9.0之后在泛型中新增加了Partitions和Partition。在0.9.0之前,消息队列的分区直接用int类型表示,通过numPartitions方法获得分区总数N后,分区从0开始递增一直到N-1。

0.9.0之后将分区进行了包装。之前用int表示的分区现在换成用实现ISpoutPartition接口的类表示,之前numPartitions方法返回一个long类型告诉系统分区数,现在numPartitions方法换成了getPartitionsForBatch方法,返回一个自定义类型,对分区数进行抽象,实现更灵活的功能,不过我在使用中还是直接用Long类型。

简单概括总体流程就是:

trident在执行时每批先调用 Partitions getPartitionsForBatch()
如果发现返回的Partitions对象和上一批的不相等(应该是调用equals判断是否相等),则会先后调用 ListgetOrderedPartitions(Integer allPartitionInfo) 和 void refreshPartitions(List partitionResponsibilities) 方法,否则不会调用这两个方法。getOrderedPartitions根据getPartitionsForBatch返回的Partitions对象生成一个Partition列表,refreshPartitions根据getOrderedPartitions返回的Partition列表做一些类似于connections to brokers的操作。之后再调用emitPartitionBatchNew或者emitPartitionBatch方法。其中emitPartitionBatchNew的partition参数在0.9.0之前是int类型的,现在改成Partition类型,就是getOrderedPartitions返回的List中的一个元素。

其他方法和之前版本都一致,不再赘述。

另外需要注意的是0.9.0版本将log4j全部替换成了slf4j,如果自己的工程中使用了log4j,会存在slf4j与log4j的冲突,需要处理掉这些冲突。

0 0
原创粉丝点击