Apache spark apachespark:explode导致洗牌溢出

Apache spark apachespark:explode导致洗牌溢出,apache-spark,Apache Spark,我有40GB的csv文件。在阅读它们之后,我需要执行一系列转换。其中之一就是爆炸一根柱子。在这个转换之后,我得到了下面描述的洗牌溢出。我明白为什么会这样。爆炸是基于广播变量查找的,它给出了一组非常偏斜的结果 我的问题是-我如何减轻泄漏?在explode函数之前,我尝试通过调整spark.sql.shuffle.partitions配置参数来重新分区,以确保shuffle分区大小相等,但这没有帮助 任何关于这个主题的建议或文献都将不胜感激 如果您正在使用RDD,您可以使用Spark的内置分区器来定

我有40GB的csv文件。在阅读它们之后,我需要执行一系列转换。其中之一就是爆炸一根柱子。在这个转换之后,我得到了下面描述的洗牌溢出。我明白为什么会这样。爆炸是基于广播变量查找的,它给出了一组非常偏斜的结果

我的问题是-我如何减轻泄漏?在
explode
函数之前,我尝试通过调整
spark.sql.shuffle.partitions
配置参数来重新分区,以确保shuffle分区大小相等,但这没有帮助

任何关于这个主题的建议或文献都将不胜感激


如果您正在使用RDD,您可以使用Spark的内置分区器来定制跨分区的数据分布。您可以在HashPartitioner和RangePartitioner之间进行选择。两者都适用于离散值和连续值

HashPartitioner示例:

import org.apache.spark.HashPartitioner
val rdd=df.rdd//将数据帧转换为低级rdd
val keyerdd=rdd.keyBy(…)//定义自定义密钥
keyedrd.partitionBy(新HashPartitioner(n))
示例分区器:

import org.apache.spark.Partitioner
类DomainParitioner扩展了分区器{
def numPartitions=n
def getPartition(键:Any):Int={
//您的自定义分区逻辑
}
}
keyedd.partitionBy(new DomainPartitioner).map(u._1).glom().map(u.toSet.toSeq.length)

谢谢@mike!我的计算很成功,尽管我仍然有好几TB的内存溢出。对于阅读本文的其他人来说,如果您来自DF,那么实现您自己的自定义分区器就不是那么简单了。这个答案(星火1.6版之前的版本)帮助我把它做对了-