风暴批次后向卡夫卡提交抵消

时间:2016-11-03 15:07:12

标签: apache-kafka apache-storm streamparse

当批量螺栓完成处理批次时,提交每个分区的最高偏移量的正确方法是什么?我主要担心的是当整个shebang将要运行时,机器在处理批次时死亡在AWS spot实例中。

我是风暴发展的新手我似乎无法找到IMO的答案是kafka和风暴的相当直接的用法。

情境:

基于Guaranteeing Message Processing guide,假设我有一个("word",count)元组的蒸汽(kafka主题),处理X tupples的批处理螺栓,进行一些聚合并创建CSV文件,将文件上传到hdfs / db和acks。

在非strom“天真”的实现中,我会读取X msgs(或读取Y秒),聚合,写入hdfs,一旦上传完成,将每个分区的最新(最高)偏移量提交给kafka。如果机器或进程在db提交之前死掉 - 下一次迭代将从前一个地方开始。

在暴风雨中我可以创建批处理螺栓,它将锚定所有批处理元组并立即执行它们,但是我找不到将每个分区的最高偏移量提交到kafka的方法,因为spout不知道批处理,所以一旦批量螺栓响应了tupples,每个spout实例都会一个接一个地响应他的tupples,所以我就像我看到它一样:

  1. 在spout上的每个ack上提交已确认消息的偏移量。这将导致许多提交(每批可能是几千个tupples),可能是乱序,如果在提交偏移时喷口工作已经死亡,我将最终部分重放一些事件。
  2. 与1.相同但我可以在提交的最高偏移量中添加一些本地偏移量管理(修复无序偏移提交)并提交每隔几秒钟看到的高位偏移(减少大量提交)但我仍然可以结束如果喷口死亡,部分提交的补偿
  3. 将偏移子目标逻辑移动到螺栓 - 我可以将每个消息的分区和偏移量添加到发送到批处理螺栓的数据中,并将每个分区的最高处理偏移量作为批处理的一部分提交(发送到“偏移提交者”螺栓在批次结束时)。这将解决偏移跟踪,多次提交和空间重播问题,但这会为螺栓添加kafka特定逻辑,从而将螺栓代码与kafka复制,一般而言,在我看来,它是重新发明轮子。
  4. 进一步推进车轮改造,并在ZK中手动管理最高处理的修补偏移组合,并在启动喷口时读取此值。

1 个答案:

答案 0 :(得分:0)

您的问题有很多,所以不确定这是否完全解决了它,但是如果您担心发送到 kafka 的确认数量(例如在每条消息之后),您应该能够为消耗,例如 1000 以减少很多。