【问题标题】:How to specify the location of custom log4j.configuration when spark-submit to Amazon EMR?spark-submit 到 Amazon EMR 时如何指定自定义 log4j.configuration 的位置?
【发布时间】:2017-10-18 23:45:11
【问题描述】:

我正在尝试在 EMR 集群中运行 spark 作业。

我的 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 配置中。

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

【问题讨论】:

    标签: java apache-spark log4j amazon-emr


    【解决方案1】:

    引用spark-submit --help:

    --files FILES 逗号分隔的文件列表,放置在每个执行器的工作目录中。这些文件在executors中的文件路径可以通过SparkFiles.get(fileName)访问。

    如果您不能使用 SparkFiles.get(fileName)(对于 log4j 则不能),这并不能说明如何处理 FILES

    引用SparkFiles.getscaladoc

    获取通过SparkContext.addFile()添加的文件的绝对路径。

    这也没有给你太多,但建议看看source code of SparkFiles.get

    def get(filename: String): String =
      new File(getRootDirectory(), filename).getAbsolutePath()
    

    它的好处是getRootDirectory()uses an optional property or just the current working directory

    def getRootDirectory(): String =
      SparkEnv.get.driverTmpDir.getOrElse(".")
    

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

    在驱动程序上,所谓的driverTmpDir目录应该很容易在Web UI的环境选项卡中找到(在spark.files属性的Spark属性下或在源列中标记为“由用户添加”的类路径条目下)。

    在执行程序上,我会假设一个本地目录,而不是使用file:/log4j.properties 我会使用

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

    -Dlog4j.configuration=file:log4j.properties
    

    注意点以指定本地工作目录(在第一个选项中)或没有前导 /(在后者中)。

    不要忘记spark.driver.extraJavaOptions 为驱动程序设置 Java 选项,如果这是您尚未考虑过的事情。到目前为止,您只关注执行者。

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


    我自己没有在 EMR 或 YARN 集群上检查过该答案,但我相信这可能已经为您提供了一些提示,可以在哪里找到答案。 手指交叉!

    【讨论】:

    • 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.eventLog.dir=/mnt/var/log/" uber-up-0.0.1.jar 我正在尝试运行它,但我仍然没有看到在 /log/test.log 位置创建的任何日志文件
    【解决方案2】:

    使用 Spark 2.2.0 独立集群,executor 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 中仔细执行此操作。或者,也许您可​​以将工作的第一阶段专门用于它。不过这一切都很糟糕......

    【讨论】:

      【解决方案3】:

      这是我用来在 EMR 中运行我的 uber-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 在我的本地文件系统中的位置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-02
        • 2016-12-19
        • 2023-04-09
        • 1970-01-01
        • 2019-04-10
        • 2021-09-26
        • 2019-11-27
        • 2023-02-12
        相关资源
        最近更新 更多