我想诊断一些错误。我相信我不应该告诉整个场景为我的问题找到一个好的解决方案。所以,我想在worker上创建一些调试信息,并将其显示在驱动程序上,可能是实时的。
我在某处读到,在工作程序上发出System.out.println("DEBUG: ...")
会在执行程序日志中生成一行,但是目前我在检索这些日志时遇到了问题。除此之外,如果我在计算运行时可以在驱动程序上看到一些调试噪声,那么它仍然是有用的。
(我也想出了一个解决方法,但我不知道是否应该应用它。在每个工作任务结束时,我可以将元素附加到序列文件中,我可以监视它,或者检查它结束。)
答案 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最直接的解决方案。