我正在研究一个 Spark SQL 作业(Spark 1.6.0),该作业由于 200 个分区中的数据严重不正确而表现不佳,大多数数据位于 1 个分区中:
我想知道 is...is Spark UI 中有什么可以帮助我找到有关数据如何分区的更多信息?从这个角度看,我不知道数据帧在哪列上分区。我如何找到答案? (除了查看代码外-我想知道日志 and/or UI 中是否有什么可以帮助我)?
其他详细信息,这使用的是 Spark 的数据帧 API,Spark 版本 1.6. 基础数据以实木复合地板格式存储。
1 回答
Spark UI 和日志不会对此有很大帮助。对于几乎所有内容,Spark 都使用简单哈希分区算法作为默认算法。如您所见,这基本上回收了 Java
hashCode
方法。我建议以下内容:
尝试通过采样和打印 RDD 或数据帧的内容进行调试。查看密钥的数据分布是否存在明显问题(即低方差或低基数)。
如果那没效果,您可以从日志和 UI 进行回顾,以计算出我们有多少个分区。您可以使用 spark 找到数据的
hashCode
,然后获取模数以查看碰撞是什么。找到碰撞的根源后,您可以尝试一些技术来消除它:
看看是否有更好的钥匙可以使用
看看是否可以改进键的
hashCode
功能(Java 中的默认键不是那么好)查看是否可以通过执行初始 scatter/gather 步骤来强制执行某些并行操作并减少该分区的处理开销,从而分两步处理数据。这可能是最棘手的优化方法,可以正确解决此处提到的那些问题。基本上,使用随机数生成器对数据进行一次分区,以强制对数据进行一些初始的并行组合,然后使用自然分区程序再次将其推送通过以获得最终结果。这要求您要应用的操作必须具有传递性和关联性。该技术两次击中网络,因此非常昂贵,除非数据实际上确实高度偏斜。