首页 文章

识别为何 Spark 中的数据偏斜

提问于
浏览
0

我正在研究一个 Spark SQL 作业(Spark 1.6.0),该作业由于 200 个分区中的数据严重不正确而表现不佳,大多数数据位于 1 个分区中:
索引,ID,尝试,状态,位置级别,执行程序 ID/Host,启动时间,持续时间,GC 时间,随机读取 Size/Records
我想知道 is...is Spark UI 中有什么可以帮助我找到有关数据如何分区的更多信息?从这个角度看,我不知道数据帧在哪列上分区。我如何找到答案? (除了查看代码外-我想知道日志 and/or UI 中是否有什么可以帮助我)?

其他详细信息,这使用的是 Spark 的数据帧 API,Spark 版本 1.6. 基础数据以实木复合地板格式存储。

1 回答

  • 2

    Spark UI 和日志不会对此有很大帮助。对于几乎所有内容,Spark 都使用简单哈希分区算法作为默认算法。如您所见,这基本上回收了 Java hashCode方法。

    我建议以下内容:

    • 尝试通过采样和打印 RDD 或数据帧的内容进行调试。查看密钥的数据分布是否存在明显问题(即低方差或低基数)。

    • 如果那没效果,您可以从日志和 UI 进行回顾,以计算出我们有多少个分区。您可以使用 spark 找到数据的hashCode,然后获取模数以查看碰撞是什么。

    找到碰撞的根源后,您可以尝试一些技术来消除它:

    • 看看是否有更好的钥匙可以使用

    • 看看是否可以改进键的hashCode功能(Java 中的默认键不是那么好)

    • 查看是否可以通过执行初始 scatter/gather 步骤来强制执行某些并行操作并减少该分区的处理开销,从而分两步处理数据。这可能是最棘手的优化方法,可以正确解决此处提到的那些问题。基本上,使用随机数生成器对数据进行一次分区,以强制对数据进行一些初始的并行组合,然后使用自然分区程序再次将其推送通过以获得最终结果。这要求您要应用的操作必须具有传递性和关联性。该技术两次击中网络,因此非常昂贵,除非数据实际上确实高度偏斜。

相关问题