返回

浪潮之下,字节跳动 Flink 单点恢复功能实践

见解分享

在当今数据爆炸的时代,实时数据处理已成为各大互联网公司面临的共同挑战。字节跳动作为国内领先的互联网公司,每天需要处理海量的数据,其中很大一部分是流式数据。为了满足业务需求,字节跳动采用了 Apache Flink 作为其流处理平台。

Flink 是一个开源的分布式流处理框架,具有高吞吐量、低延迟、Exactly-Once 语义等特点。然而,在 Flink 现有的架构设计中,多流 Join 拓扑下单个 Task 失败会导致所有 Task 重新部署,耗时可能会持续几分钟,导致作业的输出断流,这对于线上业务来说是不可接受的。

针对这一痛点,我们提出单点恢复的方案,通过对 network 层的增强,使得在机器下线或者 Task 重启时,能够快速恢复数据传输,从而保证作业的连续性。

方案设计

我们的单点恢复方案主要包括以下几个方面:

  1. Task 故障检测:

    我们通过在每个 Task Manager 上部署一个故障检测模块来检测 Task 的故障。故障检测模块会定期向每个 Task 发送心跳信号,如果在一段时间内没有收到 Task 的心跳信号,则认为该 Task 已经故障。

  2. 数据传输恢复:

    当一个 Task 故障时,故障检测模块会向所有其他 Task 发送一个故障通知。收到故障通知的 Task 会停止向故障 Task 发送数据,并开始尝试从故障 Task 的上游 Task 重新获取数据。

  3. Task 重启:

    当故障 Task 重新启动后,它会向故障检测模块发送一个恢复请求。故障检测模块会将故障 Task 的状态信息发送给它,故障 Task 会根据这些状态信息恢复其状态,并继续处理数据。

实现细节

为了实现单点恢复功能,我们对 Flink 的 network 层进行了增强。主要包括以下几个方面:

  1. 引入新的消息类型:

    我们在 Flink 中引入了一种新的消息类型,称为恢复消息。恢复消息用于在 Task 故障后恢复数据传输。

  2. 修改 NetworkBufferManager:

    我们修改了 Flink 的 NetworkBufferManager,使其能够处理恢复消息。NetworkBufferManager 在收到恢复消息后,会将恢复消息转发给相应的 Task。

  3. 修改 Task:

    我们修改了 Flink 的 Task,使其能够处理恢复消息。Task 在收到恢复消息后,会根据恢复消息中的信息恢复其状态,并继续处理数据。

性能评估

我们对单点恢复方案进行了性能评估。评估结果表明,单点恢复方案可以将 Task 故障导致的作业中断时间从几分钟缩短到几秒钟。

总结

单点恢复方案是我们在 Flink 上进行的一项探索性工作。该方案可以有效地解决 Flink 在多流 Join 拓扑下单个 Task 故障导致作业中断的问题,从而保证作业的连续性。我们希望该方案能够为其他使用 Flink 的用户提供参考。