混合 Shuffle 模式的性能分析和调优指南

概述

Apache Flink 社区在 Flink 1.16 中引入了 Hybrid Shuffle 模式,它将传统的 Batch Shuffle 与流处理中的 Pipelined Shuffle 结合起来,赋予 Flink 批处理更强大的能力。

Hybrid Shuffle 的核心思想是打破调度约束,根据资源的可用性来决定是否需要调度下游任务,同时在条件允许的情况下支持内存中的数据交换而不溢出到磁盘。

我们基于 Flink 1.17 在多个场景下对 Hybrid Shuffle 进行了评估。本文将根据评测结果详细分析 Hybrid Shuffle 的优势,并根据我们的经验提供一些调优指南。

Hybrid Shuffle 的优势

与传统的 Batch Blocking Shuffle 相比,Hybrid Shuffle 主要有以下优势:

  • 灵活的调度:Hybrid Shuffle 打破了 Pipelined Shuffle 模式下所有任务必须同时调度,或者 Blocking Shuffle 模式下必须分段调度的前提:当资源充足时,上下游任务可以同时运行。当资源不足时,下游任务可以批量执行。
  • 减少 IO 开销:Hybrid Shuffle 打破了批处理作业的所有数据都必须写入磁盘并从磁盘消费的约束。当上下游任务同时运行时,支持直接从内存中消费数据,在提升作业性能的同时,显着减少了磁盘 IO 的额外开销。

这些独特的优势让 Hybrid Shuffle 具备了传统 Blocking Shuffle 所缺乏的能力。为了验证其有效性,我们进行了一系列的实验和分析,主要分为以下几个方面:

  • 填补资源缺口:资源缺口是指作业执行过程中某些时间点出现的空闲任务槽位,即集群资源没有被充分利用。这种情况在 Flink Blocking Shuffle 中会出现,在某些任务存在数据倾斜的场景下尤为明显。下图是 Blocking Shuffle 和 Hybrid Shuffle 的对比。可以看到,Blocking Shuffle 中的两个任务槽位无法使用,而 Hybrid Shuffle 中的三个任务槽位都在使用中。

数据倾斜是一种普遍存在的现象。以 TPC-DS q4 为例,一个 HashJoin 算子平均读取 204 MB 数据,而一个倾斜任务读取多达 7.03 GB 数据。测试发现,Hybrid Shuffle 相比 Blocking Shuffle 减少了该查询的总执行时间 18.74%。

  • 减少磁盘负载:Flink Blocking Shuffle 将所有中间数据写入磁盘。因此,随机写入和随机读取阶段分别执行磁盘写入和读取操作。这带来了两个主要问题:
    • 磁盘 IO 负载增加,影响整个集群的吞吐量。随着集群上作业数量的增加,磁盘 IO 将成为瓶颈。
    • 大规模批量作业的 Shuffle 数据会占用相当大的磁盘存储空间,且大小难以估计。这个问题在以 Kubernetes 为代表的云原生环境中更为突出:配置值太小,会出现存储空间不足的情况;如果配置的值太大,会浪费存储资源,因为资源在大多数情况下是在 pod 级别隔离的。

Hybrid Shuffle 引入了两种数据溢出策略:

* 选择性溢出策略:当有数据溢出时,只将一部分数据溢出到磁盘,内存空间不足。该策略可以同时减少磁盘读写指令。
* 全溢出策略:所有中间数据都写入磁盘,但下游任务可以直接从内存中消费未释放的数据。该策略可以有效减少磁盘读取指令,同时还可以提高容错能力。

为了比较不同 shuffle 模式和溢出策略对磁盘 IO 负载的影响,我们进行了以下实验:

* 测试磁盘读取和写入的数据与磁盘 IO 负载的比例。
* 不同 shuffle 模式和溢出策略下的总数据。
* 测试 Hybrid Shuffle 选择性溢出策略下不同网络内存大小下磁盘读写数据占总数据的比例。

从实验结果可以看出:

* 与 Blocking Shuffle 相比,Hybrid Shuffle 大大减少了磁盘读取和写入的数据量。

Hybrid Shuffle 的调优指南

基于上面的分析和实验结果,我们总结了以下三个调优指南:

  • **使用 Hybrid Shuffle:**当作业存在数据倾斜或磁盘 I/O 负载高时,使用 Hybrid Shuffle 可以显著提高作业性能。
  • **降低算子的并行度:**当作业并行度设置过高时,可能会导致磁盘 I/O 负载高或作业执行时间长。因此,可以降低算子的并行度来提高作业性能。
  • **增加网络内存的大小:**当网络内存大小设置过小时,可能会导致磁盘 I/O 负载高或作业执行时间长。因此,可以增加网络内存的大小来提高作业性能。

结论

在本文中,我们主要研究了导致 Hybrid Shuffle 优越性能的因素。我们的研究包括对这些因素的综合实验评估和分析。此外,我们还提出了相应的增强实用性的优化指南:

  • **使用 Hybrid Shuffle:**当作业存在数据倾斜或磁盘 I/O 负载高时,使用 Hybrid Shuffle 可以显著提高作业性能。
  • **降低算子的并行度:**当作业并行度设置过高时,可能会导致磁盘 I/O 负载高或作业执行时间长。因此,可以降低算子的并行度来提高作业性能。
  • **增加网络内存的大小:**当网络内存大小设置过小时,可能会导致磁盘 I/O 负载高或作业执行时间长。因此,可以增加网络内存的大小来提高作业性能。

我们相信,Hybrid Shuffle 是 Apache Flink 批处理性能优化的一项重要技术。

关注公众号“大模型全栈程序员”回复“大数据面试”获取800页左右大数据面试宝典 ,回复“大数据”获取多本大数据电子书

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627