Storm bolt不保证按顺序处理记录?

时间:2016-05-26 20:41:27

标签: hadoop streaming apache-kafka apache-storm

我有一个风暴拓扑,它从kafka读取记录,提取记录中的时间戳,并在hbase表上查找,应用业务逻辑,然后使用当前记录中的最新值更新hbase表!!

我编写了一个扩展BaseRichBolt的自定义hbase bolt,其中代码在hbase表上查找并对从kafka读取的消息应用一些业务逻辑,然后使用最新数据更新hbase表!

我看到的问题是,有时候,螺栓正在以混乱的顺序接收/处理记录,因为我的应用程序认为已经处理了特定记录,并忽略了记录!由于这个原因,应用程序没有处理大量的记录!!

例如:

假设从kafka读取了两条记录,一条记录属于第10小时,第二条记录属于第11小时......

我的自定义HBase螺栓,首先处理第11小时记录...然后读取/处理第10小时记录!!因为,首先处理第11小时记录,应用程序假定已经处理了第10条记录并且忽略了处理中的第10小时记录!!

有人请帮助我理解,为什么我的自定义hbase bolt没有按顺序处理记录?

我是否应该提及任何其他属性来确保,螺栓按照收到的顺序处理记录?有什么可能的替代方案我可以尝试解决这个问题?

仅供参考,我正在使用hbase bolt的字段分组,我想确保,特定用户的所有记录都进入相同的任务!不过要提一下,思考字段分组可能会导致问题,将自定义hbase bolt的no.of任务减少到1个任务,仍然是同样的问题!!

想知道为什么hbase bolt没有按照收到的顺序读取/处理记录!请有人帮我解决你的想法!!

非常感谢。

2 个答案:

答案 0 :(得分:0)

Kafka不提供多个partition的邮件订单。

所以当你阅读消息时没有订购。为避免这种情况,您需要使用单个分区创建kafka主题,但您将失去并行优势。

答案 1 :(得分:0)

Kafka保证按分区排序,而不是按主题排序。分区在卡夫卡真的有两个目的:

  1. 通过代理平衡数据和请求负载
  2. 它可以在消费者流程中分配处理,同时允许本地状态并保留分区内的订单。
  3. 对于给定的用例,您可能只关心#2。请考虑使用Partitioner作为Producer的一部分,使用ProducerConfig.PARTITIONER_CLASS_CONFIG。 .9中的默认Java Producer将尝试跨所有可用分区对消息进行分级。 https://github.com/apache/kafka/blob/6eacc0de303e4d29e083b89c1f53615c1dfa291e/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java

    您可以使用以下内容创建自己的内容:

    返回哈希(键)%num_partitions