【问题标题】:Unable to log from Spark Streaming无法从 Spark Streaming 记录
【发布时间】:2016-10-18 13:41:27
【问题描述】:

我正在尝试记录火花流的输出,如下面的代码所示

dStream.foreachRDD { rdd =>

  if (rdd.count() > 0) {
    @transient lazy val log = Logger.getLogger(getClass.getName)  
    log.info("Process Starting")

      rdd.foreach { item =>

     log.info("Output :: "+item._1 + "," + item._2 + "," + System.currentTimeMillis())
    }
 }

代码在纱线集群上执行,使用如下命令

./bin/spark-submit --class "StreamingApp" --files file:/home/user/log4j.properties  --conf  "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/home/user/log4j.properties" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/home/user/log4j.properties" --master yarn --deploy-mode cluster --driver-memory 4g --executor-memory 2g --executor-cores 1 /home/user/Abc.jar

当我从yarn集群查看日志时,我可以找到写在foreach之前的日志,即log.info("Process Starting"),但是foreach里面的日志没有打印出来。

我也尝试过创建一个单独的可序列化类,如下所示

    object LoggerObj extends Serializable{

        @transient lazy val log = Logger.getLogger(getClass.getName)
   }

并使用相同的内部foreach如下

dStream.foreachRDD { rdd =>

  if (rdd.count() > 0) {

    LoggerObj.log.info("Process Starting")

      rdd.foreach { item =>

     LoggerObj.log.info("Output :: "+item._1 + "," + item._2 + "," + System.currentTimeMillis())
    }
 }

但仍然是同样的问题,只打印了 foreach 之外的日志。

log4j.properties 如下所示

log4j.rootLogger=INFO,stdout,FILE
log4j.rootCategory=INFO,FILE
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=/tmp/Rt.log
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=true
log4j.appender.FILE.MaxFileSize=500MB
log4j.appender.FILE.MaxBackupIndex=10
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
log4j.logger.Holder=INFO,FILE

【问题讨论】:

  • 您需要查看您的 Worker 节点,您会在每个节点中找到一个 /tmp/Rt.log
  • Foreach 是一个动作。当您的管道运行时,在 Spark UI 的“执行程序”选项卡中查找驱动程序的 stdout/stderr 链接,其中执行程序 ID 为“驱动程序”。检查那里的日志,如果你能在那里找到,请告诉我。
  • @RakeshRakshit 我只能找到写在 foreach 之前的日志,即 log.info("Process Starting") 而不是 foreach 中的日志。
  • @YuvalItzchakov 我检查了工作节点但找不到 /tmp/Rt.log 文件
  • 你有写那里的权限吗?您的 log4j.properties 是否在工作节点中正确设置?

标签: apache-spark foreach log4j spark-streaming


【解决方案1】:

我可以通过在每个工作节点下放置“log4j.properties”文件来修复它。

【讨论】:

  • 你能将 foreach 中的日志打印到 unix 文件 loacton 吗?我尝试并能够在 spark 驱动程序中查看到 stderr 的日志。但无法将日志捕获到 UNIX 文件。你能建议吗
  • 是的,按照上述方法,日志会在每个工作节点下的 /tmp/Rt.log 位置生成,如 log4j.properties 文件中给出的那样
  • 你是如何将 log4j 属性传递给每个工作节点的?
  • 创建了一个名为“Holder”的新对象,其中我将变量“log”初始化为“lazy val log = Logger.getLogger(getClass.getName)”。然后在不同的代码中使用它来记录,例如Holder.log.info("RDD大小::" + rdd.count())
  • 我也是这样做的,但是记录器正在 spark 驱动程序上打印结果 (Spark application UI ->Spark Job name ->Executors->logs-> STDERR)。我正在尝试将流式作业中的日志(从 rdd.foreach 循环内部)打印到 unix 位置的 unix 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2018-02-05
  • 2021-03-06
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多