确定数据在 Spark 中倾斜的原因
Identifying why data is skewed in Spark
我正在调查一项 Spark SQL 作业 (Spark 1.6.0),由于 200 个分区中的数据严重倾斜,该作业性能不佳,大部分数据位于 1 个分区中:
我想知道的是...Spark UI 中是否有任何内容可以帮助我了解有关数据分区方式的更多信息?通过查看这个,我不知道数据框在哪些列上进行了分区。我怎样才能找到它? (除了查看代码 - 我想知道日志中是否有任何内容 and/or UI 可以帮助我)?
其他详细信息,这是使用 Spark 的数据框 API,Spark 版本 1.6。底层数据以 parquet 格式存储。
Spark UI 和日志对此不会有太大帮助。 Spark 使用 simple hash partitioning 算法作为几乎所有内容的默认算法。正如你在这里看到的,这基本上回收了 Java hashCode
方法。
我建议如下:
- 尝试通过采样和打印RDD或数据帧的内容来调试。查看密钥的数据分布(即低方差或低基数)是否存在明显问题。
- 如果那是无效的,您可以从日志中返回并 UI 计算出我们有多少个分区。可以用spark求出数据的
hashCode
,然后取模,看看是什么碰撞。
找到冲突源后,您可以尝试使用一些技术来消除它:
- 看看是否有更好的密钥可以使用
- 看看能不能改进按键的
hashCode
功能(Java中的默认功能不是很好)
- 看看您是否可以通过执行初始 scatter/gather 步骤来分两步处理数据,以强制执行一些并行操作并减少该分区的处理开销。这可能是最棘手的优化,以正确处理此处提到的那些问题。基本上,使用随机数生成器对数据进行一次分区以强制对数据进行一些初始并行组合,然后使用自然分区器再次将其推送以获得最终结果。这要求您应用的操作具有传递性和关联性。这种技术会两次访问网络,因此非常昂贵,除非数据真的有那么严重的偏差。
我正在调查一项 Spark SQL 作业 (Spark 1.6.0),由于 200 个分区中的数据严重倾斜,该作业性能不佳,大部分数据位于 1 个分区中:
其他详细信息,这是使用 Spark 的数据框 API,Spark 版本 1.6。底层数据以 parquet 格式存储。
Spark UI 和日志对此不会有太大帮助。 Spark 使用 simple hash partitioning 算法作为几乎所有内容的默认算法。正如你在这里看到的,这基本上回收了 Java hashCode
方法。
我建议如下:
- 尝试通过采样和打印RDD或数据帧的内容来调试。查看密钥的数据分布(即低方差或低基数)是否存在明显问题。
- 如果那是无效的,您可以从日志中返回并 UI 计算出我们有多少个分区。可以用spark求出数据的
hashCode
,然后取模,看看是什么碰撞。
找到冲突源后,您可以尝试使用一些技术来消除它:
- 看看是否有更好的密钥可以使用
- 看看能不能改进按键的
hashCode
功能(Java中的默认功能不是很好) - 看看您是否可以通过执行初始 scatter/gather 步骤来分两步处理数据,以强制执行一些并行操作并减少该分区的处理开销。这可能是最棘手的优化,以正确处理此处提到的那些问题。基本上,使用随机数生成器对数据进行一次分区以强制对数据进行一些初始并行组合,然后使用自然分区器再次将其推送以获得最终结果。这要求您应用的操作具有传递性和关联性。这种技术会两次访问网络,因此非常昂贵,除非数据真的有那么严重的偏差。