我有一个 Storm 拓扑,该拓扑从kafka读取记录,提取记录中存在的时间戳,并在hbase表上进行查找,应用业务逻辑,然后使用当前记录中的最新值更新hbase表!
我编写了一个扩展BaseRichBolt的自定义hbase bolt ,其中的代码在hbase表上进行了查找,并对从kafka读取的消息应用了一些业务逻辑,然后使用最新数据更新了hbase表!
我看到的问题是,有时候, bolt 正在以混乱的顺序接收/处理记录,由于该原因,我的应用程序认为特定的记录已被处理,而忽略了记录!!!因此,应用程序未处理大量记录!!
例如:
假设从卡夫卡读取了两条记录,一条记录属于第10小时,第二条记录属于第11小时...
我自定义的HBase bolt ,首先处理11小时的记录……然后再读取/处理10小时的记录!!因为,第11小时记录首先被处理,所以应用程序假设第10小时记录已被处理,而忽略了第10小时记录的处理!
有人可以帮助我理解为什么我的自定义hbase bolt 未按接收顺序处理记录吗?
我是否必须提及任何其他属性以确保 bolt 按接收到的顺序处理记录?我可以尝试解决此问题的替代方法有哪些?
仅供引用,我正在为hbase bolt 使用字段分组,直到我要确保,特定用户的所有记录都进入同一任务!值得一提的是,思考 Realm 分组可能会导致问题,将我的自定义hbase bolt 的任务数量减少到1个任务,仍然是同样的问题!
想知道为什么hbase bolt不按接收顺序读取/处理记录!请有人帮我与您的想法!
非常感谢。
最佳答案
Kafka不提供多个partition中的消息顺序。
因此,当您阅读消息时没有排序。为了避免这种情况,您需要使用单个分区创建kafka主题,但是您将失去并行性的优势。
关于hadoop - Storm bolt 不能保证按接收顺序处理记录吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37470595/