Apache spark Spark中的自定义log4j布局(纱线上)-ClassNotFoundException

Apache spark Spark中的自定义log4j布局(纱线上)-ClassNotFoundException,apache-spark,log4j,yarn,Apache Spark,Log4j,Yarn,我在尝试为Spark(1.6.1)on Thread(CDH)使用定制Log4j布局时遇到了一个奇怪的问题。布局如下: 如果将log4j.properties文件(随--files一起提供)用于: 并向log4j-json.1.0.jar提供--jars到spark submit,驱动程序和执行程序会在日志文件的开头抛出异常: log4j:ERROR Could not instantiate class [uk.me.mjt.log4jjson.SimpleJsonLayout]. java.

我在尝试为Spark(1.6.1)on Thread(CDH)使用定制Log4j布局时遇到了一个奇怪的问题。布局如下:

如果将log4j.properties文件(随--files一起提供)用于:

并向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
但是,一个简单的spark作业可以执行以下操作:

sc.parallelize(List(1,2,3)).foreach(i => {Class.forName("uk.me.mjt.log4jjson.SimpleJsonLayout")})
不会抛出错误。因此类正在被加载,但没有及时让Log4j使用它

我尝试了几个不同的选项来让它工作(包括在Thread应用程序类路径、spark executor类路径等中),它们都产生相同的结果。唯一有效的方法是使用
core/pom.xml
中包含的maven依赖项构建定制spark程序集。这样,布局就包含在spark assembly jar中,我得到了所需的JSON日志输出


使用
--jars
时,Log4j上是否存在类加载问题?我无法想象为什么它能与spark assembly中的捆绑一起工作,但不能与
--jars一起工作

找到解决方案了吗?
sc.parallelize(List(1,2,3)).foreach(i => {Class.forName("uk.me.mjt.log4jjson.SimpleJsonLayout")})