spark-submit log4j 配置在 spark 上下文中无效

spark-submit log4j configuration has no effect in spark context

spark-submit 中指定配置文件后,如 this answer:

spark-submit \
    --master local \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties"\
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j.properties"\
    --py-files ./dist/src-1.0-py3-none-any.whl\
    --files "/job/log4j.properties"\ # path in docker container
     main.py -input  -output  -mapper   # app args

dockerized 应用程序结构为:

job/
|--  entrypoint.sh
|--  log4j.properties
|--  main.py

我收到以下错误:

log4j:ERROR Ignoring configuration file [file:/log4j.properties].log4j:ERROR Could not read configuration file from URL [file:/log4j.properties].

java.io.FileNotFoundException: /log4j.properties (No such file or directory)

如果我从 spark context 方法设置配置,它工作正常:PropertyConfigurator.configure:

logger = sc._jvm.org.apache.log4j.Logger
sc._jvm.org.apache.log4j.PropertyConfigurator.configure("/job/log4j.properties")
Logger = logger.getLogger("MyLogger")

也就是说,所有spark INFO级别的日志记录都被静音了,我只看到警告和错误日志,这是我在配置文件中设置的。但是,如果我只是将记录器实例化为(理想的行为):

log4jLogger = sc._jvm.org.apache.log4j
logger = log4jLogger.LogManager.getLogger("MyLogger")

它的行为与通过 PropertyConfigurator.configure 设置时不同,我已将其设置为静音所有 spark INFO 级别的日志记录。关于如何使用 spark-submit 中设置的日志记录配置来控制应用程序日志的任何想法?

使用带有 spark 版本 3.0.1 和 python 3.8.0.

的 pyspark

由于您在容器中并使用 --master local,这将限制您使用本地文件系统,您可以从 file:// URI 访问它。

--files 从您 运行 命令的位置获取文件所在位置的相对路径,并添加到 driver/executor 类路径,我认为

将这两条信息放在一起,你可以指定

-Dlog4j.configuration=file:///job/log4j.properties

一起
--files "/job/log4j.properties"

但是,如果您要 运行 在集群环境中这样做,那么 -Dlog4j.configuration 设置将不正确