Apache spark spark executor中的自定义log4j追加器

Apache spark spark executor中的自定义log4j追加器,apache-spark,log4j,Apache Spark,Log4j,我试图在spark executor中使用定制的log4j appender,以便将所有日志转发给ApacheKafka 问题是,log4j是在fatjar的类加载器和appender注册之前初始化的,因此我最终得到以下结果: log4j:ERROR Could not instantiate class [kafka.producer.KafkaLog4jAppender]. java.lang.ClassNotFoundException: kafka.producer.KafkaLog4j

我试图在spark executor中使用定制的log4j appender,以便将所有日志转发给ApacheKafka

问题是,log4j是在fatjar的类加载器和appender注册之前初始化的,因此我最终得到以下结果:

log4j:ERROR Could not instantiate class [kafka.producer.KafkaLog4jAppender].
java.lang.ClassNotFoundException: kafka.producer.KafkaLog4jAppender
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:260)
    at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
    at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:327)
    at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:124)
    at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:785)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
    at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526)
    at org.apache.log4j.LogManager.<clinit>(LogManager.java:127)
    at org.apache.spark.Logging$class.initializeLogging(Logging.scala:122)
    at org.apache.spark.Logging$class.initializeIfNecessary(Logging.scala:107)
    at org.apache.spark.Logging$class.log(Logging.scala:51)
    at org.apache.spark.executor.CoarseGrainedExecutorBackend$.log(CoarseGrainedExecutorBackend.scala:126)
    at org.apache.spark.executor.CoarseGrainedExecutorBackend$.run(CoarseGrainedExecutorBackend.scala:137)
    at org.apache.spark.executor.CoarseGrainedExecutorBackend$.main(CoarseGrainedExecutorBackend.scala:235)
    at org.apache.spark.executor.CoarseGrainedExecutorBackend.main(CoarseGrainedExecutorBackend.scala)
log4j:ERROR Could not instantiate appender named "KAFKA".
2015-09-29 13:10:43 [driverPropsFetcher-akka.actor.default-dispatcher-4] INFO akka.event.slf4j.Slf4jLogger: Slf4jLogger started
2015-09-29 13:10:43 [driverPropsFetcher-akka.actor.default-dispatcher-4] INFO Remoting: Starting remoting
2015-09-29 13:10:43 [driverPropsFetcher-akka.actor.default-dispatcher-4] INFO Remoting: Remoting started; listening on addresses :[akka.tcp://driverPropsFetcher@gin3.dev:36918]
2015-09-29 13:10:43 [driverPropsFetcher-akka.actor.default-dispatcher-4] INFO Remoting: Remoting now listens on addresses: [akka.tcp://driverPropsFetcher@gin3.dev:36918]
2015-09-29 13:10:44 [driverPropsFetcher-akka.actor.default-dispatcher-4] INFO akka.remote.RemoteActorRefProvider$RemotingTerminator: Shutting down remote daemon.
2015-09-29 13:10:44 [driverPropsFetcher-akka.actor.default-dispatcher-4] INFO akka.remote.RemoteActorRefProvider$RemotingTerminator: Remote daemon shut down; proceeding with flushing remote transports.
2015-09-29 13:10:44 [sparkExecutor-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger: Slf4jLogger started
2015-09-29 13:10:44 [sparkExecutor-akka.actor.default-dispatcher-2] INFO Remoting: Starting remoting
2015-09-29 13:10:44 [sparkExecutor-akka.actor.default-dispatcher-2] INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkExecutor@gin3.dev:40067]
2015-09-29 13:10:44 [sparkExecutor-akka.actor.default-dispatcher-2] INFO Remoting: Remoting now listens on addresses: [akka.tcp://sparkExecutor@gin3.dev:40067]
2015-09-29 13:10:44 [driverPropsFetcher-akka.actor.default-dispatcher-5] INFO Remoting: Remoting shut down
....
log4j:错误无法实例化类[kafka.producer.KafkaLog4jAppender]。
java.lang.ClassNotFoundException:kafka.producer.KafkaLog4jAppender
在java.net.URLClassLoader$1.run(URLClassLoader.java:372)
在java.net.URLClassLoader$1.run(URLClassLoader.java:361)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:360)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:260)
位于org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
在org.apache.log4j.helpers.OptionConverter.InstanceByCassName上(OptionConverter.java:327)
在org.apache.log4j.helpers.OptionConverter.InstanceByKey上(OptionConverter.java:124)
位于org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:785)
位于org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:768)
位于org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:648)
位于org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:514)
位于org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:580)
在org.apache.log4j.helpers.OptionConverter.selectAndConfigure上(OptionConverter.java:526)
登录org.apache.log4j.LogManager(LogManager.java:127)
位于org.apache.spark.Logging$class.initializeLogging(Logging.scala:122)
位于org.apache.spark.Logging$class.initializeIfNecessary(Logging.scala:107)
位于org.apache.spark.Logging$class.log(Logging.scala:51)
位于org.apache.spark.executor.RoughGrainedExecutorBackend$.log(RoughGrainedExecutorBackend.scala:126)
位于org.apache.spark.executor.RoughGrainedExecutorBackend$.run(RoughGrainedExecutorBackend.scala:137)
位于org.apache.spark.executor.RoughGrainedExecutorBackend$.main(RoughGrainedExecutorBackend.scala:235)
位于org.apache.spark.executor.RoughGrainedExecutorBackend.main(RoughGrainedExecutorBackend.scala)
log4j:错误无法实例化名为“KAFKA”的appender。
2015-09-29 13:10:43[driverPropsFetcher akka.actor.default-dispatcher-4]INFO akka.event.slf4j.Slf4jLogger:Slf4jLogger已启动
2015-09-29 13:10:43[driverPropsFetcher akka.actor.default-dispatcher-4]信息远程处理:开始远程处理
2015-09-29 13:10:43[driverPropsFetcher akka.actor.default-dispatcher-4]信息远程处理:远程处理已开始;收听地址:[阿克卡。tcp://driverPropsFetcher@gin3.开发:36918]
2015-09-29 13:10:43[driverPropsFetcher akka.actor.default-dispatcher-4]信息远程处理:远程处理现在监听地址:[akka。tcp://driverPropsFetcher@gin3.开发:36918]
2015-09-29 13:10:44[driverPropsFetcher akka.actor.default-dispatcher-4]INFO akka.remote.RemoteActorRefProvider$RemotingTerminator:关闭远程守护程序。
2015-09-29 13:10:44[driverPropsFetcher akka.actor.default-dispatcher-4]INFO akka.remote.RemoteActorRefProvider$RemotingTerminator:远程守护程序关闭;继续刷新远程传输。
2015-09-29 13:10:44[sparkExecutor akka.actor.default-dispatcher-3]INFO akka.event.slf4j.Slf4jLogger:Slf4jLogger已启动
2015-09-29 13:10:44[sparkExecutor akka.actor.default-dispatcher-2]信息远程处理:开始远程处理
2015-09-29 13:10:44[sparkExecutor akka.actor.default-dispatcher-2]信息远程处理:远程处理已启动;收听地址:[阿克卡。tcp://sparkExecutor@gin3.dev:40067]
2015-09-29 13:10:44[sparkExecutor akka.actor.default-dispatcher-2]信息远程处理:远程处理现在监听地址:[akka。tcp://sparkExecutor@gin3.dev:40067]
2015-09-29 13:10:44[driverPropsFetcher akka.actor.default-dispatcher-5]信息远程处理:远程处理关闭
....
问题似乎就在这里:

有什么简单的方法可以解决这个问题吗?我们目前正在使用Spark 1.3.x

谢谢


David

卡夫卡的hadoop制作人。卡夫卡卢格4Jappender
在卡夫卡的hadoop制作人中

因此,您可以添加此依赖项来修复它

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>hadoop-producer</artifactId>
    <version>0.8.0</version>
</dependency>

org.apache.kafka
hadoop生成器
0.8.0

最后提交了额外的jar,并记录deps,然后在用户类路径之前加载它

LOG_JAR="${THISDIR}/../lib/logging.jar"
spark-submit ...... \
  --files "${LOG4J_CONF},${LOG_JAR}" \
  --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=`basename ${LOG4J_CONF}`" \
  --conf "spark.driver.extraClassPath=`basename ${LOG_JAR}`" \
  --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=`basename ${LOG4J_CONF}`" \
  --conf "spark.executor.extraClassPath=`basename ${LOG_JAR}`" \
  ...

也面临同样的问题,我将发布对我有效的内容,结果是
KafkaLog4jAppender
类包名称在kafka 0.9中更改,下面是我所做的,在pom中添加了依赖项

<dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-log4j-appender</artifactId>
        <version>0.9.0.0</version>
    </dependency>


有什么办法吗?spark 1.6中存在同样的问题,在
basename
中可以放置什么路径?你呢?当我以客户端模式提交作业时,基本名称可以是提交主机的本地路径。遗嘱执行人呢?有点困惑。
log4j.appender.KAFKA=kafka.producer.KafkaLog4jAppender
log4j.appender.KAFKA=org.apache.kafka.log4jappender.KafkaLog4jAppender