火花流应用程序和kafka log4j appender问题

时间:2016-03-22 15:35:23

标签: apache-spark log4j spark-streaming

我正在测试我的spark流应用程序,我的代码中有多个函数: - 其中一些在DStream [RDD [XXX]]上运行,其中一些在RDD [XXX]上(在我做DStream.foreachRDD之后)。

我使用Kafka log4j appender来记录在我的函数中发生的业务案例,这些案例在DStream [RDD]和& RDD它自己。

但是只有当来自在RDD上运行的函数时才将数据附加到Kafka - >当我想从我在DStream上运行的函数向kafka追加数据时,它不起作用。

有没有人知道这种行为的原因?

我正在使用一台虚拟机,我有Spark&卡夫卡。我使用spark submit提交申请。

已编辑

实际上我已经找出了问题的一部分。数据仅从我的main函数中的代码部分附加到Kafka。所有代码都在我的主要代码之外,并没有将数据写入kafka。

在主要内容我声明了这样的记录器:

val kafkaLogger = org.apache.log4j.LogManager.getLogger("kafkaLogger")

虽然在我的主要之外,我不得不声明它:

@transient lazy val kafkaLogger = org.apache.log4j.LogManager.getLogger("kafkaLogger")

以避免序列化问题。

原因可能是JVM序列化概念背后的原因,或者只是因为工作者没有看到log4j配置文件(但我的log4j文件在我的源代码中,在资源文件夹中)

已编辑2

我已经尝试过多种方法将log4j文件发送给执行程序但不能正常工作。我试过了:

  • 在spark-submit

  • 的--files命令中发送log4j文件
  • 在spark-submit

  • 中设置:--conf "spark.executor.extraJavaOptions =-Dlog4j.configuration=file:/home/vagrant/log4j.properties"
  • 在spark-submit的--driver-class-path中设置log4j.properties文件...

此选项均无效。

任何人都有解决方案吗?我在错误日志中没有看到任何错误..

谢谢

1 个答案:

答案 0 :(得分:0)

我认为你很接近..首先,你要确保使用--files标志将所有文件导出到所有节点上的 WORKING DIRECTORY (而不是CLASSPATH)。然后你想要将这些文件引用到执行器和驱动程序的extracClassPath选项。我附上了以下命令,希望它有所帮助。关键是要理解一旦导出文件,就可以使用工作目录的文件名(而不是url路径)在节点上访问所有文件。

注意:将log4j文件放在resources文件夹中将不起作用。 (至少在我试过的时候,它没有。)

sudo -u hdfs spark-submit --class "SampleAppMain" --master yarn --deploy-mode cluster --verbose --files file:///path/to/custom-log4j.properties,hdfs:///path/to/jar/kafka-log4j-appender-0.9.0.0.jar --conf "spark.driver.extraClassPath=kafka-log4j-appender-0.9.0.0.jar" --conf "spark.executor.extraClassPath=kafka-log4j-appender-0.9.0.0.jar"  --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=custom-log4j.properties" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=custom-log4j.properties"  /path/to/your/jar/SampleApp-assembly-1.0.jar