关于Scala:无法记录Spark作业的输出

Unable to log spark job output

我已经在scala中创建了一个小程序,可以在spark环境中运行。我有一个独立的群集配置。我提交了作业,并且作业在工作者计算机上成功运行。我可以在控制台中看到结果,但是当我打开浏览器以查看工作日志时,它不会在标准输出中打印任何内容。只有stderr有一些日志。我正在使用println进行打印以在程序中进行打印。我错过了什么吗?

这是程序

1
2
3
4
5
6
7
8
9
10
11
object SimpleJob {
  def main(args: Array[String]) {
    val logFile ="/var/log/syslog" // Should be some file on your system
    val conf = new SparkConf().setAppName("Spark log file reader");
    val sc = new SparkContext(conf)
    val logData = sc.textFile(logFile, 2).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
  }
}

更新
这是我的log.properties文件。

1
2
3
4
5
6
7
8
9
10
11
12
# Set everything to be logged to the console
log4j.rootCategory=INFO, stdout
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.spark-project.jetty=WARN
log4j.logger.org.spark-project.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

我认为我在评论中张贴的Zero323答案链接为您找到了答案。基本上,工作程序输出将没有输出,但驱动程序将包含该日志记录。主程序中的所有内容,而不是闭包中的所有内容,都将通过驱动程序运行。

这是一个伪程序示例,其中注释了日志将在何处结束:

1
2
3
4
5
6
7
8
9
10
11
object SimpleJob {
  def main(args: Array[String]) {
    ...
    val logData = sc.textFile(logFile, 2).cache()
    val numAs = logData.filter(line => {
      println("Closure Stuff")//Displayed/Logged in the worker
      line.contains("a")
    }).count()
    println("Stuff")//Displayed/Logged in the driver
  }
}

此外,根据提供的链接,我相当肯定stderr显示log4j输出,而stdout显示println输出