这个Github项目如何检测和处理 Apache Spark 中的数据倾斜,并将涵盖以下主题:
- 什么是数据倾斜,以及它如何影响 Spark Jobs 的性能,重点关注连接操作中的数据倾斜。
- 使用 Spark UI 检测数据倾斜。
- 以下是使用数据更改以及 Spark 新版本中内置的优化功能来处理数据倾斜的一些示例。
数据倾斜——原因和后果
Spark 将数据以分区的形式加载到内存中。理想情况下,分区中的数据应均匀分布。数据倾斜是指某个或某些分区的数据明显多于其他分区。数据倾斜通常是需要对数据进行重新分区的操作的结果,主要是连接和分组(GroupBy)操作。
连接操作(Boradcast-Hash 连接除外)可能会导致数据倾斜,因为它们需要将两个数据集中具有相同连接键的数据移动到同一个执行器。如果数据在分区键列的不同值之间分布不均匀,则通过连接的列对数据进行重新分区可能会导致数据倾斜。
对一列或多列进行分组和聚合需要该列每个值的所有数据都存在于同一个执行器上,这需要通过分组列对数据进行重新分区。如果分组列的唯一值的数据分布不均匀,则会导致数据倾斜。
但为什么这么糟糕呢?这取决于数据倾斜的程度,但如果一个或多个分区的数据明显多于其他分区,则可能导致性能瓶颈和资源浪费。它可能导致以下问题:
- 落后任务:处理这些较大分区的任务可能会因为需要执行的工作量而落后于其他任务,并且可能会在它们完成工作时阻止整个作业进入下一阶段。这可能会导致延迟以及集群资源的浪费,因为大多数资源在等待这些落后任务完成时处于闲置状态。
- 溢出到磁盘和内存不足错误:如果这些分区中的数据无法容纳处理它们的执行程序的内存,则垃圾收集可能会成为问题,或者 Spark 可能不得不将数据溢出到磁盘上,从而进一步减慢这些任务的速度。虽然集群上的资源可能足以满足整体数据需求,但这种偏差可能会导致它们无法满足某些分区的需求,从而导致性能下降。在最坏的情况下,这可能会导致内存不足异常并导致作业失败。
代码示例中使用的数据是TIC行程记录数据
数据字典可在以下链接获取:https://www.nyc.gov/assets/tlc/downloads/pdf/data_dictionary_trip_records_yellow.pdf
代码示例中的数据已被修改以产生数据偏差。行程数据为 2022 年 1 月至 2022 年 6 月的黄色出租车行程记录,位置数据为出租车区域查找表。