我正在通过spark-submit
在由主节点和4个工作节点组成的EMR集群上运行应用程序(在client
部署模式下)。集群配置为启用了日志聚合,并且我所有的执行程序日志都已正确存档到S3存储桶中。但是,我第一次启动应用程序时看不到驱动程序上生成的日志(它们显示在控制台上,但似乎没有记录到文件中)。尝试通过添加以下内容来更新文件
log4j.rootLogger = WARN,console,file
....
log4j.appender.file.DatePattern=.yyyy-MM-dd
log4j.appender.file.Threshold = TRACE
log4j.appender.file = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File = ${spark.yarn.app.container.log.dir}/spark.log
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%5p [%d] ({%t} %F[%M]:%L) - %m%n
根据建议here,但是当我使用spark-submit时,由于${spark.yarn.app.container.log.dir}/spark.log
解析为/spark.log
并且出现Permission Denied
错误,因此记录失败。
我目前正在通过遵循this answer来解决此问题,因此以上代码用于驱动程序配置(但登录到具体的现有路径),而执行程序日志记录配置是默认配置(利用日志聚合和存档到S3)。我的问题是:
${spark.yarn.app.container.log.dir}
为什么解析为空字符串?
是否有一种方法可以自动将驱动程序日志存档到S3(就像执行日志一样)?