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