发生问题的原需求
基于华为云spark,收集spark on yarn流处理任务的executor日志,输出到kafka spark-1.5.1 kafka-1.1.0
前期架构选型
1.flume采集到kafka 2.利用KafkaLog4jAppender 选了第二种,因为1需要先采集到文件在发kafka,考虑会有IO,于是使用log4j原生api直接发送至kafka
实现过程
在启动脚本–jars中添加kafka-log4j-appender-1.1.0.jar,并在客户端对应位置加入该jar exec /sparkmenu/spark-submit --name XXX --keytab /keytabmenu/user.keytab --principal $1 --jars /jarsmenu/1.jar,/jarsmenu/kafka-log4j-appender-1.1.0.jar --files /propmenu/props.properties --deploy-mode cluster --master yarn --driver-memory 1G --num-executors 1 --executor-cores 4 --executor-memory 4G --class myclasspath /mainjarpath/SparkDrools.jar args...
因为只想收集executor日志,所以在spark配置文件/…/spark/conf/spark-defaults.conf中,将涉及到log4j配置文件的部分,由log4j.properties改为log4j-executor.properties,涉及到的配置主要包括:
spark.yarn.cluster.driver.extraJavaOptions = -Dlog4j.configuration=./log4j.properties
spark.driver.extraJavaOptions = -Dlog4j.configuration=./log4j.properties
spark.yarn.dist.innerfiles = /sparkdist/conf/log4j-executor.properties,.....
spark.executor.extraJavaOptions = -Dlog4j.configuration=./log4j-executors.properties
log4j-executors.conf配置:
log4j.rootLogger=info,stdout,kafka
log4j.appender.kafka=org.apache.kafka.log4jappender.KafkaLog4jAppender
log4j.appender.kafka.topic=risk_log
log4j.appender.kafka.brokerList=...
log4j.appender.kafka.layout=com.MyPatternLayout
log4j.appender.kafka.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}|%-5p|%
产生问题
启动spark任务成功,初始化log4j失败,spark executor的stderr日志报找不到类 java.lang.ClassNotFoundException: org.apache.kafka.log4jappender.KafkaLog4jAppender
问题解决
不再在脚本中提交kafka appender包,改将kafka和log4j的相关包全部提到spark-assembly.*.jar里,放spark-defaults.conf中指定的hdfs目录spark.yarn.archive,问题解决
|