Spark:从工作人员向驱动程序发送调试文本

时间:2014-10-30 16:32:12

标签: java debugging apache-spark

我想诊断一些错误。我相信我不应该告诉整个场景为我的问题找到一个好的解决方案。所以,我想在worker上创建一些调试信息,并将其显示在驱动程序上,可能是实时的。

我在某处读到,在工作程序上发出System.out.println("DEBUG: ...")会在执行程序日志中生成一行,但是目前我在检索这些日志时遇到了问题。除此之外,如果我在计算运行时可以在驱动程序上看到一些调试噪声,那么它仍然是有用的。

(我也想出了一个解决方法,但我不知道是否应该应用它。在每个工作任务结束时,我可以将元素附加到序列文件中,我可以监视它,或者检查它结束。)

1 个答案:

答案 0 :(得分:3)

我能想到这样做的一种方法是(ab)使用自定义的acummulator将来自worker的消息发送给驱动程序。这将获得从工作者到驱动程序的任何String消息。在驱动程序上,您将打印内容以收集信息。它不是实时的,因为它取决于程序的执行。

import org.apache.spark.AccumulatorParam

object LineCummulatorParam extends AccumulatorParam[String] {
      def zero(value:String) : String = value
      def addInPlace(s1:String, s2:String):String = s1 + "\n" + s2
}

val debugInfo = sparkContext.accumulator("","debug info")(DebugInfoCummulatorParam)

rdd.map{rdd => ...
        ...
        ...
        //this happens on each worker
        debugInfo += "something happened here"
        }

//this happens on the driver
println(debugInfo)

不确定为什么你无法访问工作日志 - 这将是BTW最直接的解决方案。