我正在测试我的星火流应用程序,我的代码中有多个函数:-其中一些在DStream[RDDXXX]上运行,有些在RDDXXX上运行。
我使用Kafka log4j appender记录在我的函数中发生的业务用例,这些案例都是在DStreamRDD & RDD it self上运行的。
但是,只有在运行在RDD ->上的函数中,数据才会被附加到Kafka,而当我想从运行在DStream上的函数中将数据附加到kafka时,数据就不起作用了。
有人知道这种行为的原因吗?
我正在一台虚拟机上工作,在那里我拥有Spark & Kafka。我提交申请使用火花提交。
编辑的
事实上,我已经找出了问题的所在。数据仅从我的主要函数中的代码部分附加到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文件发送给执行者,但不起作用。我试过:
--conf "spark.executor.extraJavaOptions =-Dlog4j.configuration=file:/home/vagrant/log4j.properties"这些选择都不起作用。
有人找到解决办法了吗?我在错误日志中没有看到任何错误。
谢谢
发布于 2016-07-25 18:45:00
我认为您是close..first,希望确保使用标志将所有文件导出到所有节点上的工作目录(而不是CLASSPATH)。然后要将这些文件引用到执行程序和驱动程序的extracClassPath选项。我已经附加了以下命令,希望能有所帮助。关键是理解一旦文件被导出,所有文件都可以使用工作目录的文件名(而不是url路径)在节点上访问。
注意:将log4j文件放入“资源”文件夹将无法工作。(至少当我试过的时候,它没有。)
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.jarhttps://stackoverflow.com/questions/36158722
复制相似问题