Cloud Dataflow 故障恢复
Cloud Dataflow failure recovery
我想使用 Google Cloud Dataflow 创建会话 windows,如 dataflow model paper 中所述。我想将未绑定的数据发送到 Pub/Sub,然后以流方式在 Cloud Dataflow 中读取它。我想使用超时时间较长(30 分钟到 120 分钟)的会话 windows。
我的问题是:
1) 如果数据流进程失败会怎样?
2) 我会丢失存储在 windows 中但尚未超时的所有数据吗?
3) Dataflow 提供了哪些恢复机制?
示例:
假设我有一个超时为 30 分钟的会话 window,它会触发每分钟的处理时间并累积。假设该值是一个整数,我只是将 window 中的所有值相加。假设这些键值对来自 Pub/Sub:
7 -> 10 (at time 0 seconds)
7 -> 20 (at time 30 seconds)
7 -> 50 (at time 65 seconds)
7 -> 60 (at time 75 seconds)
我想在 60 秒时 window 会触发并产生一对 7 -> 30
。我还假设在 120 秒时 window 会再次触发,并且会产生一个 7 -> 140
对,因为它会触发累积。
我的问题是如果在时间 70 数据流失败会发生什么?我想在第 70 秒之前收到的 3 条消息已经被确认到 Pub/Sub,所以它们不会被重新传送。
当 Dataflow 重新启动时,它会以某种方式使用密钥 7 恢复 window 的状态,以便在时间 120 秒时它可以生成一个 7 -> 140
对,或者它只会生成一个 7 -> 60
对?
还有一个相关问题 - 如果我取消数据流作业并开始一个新作业,我想新作业不会有上一个作业的状态。有没有办法将状态转移到新工作?
Cloud Dataflow 透明地处理故障。例如。它只会在 Cloud Pubsub 中处理 "ack" 消息并持久提交结果后。如果 Dataflow 进程失败(我假设您指的是工作 JVM 崩溃,然后自动重启,而不是整个作业完全失败) ,在重新启动时它将再次连接到 Pubsub,并且所有未确认的消息将被重新传递和重新处理,包括分组到 windows 等。 Window 状态也会在失败时持久保留,因此在这种情况下它应该产生 7 -> 140
.
如果您对这种持久性的实现感兴趣,请参阅 Millwheel paper - 它早于 Dataflow,但 Dataflow 在流式运行器中使用相同的持久层。
Dataflow 中没有面向用户的恢复机制,因为编程模型将您与处理故障的必要性隔离开来,而运行器负责所有必要的恢复;失败可见的唯一方法是通过记录可以多次处理的事实,即如果您在 DoFn 中执行任何副作用,这些副作用必须是幂等的。
目前,作业之间发生状态转移的唯一情况是在 pipeline update operation。
我想使用 Google Cloud Dataflow 创建会话 windows,如 dataflow model paper 中所述。我想将未绑定的数据发送到 Pub/Sub,然后以流方式在 Cloud Dataflow 中读取它。我想使用超时时间较长(30 分钟到 120 分钟)的会话 windows。
我的问题是:
1) 如果数据流进程失败会怎样?
2) 我会丢失存储在 windows 中但尚未超时的所有数据吗?
3) Dataflow 提供了哪些恢复机制?
示例:
假设我有一个超时为 30 分钟的会话 window,它会触发每分钟的处理时间并累积。假设该值是一个整数,我只是将 window 中的所有值相加。假设这些键值对来自 Pub/Sub:
7 -> 10 (at time 0 seconds)
7 -> 20 (at time 30 seconds)
7 -> 50 (at time 65 seconds)
7 -> 60 (at time 75 seconds)
我想在 60 秒时 window 会触发并产生一对 7 -> 30
。我还假设在 120 秒时 window 会再次触发,并且会产生一个 7 -> 140
对,因为它会触发累积。
我的问题是如果在时间 70 数据流失败会发生什么?我想在第 70 秒之前收到的 3 条消息已经被确认到 Pub/Sub,所以它们不会被重新传送。
当 Dataflow 重新启动时,它会以某种方式使用密钥 7 恢复 window 的状态,以便在时间 120 秒时它可以生成一个 7 -> 140
对,或者它只会生成一个 7 -> 60
对?
还有一个相关问题 - 如果我取消数据流作业并开始一个新作业,我想新作业不会有上一个作业的状态。有没有办法将状态转移到新工作?
Cloud Dataflow 透明地处理故障。例如。它只会在 Cloud Pubsub 中处理 "ack" 消息并持久提交结果后。如果 Dataflow 进程失败(我假设您指的是工作 JVM 崩溃,然后自动重启,而不是整个作业完全失败) ,在重新启动时它将再次连接到 Pubsub,并且所有未确认的消息将被重新传递和重新处理,包括分组到 windows 等。 Window 状态也会在失败时持久保留,因此在这种情况下它应该产生 7 -> 140
.
如果您对这种持久性的实现感兴趣,请参阅 Millwheel paper - 它早于 Dataflow,但 Dataflow 在流式运行器中使用相同的持久层。
Dataflow 中没有面向用户的恢复机制,因为编程模型将您与处理故障的必要性隔离开来,而运行器负责所有必要的恢复;失败可见的唯一方法是通过记录可以多次处理的事实,即如果您在 DoFn 中执行任何副作用,这些副作用必须是幂等的。
目前,作业之间发生状态转移的唯一情况是在 pipeline update operation。