由于 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如下:
- slaves 文件包含我的节点(包括 master)的 3 个 IP 地址
- spark-defaults 包含:
- spark.masterspark://192.168.1.2:7077
- spark.driver.memory10g
- spark-env.sh 包含:
- SPARK_LOCAL_DIRS=所有节点共享文件夹
- SPARK_EXECUTOR_MEMORY=10G
- SPARK_DRIVER_MEMORY=10G
- SPARK_WORKER_CORES=1
- SPARK_WORKER_MEMORY=10G
- SPARK_WORKER_INSTANCES=8
- SPARK_WORKER_DIR=所有节点共享文件夹
- SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true"
谢谢
我想问题是您在驱动程序上创建了一个包含 10 亿个条目的 List
,这是一个巨大的数据结构 (4GB)。以编程方式创建 Dataset/RDD:
有一种更有效的方法
val rdd = spark.range(1000000000L).rdd
我在我的本地机器上创建了一个独立的 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如下:
- slaves 文件包含我的节点(包括 master)的 3 个 IP 地址
- spark-defaults 包含:
- spark.masterspark://192.168.1.2:7077
- spark.driver.memory10g
- spark-env.sh 包含:
- SPARK_LOCAL_DIRS=所有节点共享文件夹
- SPARK_EXECUTOR_MEMORY=10G
- SPARK_DRIVER_MEMORY=10G
- SPARK_WORKER_CORES=1
- SPARK_WORKER_MEMORY=10G
- SPARK_WORKER_INSTANCES=8
- SPARK_WORKER_DIR=所有节点共享文件夹
- SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true"
谢谢
我想问题是您在驱动程序上创建了一个包含 10 亿个条目的 List
,这是一个巨大的数据结构 (4GB)。以编程方式创建 Dataset/RDD:
val rdd = spark.range(1000000000L).rdd