在 eclipse Spark scala 调试会话中,在哪里可以找到 RDD 中的数据?

Jer*_*rry 5 eclipse debugging scala apache-spark

我试图调试一个非常简单的 Spark scala 字数统计程序。由于 spark 是“懒惰的”,所以我认为我需要将断点放在“action”语句上,然后运行该行代码,然后我就可以在该语句之前检查那些 RDD 变量并查看它们的数据。所以我在第 14 行设置了一个断点,当调试到达那里时,我点击 step over 运行第 14 行。但是这样做之后,我无法在调试会话变量视图中看到/找到变量 text1、text2 的任何数据。(但是不过,我可以在调试视图中看到“all”变量中的数据)。我这样做对吗?为什么我看不到 text1/text2 变量中的数据?

假设我的 wordCount.txt 是这样的:

这是一个带有单词 aa aa bb cc cc 的文本文件

我希望(aa,2),(bb,1),(cc,2)在 text2 变量视图中的某个地方看到等。但我在那里找不到类似的东西。请参阅代码下方的屏幕截图。

我正在使用 Eclipse Neon 和 Spark2.1,它是一个 Eclipse 本地调试会话。您的帮助将不胜感激,因为经过广泛搜索后我无法获得任何信息。这是我的代码:

package Big_Data.Spark_App 

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object WordCount {
  def main(args: Array[String]){
    val conf=new SparkConf().setAppName("WordCountApp").setMaster("local")
    val sc = new SparkContext(conf)    
    val text = sc.textFile("/home/cloudera/Downloads/wordCount.txt")
    val text1 = text.flatMap(rec=>rec.split(" ")).map(rec=>(rec,1))
    val text2 = text1.reduceByKey( (v1,v2)=>v1+v2).cache

    val all = text2.collect()  //line 14
    all.foreach(println)           
  }
}
Run Code Online (Sandbox Code Playgroud)

这里的调试变量视图显示 text2 变量中没有实际数据

jam*_*rta 1

Spark 不会像您期望的那样评估每个变量,它会构建一个 DAG,一旦调用触发器(例如收集),该 DAG 就会被执行,这篇文章更详细地解释了这一点:DAG 在 RDD 的幕后如何工作?本质上,这些中间变量仅存储您创建的链式操作的引用。如果您想检查中间结果,则需要对每个变量调用collect。

编辑:

上面忘了提到,您还可以选择检查 Spark 操作内的变量。假设您像这样分解映射器:

val conf=new SparkConf().setAppName("WordCountApp").setMaster("local")
val sc = new SparkContext(conf)
val text = sc.textFile("wordcount.txt")
val text1 = text.flatMap{ rec =>
  val splitStr = rec.split(" ") //can inspect this variable
  splitStr.map(r => (r, 1)) //can inspect variable r
}
val text2 = text1.reduceByKey( (v1,v2)=>v1+v2).cache
val all = text2.collect() 
all.foreach(println)
Run Code Online (Sandbox Code Playgroud)

您可以在映射器中放置断点,例如检查splitStr每一行文本,或在下一行中检查r每个单词。