首页 > 解决方案 > 在集群模式下运行 Spark 作业时,Python 日志记录在运行时设置日志路径

问题描述

我的日志设置看起来像这样 logging.json 包含日志配置

File Handler:
filename: "%dynamic_log%/sample.log"

我在运行时构建动态日志路径,并将 %dynamic_log% 替换为我想要记录的实际路径并使用 dictConfig 加载到记录器中。

这是在集群模式下运行 pyspark 作业时的问题。驱动程序在其中一个工作节点容器中执行火花作业。它在工作节点上搜索 dir 路径,我得到了

FileNotFoundError: No such file or dir:  'my/dynamic/path/sample.log'

解决方法:

在 logging.json

File Handler:
filename: "sample.log"

创建 sample.log 文件是工作节点,然后我在使用 Hadoop FileSystem 完成作业后将日志文件复制到动态路径。 fs.moveFromLocalFile('sample.log", "my/dynamic/path/sample.log")

这并不理想,因为在作业运行时我将无法看到日志。

我尝试先创建日志文件,然后使用

fs.create(my/dynamic/path/sample.log)

sample.log 在实际目录中创建但仍然出现错误No such file or dir: 'my/dynamic/path/sample.log'

提前谢谢你(抱歉格式不好)

标签: pythonapache-sparkloggingpysparkapache-spark-sql

解决方案


extraJavaOptions我们可以尝试使用带有 Dlogger.File 值的参数提供给 spark-submit 的 spark 和 log4j.properties 将日志生成到特定位置(可能不是动态的) 。

如下所示:

spark-submit --master local --conf spark.driver.extraJavaOptions="-Dlogger.File=/tmp/sample.log -Dlog4j.debug -Dlog4j.configuration=file:/tmp/log4j.properties" --conf spark.executor.extraJavaOptions="-Dlogger.File=/tmp/sample.log -Dlog4j.debug -Dlog4j.configuration=file:/tmp/log4j.properties" main.py 

虽然可以通过主要的 spark 属性设置进行类似的尝试(不确定这是否通过)。

from pyspark.context import SparkContext
SparkContext.setSystemProperty('logger.File', '/tmp/sample.log')
logger = spark._jvm.org.apache.log4j.LogManager.getLogger('default')

并定义 log4j.properties

log4j.rootLogger=INFO, spark_jobs
log4j.logger.spark_jobs=INFO
log4j.appender.spark_jobs.File=${logger.File}

对于动态路径,我猜想捕获的是 PySpark 在底层调用 Py4J(JVM),因此我们可能需要一种机制来在 JVM 启动时设置属性。


推荐阅读