加入两个大型RDD时,在映射阶段出现问题

时间:2015-09-11 13:31:40

标签: scala apache-spark diskspace

我尝试为来自两个大文本文件的两个数据集应用 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)

}

我该怎么做才能避免那么多的溢出?

1 个答案:

答案 0 :(得分:2)

看起来您需要更改Spark的内存设置。如果使用spark-submit脚本,只需将-executor-memory 8G添加到命令中即可。设置-Xmx8g会影响JVM,但不会影响Spark(我认为默认为256MB)。

请注意,经验法则规定您不应将超过75%的可用内存分配给Spark作业。