运行一个流式传输管道,其中我使用avroIO流式传输来自gcs的文件/记录,然后创建每分钟/每小时的存储桶来聚合事件并将其添加到BQ中。如果管道失败,我如何正确恢复并仅处理未处理的事件?我不想重复计算事件。我认为一种方法是写入扳手或bigtable,但可能是写入BQ成功,但DB失败,反之亦然?如何在流式管道中以可靠一致的方式维护状态,以便仅处理未处理的事件?我想确保BQ中的最终聚合数据是不同事件的确切计数,而不是计数不足或计数过多?spark streaming pipeline如何解决这个问题(我知道他们有一些检查点目录来管理查询和数据帧的状态)?有什么推荐的技术可以准确地解决流水线中的这类问题吗?
发布于 2018-01-24 07:51:02
根据评论中的澄清,这个问题可以归结为“假设两次连续运行的流作业都是从头开始的,我们能否在两次连续运行中实现只有一次的语义?”简短的回答是否定的。即使用户愿意将某些状态存储在外部存储中,它也需要与流引擎内部状态原子/一致地提交。像Dataflow,Flink这样的流媒体引擎在内部存储所需的状态,这是‘恢复’作业所必需的。使用Flink,您可以从最新的保存点恢复,使用数据流,您可以'update‘一个正在运行的管道(请注意,即使出现错误,数据流实际上也不会终止您的作业,您需要显式取消一个作业)。数据流使用update提供只有一次的处理保证。
如果仔细使用外部存储,一些宽松的保证将是可行的。细节实际上取决于具体的目标(通常不值得额外的复杂性)。
https://stackoverflow.com/questions/48336904
复制相似问题