我正在尝试在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配置中。
无论如何我在控制台中看到了日志,但我没有看到生成的日志文件。我在这里做错了什么?
答案 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位于我的本地文件系统中。