Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jvm 由于内存不足,Spark连接失败_Jvm_Apache Spark_Bigdata - Fatal编程技术网

Jvm 由于内存不足,Spark连接失败

Jvm 由于内存不足,Spark连接失败,jvm,apache-spark,bigdata,Jvm,Apache Spark,Bigdata,我的群集: 9个从机,每个从机具有100GB内存和320GB硬盘驱动器。每个主机有16个核心。我在每个主机上启动了15个spark执行器,因此每个执行器的可用内存为6GB。 我的申请: val rdd1 = sc.textFile("a big file in S3. about 200GB" with 14M rows) val rdd2 = sc.textFile("another big file in S3. about 200GB" with 14M rows) val par = n

我的群集: 9个从机,每个从机具有100GB内存和320GB硬盘驱动器。每个主机有16个核心。我在每个主机上启动了15个spark执行器,因此每个执行器的可用内存为6GB。 我的申请:

val rdd1 = sc.textFile("a big file in S3. about 200GB" with 14M rows)
val rdd2 = sc.textFile("another big file in S3. about 200GB" with 14M rows)
val par = new HashPartitioner(150)
val rdd1Paired = rdd1.map(regular expression to get one string from each row).filter(non matched rows).partitionBy(par)
val rdd2Paired = rdd2.mpa(regular expression to get one string from each row).filter(non matched rows).partitionBy(par)
val rdd3 = rdd1.join(rdd2, par)
rdd3.count()
我从spark UI计算出作业计划分为三个阶段。筛选rdd1、筛选rdd2和计数。虽然filtering1和filtering2成功,但由于OOM,计数始终失败。奇怪的是,作业总是挂在计数阶段(149/150)。我检查了分配给TID150的executor,发现Shuffle read急剧增加。一段时间后,由于OOM,它崩溃了。我还看到GC在那个执行者身上频繁发生

问题:
为什么只有一个执行器正在获取所有数据(我检查了执行器执行的最后一个操作是开始获取工作)?据我所知,一旦我对两个RDD使用相同的分区器,它们将被共同分区。并在同一作业中启动它们,以保证数据的同一位置。所以连接应该发生在每个执行者身上。前149个任务很快退出,似乎什么也没做。看起来最后一个任务是尝试完成所有工作

我猜您从数据生成的密钥的分布是倾斜的,因此很多密钥最终都位于同一分区中

它是最后一个失败的任务,因为它是最大的任务,所以它执行的时间最长,并且是最后一个


为了解决这个问题,增加分区的数量和/或增强服务器

密钥的分布是不统一的。检查并确保您的任何过滤功能都不会附带导致某些键的浓度更高。

谢谢您的回复。我在我的散列键(从同一个文件中提取的完全相同的键列表)上测试了HashPartitioner(5000)。不过,分布情况看起来不错。我正在用分区10K运行另一个作业,看看它是否失败。我检查了代码,结果发现问题是由大量重复的密钥引起的。