如何在纱线群模式下打印累加器?

时间:2017-08-13 14:50:45

标签: scala apache-spark yarn

我有以下程序来计算日志文件中“ERROR”的计数。最后,它的值打印在控制台中。当程序在yarn-client中运行时,它在控制台中显示累加器正确值509,但是当它以纱线群集模式运行时,不显示这样的值。如何在纱线群集模式下打印?

object ErrorLogsCount{
  def main(args:Array[String]){
    val sc = new SparkContext();    
    val logsRDD = sc.textFile(args(0),4)
    val errorsAcc = sc.accumulator(0,"Errors Accumulator")
    val errorsLogRDD = logsRDD.filter(x => x.contains("ERROR"))
    errorsLogRDD.persist()
    errorsLogRDD.foreach(x => errorsAcc += 1)
    errorsLogRDD.collect()

    //printing accumulator
    println(errorsAcc.name+" = "+errorsAcc)

    //Saving results in HDFS
    errorsLogRDD.coalesce(1).saveAsTextFile(args(1))
  }
}

尝试在HDP Sandbox 2.4(Spark 1.6.0)中运行

1 个答案:

答案 0 :(得分:1)

不在纱线群集模式下打印的原因是当火花应用程序在纱线群集模式下运行时,驱动程序在群集的一个节点而不是客户端shell中运行。这就是原因,它的控制台输出可以在各个节点的日志文件中看到。如果yarn.log-aggregation-enableyarn-site.xml为真,则可以使用

查看日志
yarn logs -applicationId [application_id]

如果将属性设置为false,则可以在yarn-site.xml中设置的日志位置查看它们。财产是

yarn.nodemanager.log-dirs

就我而言,日志聚合已启用,因此我可以看到应用程序日志文件中打印的累加器值。