我有一个风暴拓扑,它从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没有按照收到的顺序读取/处理记录!请有人帮我解决你的想法!!
非常感谢。
答案 0 :(得分:0)
Kafka不提供多个partition的邮件订单。
所以当你阅读消息时没有订购。为避免这种情况,您需要使用单个分区创建kafka主题,但您将失去并行优势。
答案 1 :(得分:0)
Kafka保证按分区排序,而不是按主题排序。分区在卡夫卡真的有两个目的:
对于给定的用例,您可能只关心#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