如何在向Amazon EMR提交spark-submit时指定自定义log4j.configuration的位置?

时间:2017-05-19 01:15:38

标签: java apache-spark log4j amazon-emr

我正在尝试在EMR集群中运行一个火花作业。

我的spark-submit我添加了从log4j.properties

读取的配置
--files log4j.properties --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/log4j.properties"

我也添加了

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

在我的log4j配置中。

无论如何我在控制台中看到了日志,但我没有看到生成的日志文件。我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

引用<div class="tbldiv"> <table class="scroll"> <thead> <tr> <th class="col-md-2">Name</th> <th class="col-md-2">Birthday</th> <th class="col-md-2">Gender</th> <th class="col-md-2">Marital</th> <th class="col-md-2">Address</th> <th class="col-md-2">Telephone</th> <th class="col-md-2">Email</th> </tr> </thead> <tbody> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> <tr> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> <td>Some Data</td> </tr> </tbody> </table> </div>

  

- 文件FILES 要放在每个执行程序的工作目录中的以逗号分隔的文件列表。可以通过spark-submit --help访问执行程序中这些文件的文件路径。

如果你不能使用SparkFiles.get(fileName)(你不能用于log4j),那么如何处理FILES并不多。

引用SparkFiles.get(fileName)的{​​{3}}:

  

获取通过SparkFiles.get添加的文件的绝对路径。

这也不会给你太多,但建议看一下scaladoc

SparkContext.addFile()

关于它的好处是def get(filename: String): String = new File(getRootDirectory(), filename).getAbsolutePath() source code of SparkFiles.get

getRootDirectory()

这给予了一些工作,不是吗?

在驱动程序上,所谓的def getRootDirectory(): String = SparkEnv.get.driverTmpDir.getOrElse(".") 目录应该很容易在Web UI的Environment选项卡中找到(在Spark属性下的driverTmpDir属性或Classpath条目中标记为“User By User”在源代码中列)。

在执行者身上,我假设一个本地目录,而不是使用spark.files我会使用

file:/log4j.properties

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

注意点用于指定本地工作目录(在第一个选项中)或没有前导-Dlog4j.configuration=file:log4j.properties (在后者中)。

不要忘记/为驱动程序设置Java选项,如果那是你还没想过的话。到目前为止,你一直专注于执行者。

您可能希望将spark.driver.extraJavaOptions添加到-Dlog4j.debug=true,以便打印log4j用于查找spark.executor.extraJavaOptions的位置。

我自己没有在EMR或YARN群集上检查过这个答案,但相信可能会给你一些提示,在哪里可以找到答案。 手指交叉!

答案 1 :(得分:1)

对于Spark 2.2.0独立集群,首先启动执行器JVM,然后Spark才分发应用程序jar和--files 表示通过

  

spark.executor.extraJavaOptions = -Dlog4j.configuration = file:log4j-spark.xml

没有意义,因为在执行程序JVM启动时和log4j初始化时该文件尚不存在(尚未下载)

如果通过

  

spark.executor.extraJavaOptions = -Dlog4j.debug -Dlog4j.configuration = file:log4j-spark.xml

您会在执行程序的stderr尝试加载log4j配置文件的尝试失败的开头找到

log4j:ERROR Could not parse url [file:log4j-spark.xml].
java.io.FileNotFoundException: log4j-spark.xml (No such file or directory)
...
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties

稍后会记录从驱动程序下载--files

18/07/18 17:24:12 INFO Utils: Fetching spark://123.123.123.123:35171/files/log4j-spark.xml to /ca/tmp-spark/spark-49815375-3f02-456a-94cd-8099a0add073/executor-7df1c819-ffb7-4ef9-b473-4a2f7747237a/spark-0b50a7b9-ca68-4abc-a05f-59df471f2d16/fetchFileTemp5898748096473125894.tmp
18/07/18 17:24:12 INFO Utils: Copying /ca/tmp-spark/spark-49815375-3f02-456a-94cd-8099a0add073/executor-7df1c819-ffb7-4ef9-b473-4a2f7747237a/spark-0b50a7b9-ca68-4abc-a05f-59df471f2d16/-18631083971531927447443_cache to /opt/spark-2.2.0-bin-hadoop2.7/work/app-20180718172407-0225/2/./log4j-spark.xml

它可能与yarn或其他集群管理器不同,但对于独立集群,似乎无法在spark-submit上为执行者指定自己的日志记录配置。

您可以在作业代码(override log4j configuration programmatically: file location for FileAppender)中动态地重新配置log4j,但是您需要在执行程序的JVM中执行的某些mapPartition lambda中仔细进行此操作。或者,您可以将工作的第一阶段专用于此。一切都糟透了...

答案 2 :(得分:0)

这是我用来在EMR中运行我的超级jar的完整命令,我看到在驱动程序和执行程序节点中生成的日志文件。

spark-submit --class com.myapp.cloud.app.UPApp --master yarn --deploy-mode client --driver-memory 4g --executor-memory 2g --executor-cores 8 --files log4j .properties --conf“spark.executor.extraJavaOptions = -Dlog4j.configuration = file:log4j.properties”--conf“spark.driver.extraJavaOptions = -Dlog4j.configuration = file:log4j.properties -Dlog4j.debug = true” --conf“spark.executor.extraJavaOptions = -Dlog4j.configuration = file:log4j.properties”--conf“spark.eventLog.dir = / mnt / var / log /”uber-up-0.0.1.jar

其中log4j.properties位于我的本地文件系统中。