我尝试为来自两个大文本文件的两个数据集应用 join 。两个文本文件都包含两列,如下所示:
*col1* *document*
abc 1
aab 1
... ...
ccd 2
abc 2
... ...
我根据他们的第一列加入这两个文件,并尝试查找文档中有多少常见的col1值。两个文本文件的大小都是10 GB。当我运行我的脚本时,spark会创建6个阶段,每个阶段有287个分区。这6个阶段中有4个不同,一个是foreach,另一个是map。一切顺利,直到第五阶段的绘图阶段。在那个阶段火花停止处理分区,而不是它溢出在磁盘上,并在一万次溢出后给出一个与没有足够的磁盘空间相关的错误。
我有4个内核和8 GB内存。我用-Xmx8g给了所有内存。我也尝试过设置(" 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)
}
我该怎么做才能避免那么多的溢出?
答案 0 :(得分:2)
看起来您需要更改Spark的内存设置。如果使用spark-submit脚本,只需将-executor-memory 8G
添加到命令中即可。设置-Xmx8g
会影响JVM,但不会影响Spark(我认为默认为256MB)。
请注意,经验法则规定您不应将超过75%的可用内存分配给Spark作业。