0

运行流束管道,我使用 avroIO 从 gcs 流式传输文件/记录,然后创建每分钟/每小时桶以聚合事件并将其添加到 BQ。如果管道失败,我如何才能正确恢复并仅处理未处理的事件?我不想重复计算事件。我想的一种方法是写入扳手或大表,但可能是写入 BQ 成功但数据库失败,反之亦然?如何在流式管道中以可靠一致的方式保持状态以仅处理未处理的事件?我想确保 BQ 中的最终汇总数据是不同事件的准确计数,而不是计数不足或过度计数?火花流管道如何解决这个问题(我知道他们有一些检查点目录来管理查询和数据帧的状态)?是否有任何推荐的技术可以准确地解决流管道中的此类问题?

4

1 回答 1

0

根据评论的澄清,这个问题归结为“假设两次运行都是从头开始,我们能否在流作业的两次连续运行中实现恰好一次的语义?”。简短的回答是否定的。即使用户愿意在外部存储中存储一些状态,它也需要以原子方式/与流引擎内部状态一致地提交。Dataflow、Flink 等流引擎在内部存储所需的状态,这是“恢复”作业所必需的。使用 Flink,您可以从最新的保存点恢复,使用 Dataflow,您可以“更新”正在运行的管道(请注意,即使出现错误,Dataflow 实际上也不会终止您的作业,您需要明确取消作业)。Dataflow 确实通过更新提供了一次性处理保证。

通过谨慎使用外部存储,一些宽松的保证是可行的。细节真的取决于具体的目标(通常不值得额外的复杂性)。

于 2018-01-23T23:51:01.523 回答