【问题标题】:Spark Java: Cannot change driver memorySpark Java:无法更改驱动程序内存
【发布时间】:2020-08-06 12:42:42
【问题描述】:

所以,我有一个带有 16 个工作节点和一个主节点的 spark 独立集群。我从 spark_home/conf 文件夹中的主节点使用“sh start-all.sh”命令启动集群。主节点有 32Gb Ram 和 14 个 VCPUS,而我每个节点有 16Gb Ram 和 8 个 VCPUS。我还有一个 spring 应用程序,当它启动时(使用 java -jar app.jar),它会初始化 spark 上下文。 spark-env.sh 文件是:

export SPARK_MASTER_HOST='192.168.100.17'
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=14000mb 
export SPARK_WORKER_INSTANCES=1
export SPARK_WORKER_OPTS='-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.interval=172800 -Dspark.worker.cleanup.appDataTtl=172800'

我在 spark-defaults.conf 中没有任何内容,以编程方式初始化 spark 上下文的代码是:

@Bean
public SparkSession sparksession() {
     SparkSession sp = SparkSession
             .builder()
    .master("spark://....")
    .config("spark.cassandra.connection.host","192.168.100......")
    .appName("biomet")
    .config("spark.driver.memory","20g")
    .config("spark.driver.maxResultSize", "10g")
    .config("spark.sql.shuffle.partitions",48) 
    .config("spark.executor.memory","7g") 
    .config("spark.sql.pivotMaxValues","50000") 
    .config("spark.sql.caseSensitive",true)
    .config("spark.executor.extraClassPath","/home/ubuntu/spark-2.4.3-bin-hadoop2.7/jars/guava-16.0.1.jar")
    .config("spark.hadoop.fs.s3a.access.key","...")
    .config("spark.hadoop.fs.s3a.secret.key","...")
             .getOrCreate();
     return sp;
 }

毕竟,Spark UI 的 Environment 选项卡有 spark.driver.maxResultSize 10g 和 spark.driver.memory 20g 但驱动程序存储内存的 executors 选项卡显示 0.0 B / 4.3 GB。

(仅供参考:我曾经将 spark.driver.memory 设置为 10g(以编程方式设置),并且在执行程序选项卡中说 4.3Gb,但现在看来我无法更改它。但我认为即使当我有它 10g,不是应该给我超过 4.3Gb 吗?!)

如何更改驱动程序内存?我尝试从 spark-defaults.conf 设置它,但没有任何改变。即使我没有设置所有驱动程序内存(或将其设置为小于 4.3Gb),它仍然在 executors 选项卡中显示 4.3Gb。

【问题讨论】:

    标签: java spring-boot apache-spark memory ram


    【解决方案1】:

    我怀疑你是在客户端模式下运行你的应用程序,然后per documentation:

    可以使用 spark 设置最大堆大小设置。司机。集群模式下的内存和客户端模式下的 --driver-memory 命令行选项。注意:在客户端模式下,这个配置不能直接在你的应用程序中通过 SparkConf 设置,因为此时驱动 JVM 已经启动

    在目前的情况下,Spark 作业是从应用程序提交的,因此应用程序本身就是一个驱动程序,它的内存与 Java 应用程序一样被调节 - 通过-Xmx 等。

    【讨论】:

    • 是的,它处于客户端模式。好的,然后我从 SparkConf 中删除了它。我试着把它放在 Spark-defaults.conf 文件中,但它甚至没有读取这个文件。据我了解,正如您所说,我无法以编程方式设置驱动程序内存,因为 JVM 已经启动(使用 sh start-all.sh)。但是那我应该如何设置驱动程序内存呢?只有 spark-env.sh 文件,但该文件中没有用于设置客户端独立 Spark 集群中的驱动程序内存的配置。
    • 您需要以spark-submit 选项开始--driver-memory
    • 但是我没有在任何地方使用 spark submit...你的意思是在我使用 "sh start-all.sh" 或启动我的应用程序之前尝试 "spark-submit --driver-memory=30g" ?
    • 是的,使用spark-submit。我不知道start-all.sh 在做什么,但我怀疑它在后台调用spark-submit
    • 在这种情况下,驱动程序是您正在执行的应用程序 - 只需像往常一样设置 -Xmx
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多