【问题标题】:Storm bolt doesn't guarantee to process the records in order they receive?Storm bolt 不保证按收到的顺序处理记录?
【发布时间】:2016-09-25 00:47:22
【问题描述】:

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

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

我看到的问题是,有时,bolt 以混乱的顺序接收/处理记录,因此我的应用程序认为某个特定记录已被处理,而忽略了该记录!!!由于这个原因,应用程序没有处理大量记录!

例如:

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

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

有人可以帮我理解,为什么我的自定义 hbase bolt 没有按接收顺序处理记录吗?

我是否必须提及任何其他属性以确保螺栓按其收到的顺序处理记录?我可以尝试解决什么可能的替代方案?

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

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

非常感谢。

【问题讨论】:

    标签: hadoop streaming apache-kafka apache-storm


    【解决方案1】:

    Kafka 不提供多个partition 中的消息顺序。

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

    【讨论】:

    • 感谢@f1sherox 的回复。我想知道,storm保证bolt会按照他们到达bolt的顺序处理队列中的记录吗?
    【解决方案2】:

    Kafka 保证按分区而不是按主题排序。在 Kafka 中,分区确实有两个目的:

    1. 它通过代理平衡数据和请求负载
    2. 它用作在消费者进程之间划分处理的一种方式,同时允许本地状态并保留分区内的顺序。

    对于给定的用例,您可能只关心 #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

    您可以使用以下方式创建自己的:

    返回哈希(key)%num_partitions

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 2019-03-02
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      相关资源
      最近更新 更多