APAche Spark logging to Kafka with Log4j v1 Kafka appender



我已经在网上搜索了答案,但我无法得到任何东西,所以也许有人有一个新的视角。

  • 我正在尝试从Apache Spark 2.2内部将日志写入Kafka主题 应用。
  • 因为Spark仍然使用Log4j v1,所以我必须尝试获得 v1 Kafka 追加器工作,而不是能够使用 默认的 Kafka appender 随 Log4j v2 提供。
  • 我可以在通过 IntelliJ 运行的小型演示应用程序中使用以下库(来自 build.sbt)执行此操作:

    v1 Log4j appender 需要旧版本的 Kafka libraryDependencies += "org.apache.kafka" %% "kafka" % "0.8.2.2">

  • 但是我找不到一种方法来让它通过例如火花壳或火花提交来运行。

  • 我可以使用与虚拟应用程序中相同的设置在Spark的log4j.properties中配置追加器。

  • 但是当 Spark shell 启动时,它似乎在加载任何额外的 JAR 之前启动了记录器,然后立即抛出错误,因为它找不到 Kafka 追加器:

    log4j:ERROR 无法实例化类 [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 等。

似乎什么都不起作用,所以有没有人让它工作,即 Spark 2.2.通过 Log4j 登录到 Kafka,如果是这样,他们是否可以建议正确的配置选项来允许我这样做?

顺便说一句,SO上有几个类似的问题,但没有一个为我解决了问题,所以请不要将其标记为重复。

感谢您提供的任何提示!

kafka-log4j-appender with Spark

我设法在kafka-log4j-appender 2.3.0cluster模式下使用spark-submit 2.1.1,但我相信其他版本的行为会类似。


制备

首先,我认为读取日志真的很有帮助,因此您需要能够读取应用程序纱线日志和spark-submit信息。 有时,当应用程序在ACCEPT阶段挂起时(由于 kafka 生产者配置错误),需要从 Hadoop Yarn 应用程序概述中读取日志。

因此,每当我启动我的应用程序时,抓住它是非常重要的

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。我以前有一些类似的问题的经验,它不起作用。仅仅因为在集群环境中,您的类路径被 Spark 覆盖。因此,如果它也不适合您,请继续前进。

选项 A. 手动下载 jar:

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

您实际上需要两者,因为没有客户端,追加器将无法工作。
将它们放在您发射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. 使用--packages从 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是如何在hdfsapplication_1569430771458_10776文件夹中调用的。

现在用于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