python - 在集群模式下运行 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
'
提前谢谢你(抱歉格式不好)
解决方案
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 启动时设置属性。
推荐阅读
- php - 如何对 Codeigniter 中的 Composer 自动加载进行故障排除?
- html - 为 DIV 正方形制作对角线
- arduino - Arduino 计时器计数重置为 65,但应重置为 70
- java - 如何通过java查找列是否为“IDENTITY”列
- java - Cassandra Talend Job 运行通过 java 构成错误
- python - 在 python 中打印元组的不一致
- selenium - 如何在 Selenium 版本 3.4.0 中使用显式等待
- python - 在使用 OCR 从图像中提取文本期间,python 中的子进程库出现问题
- javascript - 从 chrome.storage.sync 中删除数据?
- elasticsearch - 文档中带有列表的 ElasticSearch 聚合查询