Scala 由于GC开销限制,简单spark作业失败
我在本地机器上创建了一个独立的spark(2.1.1)群集 每台机器9芯/80G(总共27芯/240G Ram) 我有一个spark的工作示例,它把从1到x的所有数字相加 代码如下:Scala 由于GC开销限制,简单spark作业失败,scala,apache-spark,apache-spark-standalone,Scala,Apache Spark,Apache Spark Standalone,我在本地机器上创建了一个独立的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 = SparkSessio
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(1000000000),然后我就达到了GC开销限制
我读到spark应该将内存溢出到硬盘上,如果没有足够的内存,我已经尝试过使用我的集群配置,但没有帮助
Driver memory = 6G
Number of workers = 24
Cores per worker = 1
Memory per worker = 10
我不是一名开发人员,也不了解Scala,但我想找到一个解决方案,在没有GC问题的情况下运行这段代码
根据@Philantrover请求,我正在添加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如下所示:
- 从属文件包含我的节点(包括主节点)的3个IP地址
- spark默认值包括:
- 星火大师spark://192.168.1.2:7077
- spark.driver.memory 10g
- spark-env.sh包含:
- SPARK\u LOCAL\u DIRS=所有节点之间的共享文件夹
- SPARK_执行器_内存=10G
- SPARK\u驱动器\u内存=10G
- 火花_工人_芯=1
- SPARK\u WORKER\u内存=10G
- SPARK\u WORKER\u实例=8
- SPARK\u WORKER\u DIR=所有节点之间的共享文件夹
- SPARK\u WORKER\u OPTS=“-Dspark.WORKER.cleanup.enabled=true”
谢谢我想问题是您创建了一个
列表
,驱动程序上有10亿个条目,这是一个巨大的数据结构(4GB)。以编程方式创建Dataset/RDD有一种更有效的方法:
val rdd = spark.range(1000000000L).rdd
您可以将您的
spark submit
命令添加到问题中吗?@philantrover添加了spark submit+my spark配置尝试将--conf“spark.driver.maxrultsize=3G”
添加到您的spark submit而不是您的程序中。我还没有使用Spark独立集群,但我认为驱动程序会在执行程序中的conf.set(..)
之前启动。我可能错了。您是否尝试使用val rdd=spark.range(1000000000L).rdd
创建rdd?我认为创建一个包含10亿个条目的scala列表是这里的问题…@philantrovert-配置没有帮助,21分钟后作业失败