使用log4j将spark on yarn任务的日志发送到kafka

1.将spark streaming以yarn cluster运行后,查看日志是一件比较麻烦的事情。
需要停止任务,再用yarn log命令收集。
而这无疑违背了实时程序7-24运行的原则。

2.在我搜索解决方法时,发现可以使用kafka-log4j-appender将日志发送到kafka的主题
在maven引入依赖

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

在log4j.properties进行相应配置

log4j.rootCategory=INFO, kafka
# appender kafka
log4j.appender.kafka=org.apache.kafka.log4jappender.KafkaLog4jAppender
log4j.appender.kafka.topic=sparklog
log4j.appender.kafka.brokerList=localhost:9092
log4j.appender.kafka.compressionType=none
log4j.appender.kafka.syncSend=false
log4j.appender.kafka.layout=org.apache.log4j.PatternLayout
#log4j.appender.kafka.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
log4j.appender.kafka.layout.ConversionPattern=[%d] [%p] [%t] %m%n

做完这些后,我在idea中运行spark streaming程序,消费主题确实能接收到日志。

3.但之后以yarn-cluser运行时,发现无法接收到日志,查看后发现

log4j:ERROR Could not instantiate class [kafka.producer.KafkaLog4jAppender].
java.lang.ClassNotFoundException: kafka.producer.KafkaLog4jAppender

这时我已经将依赖引入,并且使用maven-assembly-plugin将所有依赖打入jar包了。
经过一番实验,我发现在spark的jars目录下,放入kafka-log4j-appender-1.0.1.jar和kafka-clients-1.0.1.jar可以解决。
我试过放kafka-clients-2.0.1.jar,但造成了提交到yarn后一直卡accepted状态指导failed。

我将这两个jar包上传,公共资源,我会设置0积分。下载链接

当然收集日志还有其他方式,例如使用filebeat,大家可以自行研究。
以上经历供大家参考。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值