运行流式光束管道,我使用avroIO从gcs流式传输文件/记录,然后创建每小时/每小时的桶来聚合事件并将其添加到BQ。如果管道出现故障,我怎样才能正确恢复并仅处理未处理的事件?我不想重复计算事件。 我想的一种方法是写入扳手或bigtable,但可能是BQ写入成功但DB失败,反之亦然? 如何在流管道中以可靠一致的方式维护状态以仅处理未处理的事件? 我想确保BQ中的最终聚合数据是不同事件的确切计数,而不是计数不足或过多? 火花流传输管道如何解决这个问题(我知道它们有一些用于管理查询和数据帧状态的检查点目录)? 是否有任何推荐的技术可以准确地解决流媒体管道中的这类问题?
答案 0 :(得分:0)
根据评论的澄清,这个问题归结为“如果两个连续运行的流程都是从头开始的话,我们能否在两次连续的流式传输作业中实现一次性语义?”。简短的回答是否定的。即使用户愿意将某些状态存储在外部存储中,也需要以流媒体内部状态原子/一致地提交。像Dataflow这样的流引擎,Flink在内部存储所需的状态,这是“恢复”工作所需的。使用Flink,您可以从最新的保存点恢复,使用Dataflow,您可以“update”正在运行的管道(请注意,即使出现错误,Dataflow也不会真正中断您的作业,您需要明确取消作业)。 Dataflow确实提供了一次性处理保证和更新。
通过谨慎使用外部存储,一些放松保证是可行的。细节实际上取决于具体目标(通常不值得额外的复杂性)。