nnc*_*nnc 5 java log4j amazon-emr apache-spark
我正在尝试在 EMR 集群中运行 Spark 作业。
我的 spark-submit 我添加了配置以从 log4j.properties 中读取
--files log4j.properties --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/log4j.properties"
Run Code Online (Sandbox Code Playgroud)
我也添加了
log4j.rootLogger=INFO, file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=/log/test.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %5p %c{7} - %m%n
Run Code Online (Sandbox Code Playgroud)
在我的 log4j 配置中。
无论如何,我在控制台中看到了日志,但我没有看到生成的日志文件。我在这里做错了什么?
引用spark-submit --help:
--files FILES要放置在每个执行程序的工作目录中的以逗号分隔的文件列表。执行器中这些文件的文件路径可以通过
SparkFiles.get(fileName).
FILES这并没有说明如果你不能使用 SparkFiles.get(fileName)(log4j 不能使用)该怎么办。
引用SparkFiles.getscaladoc :
获取通过添加的文件的绝对路径
SparkContext.addFile()。
这也没有给你太多信息,但建议查看SparkFiles.get 的源代码:
def get(filename: String): String =
new File(getRootDirectory(), filename).getAbsolutePath()
Run Code Online (Sandbox Code Playgroud)
它的好处是getRootDirectory() 使用可选属性或仅使用当前工作目录:
def getRootDirectory(): String =
SparkEnv.get.driverTmpDir.getOrElse(".")
Run Code Online (Sandbox Code Playgroud)
这就是我们需要做的事情,不是吗?
在驱动程序上,所谓的driverTmpDir目录应该很容易在 Web UI 的“环境”选项卡中找到(在“Spark 属性”下的“spark.files属性”或“源”列中标记为“由用户添加”的类路径条目)。
在执行器上,我会假设一个本地目录,所以file:/log4j.properties我不会使用
-Dlog4j.configuration=file://./log4j.properties
Run Code Online (Sandbox Code Playgroud)
或者
-Dlog4j.configuration=file:log4j.properties
Run Code Online (Sandbox Code Playgroud)
请注意点指定本地工作目录(在第一个选项中)或不指定前导/(在后者中)。
spark.driver.extraJavaOptions如果您还没有考虑过,请不要忘记为驱动程序设置 Java 选项。到目前为止,您只关注执行者。
您可能想要添加-Dlog4j.debug=true应该spark.executor.extraJavaOptions打印 log4j 用于查找的位置log4j.properties。
我自己没有在 EMR 或 YARN 集群上检查过这个答案,但相信这可能给了您一些在哪里找到答案的提示。手指交叉!
| 归档时间: |
|
| 查看次数: |
5777 次 |
| 最近记录: |