在AWS EMR中运行Spark时使用自定义Log4J附加程序

时间:2018-11-16 16:23:55

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

我正在尝试在AWS EMR中执行spark提交以执行一个简单项目,该项目使用我编写的自定义log4j附加程序。
通过在群集软件设置中提供以下配置,我无法传递我的log4j属性:

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

]

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

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

我正在使用以下命令执行集群:command-runner.jar
并执行以下命令:
火花提交-部署模式客户端-类Main s3:// {path_to_jar} .jar

这里有几个问题:

  1. 集群中的哪个组件会加载log4j记录器和属性?它发生在主节点上吗?在核心节点?
  2. 我该怎么做才能解决此问题?我应该如何不同地执行它?如何使其能够识别我的自定义附加类?

谢谢!

1 个答案:

答案 0 :(得分:0)

我还开发了一个自定义的log4j附加程序类,并在我的log4j.properties文件中按如下方式使用了它,没问题:

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

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

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