使用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,大家可以自行研究。 以上经历供大家参考。
