我在尝试在YARN(CDH)上使用Spark(1.6.1)的自定义Log4j布局时遇到了一个奇怪的问题。布局为:https://github.com/michaeltandy/log4j-json
如果我使用log4j.properties文件(随--files提供):
log4j.appender.consolejson=org.apache.log4j.ConsoleAppender
log4j.appender.consolejson.target=System.err
log4j.appender.consolejson.layout=uk.me.mjt.log4jjson.SimpleJsonLayout
将log4j-json.1.0.jar与--jars
一起提供给spark-submit
,驱动程序和执行程序在日志文件的开头抛出异常:
log4j:ERROR Could not instantiate class [uk.me.mjt.log4jjson.SimpleJsonLayout].
java.lang.ClassNotFoundException: uk.me.mjt.log4jjson.SimpleJsonLayout
但是,一个简单的火花工作就像:
sc.parallelize(List(1,2,3)).foreach(i => {Class.forName("uk.me.mjt.log4jjson.SimpleJsonLayout")})
不会抛出错误。所以正在加载类,但是Log4j没有及时使用它。
我尝试了一些不同的选项试图让它工作(包括它在YARN应用程序类路径,spark执行器类路径等),它们都产生相同的结果。唯一似乎有用的是构建一个自定义的火花装配,其中包含core/pom.xml
中的maven依赖。这样,布局包含在spark程序集jar中,我得到了所需的JSON日志输出。
使用--jars
时Log4j上是否存在类加载问题?我无法想象为什么它适用于火花装配中的捆绑,但不适用于--jars
。