使用log4j v1 kafka appender将apache spark日志记录到kafka

dba5bblo  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(432)

我已经在网上搜寻答案了,但我找不到任何有用的东西,所以也许有人有新的观点。
我正在尝试从ApacheSpark2.2应用程序中为kafka主题编写日志。
因为spark仍然使用log4jv1,所以我必须尝试让v1 kafka appender工作,而不是使用log4jv2提供的默认kafka appender。
我可以在一个通过intellij运行的小演示应用程序中使用以下库(来自build.sbt):
//v1 log4j appender librarydependencies+=“org.apache.kafka”%%“kafka”%”“0.8.2.2”需要旧版本的kafka
但我找不到一个办法,让这个运行,例如Spark壳或Spark提交。
我可以在spark的log4j.properties中使用与我的虚拟应用程序相同的设置来配置appender。
但是当spark shell启动时,它似乎会在加载任何额外jar之前启动记录器,然后立即抛出一个错误,因为它找不到kafka appender:
log4j:错误无法示例化类[kafka.producer.kafkalog4jappender]。java.lang.classnotfoundexception:kafka.producer.kafkalog4jappender
我在spark配置文件或cli中尝试了各种选项,以首先加载jar,例如--jars,-files,-driver class path,在spark-default.conf中设置spark.driver.extraclasspath和spark.executor.extraclasspath,等等。
似乎没有什么工作,所以有人曾经得到这个工作,即Spark2.2。通过log4j登录到kafka,如果是的话,他们能建议正确的配置选项让我这样做吗?
顺便说一下,这里有几个类似的问题,但是没有一个能为我解决问题,所以请不要把这个标记为重复。
谢谢你给我的建议!

2wnc66cl

2wnc66cl1#

kafka-log4j-appender带Spark

我设法用了 spark-submit 2.1.1cluster 带的模式 kafka-log4j-appender 2.3.0 ,但我相信其他版本也会有类似的表现。

准备

首先,我认为阅读日志非常有帮助,因此您需要能够阅读应用程序日志和 spark-submit 信息。有时当应用程序挂起时 ACCEPT 阶段(由于kafka的错误配置),有必要从hadoop应用程序概述中读取日志。
因此,每当我启动应用程序时,抓取

19/08/01 10:52:46 INFO yarn.Client: Application report for application_1564028288963_2380 (state: RUNNING)

完成后,从yarn下载所有日志

yarn logs -applicationId application_1564028288963_2380

好吧,让我们试试!

为spark提供kafka-log4j-appender

基本上, spark 缺少 kafka-log4j-appender .
一般来说,你应该能够提供 kafka-log4j-appender 在你的肥jar里。我有一些类似的问题,它不工作以前的经验。只是因为在集群环境中,类路径被spark覆盖。所以,如果这对你也不管用,那就继续吧。

方案a。手动下载jar:

kafka-log4j-appender-2.3.0.jar
kafka-clients-2.3.0.jar

实际上这两个都需要,因为appender没有客户端就无法工作。
把它们放在你发射的同一台机器上 spark-submit 从。
好处是,你可以随意命名。
现在为 client 模式

JARS='/absolute/path/kafka-log4j-appender-2.3.0.jar,/absolute/path/kafka-clients-2.3.0.jar'
JARS_CLP='/absolute/path/kafka-log4j-appender-2.3.0.jar:/absolute/path/kafka-clients-2.3.0.jar'
JARS_NAMES='kafka-log4j-appender-2.3.0.jar:kafka-clients-2.3.0.jar'

spark-submit \
    --deploy-mode client \
    --jars "$JARS"
    --conf "spark.driver.extraClassPath=$JARS_CLP" \
    --conf "spark.executor.extraClassPath=$JARS_NAMES" \

或为 cluster 模式

spark-submit \
    --deploy-mode cluster \
    --jars "$JARS"
    --conf "spark.driver.extraClassPath=$JARS_NAMES" \
    --conf "spark.executor.extraClassPath=$JARS_NAMES" \

方案b。使用--包从maven下载JAR:

我认为这样比较方便,但你必须准确地知道名字。
在跑步过程中,你需要寻找这些类型的线条:

19/11/15 19:44:08 INFO yarn.Client: Uploading resource file:/srv/cortb/home/atais/.ivy2/jars/org.apache.kafka_kafka-log4j-appender-2.3.0.jar -> hdfs:///user/atais/.sparkStaging/application_1569430771458_10776/org.apache.kafka_kafka-log4j-appender-2.3.0.jar
19/11/15 19:44:08 INFO yarn.Client: Uploading resource file:/srv/cortb/home/atais/.ivy2/jars/org.apache.kafka_kafka-clients-2.3.0.jar -> hdfs:///user/atais/.sparkStaging/application_1569430771458_10776/org.apache.kafka_kafka-clients-2.3.0.jar

并记下 jars 被称为内部 application_1569430771458_10776 上的文件夹 hdfs .
现在为 client 模式

JARS_CLP='/srv/cortb/home/atais/.ivy2/jars/org.apache.kafka_kafka-log4j-appender-2.3.0.jar:/srv/cortb/home/atais/.ivy2/jars/org.apache.kafka_kafka-clients-2.3.0.jar'
KAFKA_JARS='org.apache.kafka_kafka-log4j-appender-2.3.0.jar:org.apache.kafka_kafka-clients-2.3.0.jar'

spark-submit \
    --deploy-mode client \
    --packages "org.apache.kafka:kafka-log4j-appender:2.3.0"
    --conf "spark.driver.extraClassPath=$JARS_CLP" \
    --conf "spark.executor.extraClassPath=$KAFKA_JARS" \

或为 cluster 模式

spark-submit \
    --deploy-mode cluster \
    --packages "org.apache.kafka:kafka-log4j-appender:2.3.0"
    --conf "spark.driver.extraClassPath=$KAFKA_JARS" \
    --conf "spark.executor.extraClassPath=$KAFKA_JARS" \

以上应该已经起作用了

额外步骤

如果你想提供 logging.proprietes ,请按照我的教程:https://stackoverflow.com/a/55596389/1549135

相关问题