Java Spark:从worker向驱动程序发送调试文本

Java Spark:从worker向驱动程序发送调试文本,java,debugging,apache-spark,Java,Debugging,Apache Spark,我想诊断一些错误。我相信我不应该为了我的问题找到一个好的解决方案而讲述整个场景。因此,我想在worker上创建一些调试信息,并在驱动程序上显示它,可能是实时的 我在某个地方读到,对一个worker发出System.out.println(“DEBUG:…”)会在executor日志中产生一行,但目前我在检索这些日志时遇到了问题。除此之外,如果我能在计算运行时在驱动程序上看到一些调试噪音,这仍然是有用的 (我也想出了一个解决办法,但我不知道是否应该应用它。在每个辅助任务结束时,我可以将元素附加到序

我想诊断一些错误。我相信我不应该为了我的问题找到一个好的解决方案而讲述整个场景。因此,我想在worker上创建一些调试信息,并在驱动程序上显示它,可能是实时的

我在某个地方读到,对一个worker发出
System.out.println(“DEBUG:…”)
会在executor日志中产生一行,但目前我在检索这些日志时遇到了问题。除此之外,如果我能在计算运行时在驱动程序上看到一些调试噪音,这仍然是有用的


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

我可以想到的一种方法是(ab)使用自定义acummulator将来自辅助任务的消息发送给驱动程序。这将从工作人员向驱动程序发送任何字符串消息。在驱动程序上,您可以打印内容以收集信息。它不是实时的,因为它取决于程序的执行

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)

不确定您为什么无法访问工作日志-顺便说一句,这将是最简单的解决方案。

当我尝试浏览它时,会出现一条错误消息,因为存在一些配置问题。他们最终会解决的。明天将尝试您的解决方案。此解决方案将在收集之前运行吗?只是因为,在任何类型的收集之前,任何工人都不会移动。但是如果我开始收集,我将崩溃,并且没有任何调试信息。不,您确实需要通过请求RDD上的某些操作来执行计算。正如我提到的,这是一种“滥用”,更像是一种黑客行为,目的是按照问题中的要求获取数据。通常的做法是使用
日志记录
并查找员工的日志。