连接两个大 RDD 时映射阶段的溢出问题
Spilling issue on mapping stage when joining two big RDDs
我尝试对来自两个大文本文件的两个数据集应用 join。两个文本文件都包含如下两列:
*col1* *document*
abc 1
aab 1
... ...
ccd 2
abc 2
... ...
我根据这两个文件的第一列加入这两个文件,并尝试找出文档有多少共同的 col1 值。两个文本文件的大小均为 10 GB。当我 运行 我的脚本 spark 创建了 6 个阶段,每个阶段有 287 个分区。在这 6 个阶段中,有 4 个不同,一个用于每个阶段,一个用于地图。一切顺利,直到第 5 阶段的映射阶段。在那个阶段,spark 停止处理分区,而是溢出到磁盘上,在溢出一万次之后,它给出了一个与磁盘不足相关的错误 space。
我有 4 个内核和 8 GB 内存。我用-Xmx8g 给了所有内存。我也试过 set("spark.shuffle.spill", "true").
My script:
{
...
val conf = new SparkConf().setAppName("ngram_app").setMaster("local[4]").set("spark.shuffle.spill", "false")
val sc = new SparkContext(conf)
val emp = sc.textFile("...doc1.txt").map { line => val parts = line.split("\t")
((parts(5)),parts(0))
}
val emp_new = sc.textFile("...doc2.txt").map { line => val parts = line.split("\t")
((parts(3)),parts(1))
}
val finalemp = emp_new.join(emp).
map { case((nk1) ,((parts1), (val1))) => (parts1 + "-" + val1, 1)}.reduceByKey((a, b) => a + b)
finalemp.foreach(println)
}
我应该怎么做才能避免溢出这么多?
您似乎需要更改 Spark 的内存设置。如果您使用 spark-submit 脚本,您只需将 -executor-memory 8G
添加到您的命令中。设置 -Xmx8g
会影响 JVM,但不会影响 Spark(我认为默认为 256MB)。
请注意,根据经验法则,您不应为 Spark 作业分配超过 75% 的可用内存。
我尝试对来自两个大文本文件的两个数据集应用 join。两个文本文件都包含如下两列:
*col1* *document*
abc 1
aab 1
... ...
ccd 2
abc 2
... ...
我根据这两个文件的第一列加入这两个文件,并尝试找出文档有多少共同的 col1 值。两个文本文件的大小均为 10 GB。当我 运行 我的脚本 spark 创建了 6 个阶段,每个阶段有 287 个分区。在这 6 个阶段中,有 4 个不同,一个用于每个阶段,一个用于地图。一切顺利,直到第 5 阶段的映射阶段。在那个阶段,spark 停止处理分区,而是溢出到磁盘上,在溢出一万次之后,它给出了一个与磁盘不足相关的错误 space。
我有 4 个内核和 8 GB 内存。我用-Xmx8g 给了所有内存。我也试过 set("spark.shuffle.spill", "true").
My script:
{
...
val conf = new SparkConf().setAppName("ngram_app").setMaster("local[4]").set("spark.shuffle.spill", "false")
val sc = new SparkContext(conf)
val emp = sc.textFile("...doc1.txt").map { line => val parts = line.split("\t")
((parts(5)),parts(0))
}
val emp_new = sc.textFile("...doc2.txt").map { line => val parts = line.split("\t")
((parts(3)),parts(1))
}
val finalemp = emp_new.join(emp).
map { case((nk1) ,((parts1), (val1))) => (parts1 + "-" + val1, 1)}.reduceByKey((a, b) => a + b)
finalemp.foreach(println)
}
我应该怎么做才能避免溢出这么多?
您似乎需要更改 Spark 的内存设置。如果您使用 spark-submit 脚本,您只需将 -executor-memory 8G
添加到您的命令中。设置 -Xmx8g
会影响 JVM,但不会影响 Spark(我认为默认为 256MB)。
请注意,根据经验法则,您不应为 Spark 作业分配超过 75% 的可用内存。