Spark Shell执行报错:spark.executor.extraJavaOptions不允许设置Spark选项
问题场景
在Windows 11环境下使用Spark 3.5.1运行PySpark程序,通过spark-defaults.conf配置spark.executor.extraJavaOptions参数后,执行spark-submit触发错误,核心错误提示:
java.lang.Exception: spark.executor.extraJavaOptions is not allowed to set Spark options (was '-Dlog4j.configuration=file:log4j.properties -Dspark.yarn.app.container.log.dir=app-logs -Dlogfile.name=HelloSpark'). Set them directly on a SparkConf or in a properties file when using ./bin/spark-submit.
原spark-defaults.conf配置:
spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties -Dspark.yarn.app.container.log.dir=app-logs -Dlogfile.name=HelloSpark
原PySpark代码片段:
from pyspark.sql import * from pyspark import SparkConf from lib.logger import Log4j if __name__ == "__main__": spark = SparkSession.builder \ .appName("Hello Spark") \ .master("local[3") # 语法错误:缺少闭合方括号 .getOrCreate() logger = Log4j(spark) logger.info("Starting HelloSpark") # your processing code logger.info("Finished HelloSpark")
错误原因
spark.executor.extraJavaOptions仅用于传递JVM级别的参数(如日志配置、自定义系统变量),但该参数中包含了-Dspark.yarn.app.container.log.dir——这是Spark自身的配置项,Spark禁止将Spark配置嵌套在JVM参数中传递,必须直接在配置文件或SparkConf中单独设置。
同时代码中master("local[3")存在语法错误,缺少闭合方括号,会导致SparkSession初始化失败。
解决方案
拆分配置项:将Spark自身的配置从
spark.executor.extraJavaOptions中剥离,单独在spark-defaults.conf中设置:
修改后的spark-defaults.conf:spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties -Dlogfile.name=HelloSpark spark.yarn.app.container.log.dir=app-logs注:
spark.yarn.app.container.log.dir仅在YARN集群模式下生效,local模式运行时该配置不会产生实际作用,但保持正确配置不影响程序运行。修正代码语法错误:将
master("local[3")改为master("local[3]"),完整的SparkSession初始化代码:spark = SparkSession.builder \ .appName("Hello Spark") \ .master("local[3]") \ .getOrCreate()重新执行程序:再次运行
spark-submit命令,错误即可消除。
内容的提问来源于stack exchange,提问作者Ronit Jain

