由于 GC 开销限制,简单的火花作业失败

Simple spark job fail due to GC overhead limit

我在我的本地机器上创建了一个独立的 spark (2.1.1) 集群 每台机器9核/80G(共27核/240G Ram)

我有一个示例 spark 作业,它对从 1 到 x 的所有数字求和 这是代码:

package com.example

import org.apache.spark.sql.SparkSession

object ExampleMain {

    def main(args: Array[String]): Unit = {
      val spark = SparkSession.builder
          .master("spark://192.168.1.2:7077")
          .config("spark.driver.maxResultSize" ,"3g")
          .appName("ExampleApp")
          .getOrCreate()
      val sc = spark.SparkContext
      val rdd = sc.parallelize(Lisst.range(1, 1000))
      val sum = rdd.reduce((a,b) => a+b)
      println(sum)
      done
    }

    def done = {
      println("\n\n")
      println("-------- DONE --------")
    }
}

当运行使用上面的代码时,我会在几秒钟后得到结果 所以我破解了代码以对从 1 到 1B (1,000,000,000) 的所有数字求和,然后达到了 GC 开销限制

我读到如果没有足够的内存,spark 应该会将内存溢出到 HDD,我尝试使用我的集群配置,但没有帮助。

Driver memory = 6G
Number of workers = 24
Cores per worker = 1
Memory per worker = 10

我不是开发人员,不了解 Scala,但想找到 运行 此代码的解决方案,而不会出现 GC 问题。

根据@philantrovert 的要求,我正在添加我的 spark-submit 命令

/opt/spark-2.1.1/bin/spark-submit \
--class "com.example.ExampleMain" \
--master spark://192.168.1.2:6066 \
--deploy-mode cluster \
/mnt/spark-share/example_2.11-1.0.jar

另外我的spark/conf如下:

谢谢

我想问题是您在驱动程序上创建了一个包含 10 亿个条目的 List,这是一个巨大的数据结构 (4GB)。以编程方式创建 Dataset/RDD:

有一种更有效的方法
val rdd = spark.range(1000000000L).rdd