目前 Flink 默认的 FailoverStrategy 是 RestartPipelinedRegionFailoverStrategy。采用了这个策略后,如果一个 Task 失败了就会重启它所在的 region。这其实跟 Pipelined 数据交换有关系。在 Pipelined 数据交换的节点之间,如果任意一个节点失败了,其相关联的其它节点也会跟着失败。这是为了防止出现数据的不一致。因此为了避免单个 Task 导致多次 Failover,一般的操作是在收到第一个Task failed 时,就把其他的一起 cancel 掉,再一起重启。
RestartPipelinedRegion 策略除了重启失败任务所在的 Region 外,还会重启它的下游Region 。 原因是任务的产出很多时候是非确定性的,比如说一个record,分发到下游的第一个并发,重跑一次;分发到下游的第二个并发时,一旦这两个下游在不同 region 中,就可能会导致 record 丢失,甚至产生不一样的数据。为了避免这种情况,采用PipelinedRegionFailoverStrategy 会重启失败任务所在的Region 以及它的所有的下游 Region。
还有一个 RestartAllFailoverStrategy 策略,它会在任意 Task fail 的时候,重启作业中的所有任务。一般情况,这个策略并不被经常用到,但是在一些特殊情况下,比如当任务失败,用户不希望局部运行而是希望所有任务都结束并整体进行恢复,可以用这个策略。
资料来源:《Apache Flink 必知必会》,下载链接:https://developer.aliyun.com/topic/download?id=1189
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。