【问题标题】:Use a custom Log4J appender when running spark in AWS EMR在 AWS EMR 中运行 spark 时使用自定义 Log4J appender
【发布时间】:2019-04-19 20:59:38
【问题描述】:

我正在尝试在 AWS EMR 中执行 spark submit 以执行一个使用我编写的自定义 log4j appender 的简单项目。
我可以通过在集群软件设置中提供以下配置来传递我的 log4j 属性:

[{
    "classification": "spark-log4j",
    "properties": {
        "log4j.appender.S": "CustomLog4JAppender",
        "log4j.rootLogger": "DEBUG,S"
    }
}

]

但是当我运行集群步骤时,我得到:
log4j:ERROR 无法实例化类 [CustomLog4JAppender]。 java.lang.ClassNotFoundException: CustomLog4JAppender
在集群标准错误中。

我正在执行的 jar 位于 S3 中,它包含 Main 类、我的 appender 类和所有依赖项。

我正在使用以下命令执行集群:command-runner.jar
并执行以下命令:
spark-submit --deploy-mode client --class Main s3://{path_to_jar}.jar

这里有几个问题:

  1. 集群中的哪个组件加载 log4j 记录器和属性?它发生在主节点中吗?在核心节点?
  2. 我可以做些什么来解决这个问题?我应该如何以不同的方式执行它?如何让它识别我的自定义 appender 类?

谢谢!

【问题讨论】:

    标签: amazon-web-services apache-spark log4j amazon-emr appender


    【解决方案1】:

    我还开发了一个自定义的log4j appender 类,并在我的log4j.properties 文件中使用它,没有问题:

    log4j.rootLogger=ERROR, defaultLog
    log4j.appender.defaultLog=com.my.package.CustomLog4jFileAppender
    

    所以我的猜测是这行代码"log4j.appender.S": "CustomLog4JAppender" 不足以定位您的自定义附加程序,您可能需要提供自定义附加程序类的位置。试试这个:

    "log4j.appender.S": "com.yourPackage.CustomLog4JAppender",
    

    【讨论】:

    • 实际上在我的情况下,附加程序与主程序在同一个包中,因此我的属性是正确的。我能够通过添加一个引导操作来解决这个问题,该操作将带有附加程序的 jar 复制到 /usr/lib/spark/jars/。我不明白的是为什么当它是应用程序 jar 的一部分时它没有看到 appender。
    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2018-02-22
    • 2017-12-13
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多