在eclipse Spark scala调试会话中在RDD中查找数据的位置?

时间:2017-05-16 15:47:16

标签: eclipse scala debugging apache-spark

我尝试调试一个非常简单的Spark scala字数统计程序。因为火花是懒惰的"所以我认为我需要把断点放在"动作"语句,然后运行该行代码,然后我将能够在该语句之前检查那些RDD变量并查看它们的数据。所以我在第14行设置了一个断点,当调试到达那里时,我点击步骤运行第14行。但是在这样做之后,我无法在调试会话变量视图中看到/找到变量text1,text2的任何数据。(但是我可以在调试视图中查看" all"变量中的数据。我这样做了吗?为什么我看不到text1 / text2变量中的数据?

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

  

这是一个带有单词aa aa bb cc cc

的文本文件

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

我正在使用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)           
  }
}

Here's the debug variable view shows that no actual data in text2 variable

2 个答案:

答案 0 :(得分:1)

Spark没有像你期望的那样评估每个变量,它构建了一个在调用触发器后执行的DAG(例如collect),这篇文章更详细地解释了这一点:How DAG works under the covers in 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)

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

答案 1 :(得分:1)

Spark懒洋洋地评估。我做的是..如果我想在控制台上打印,我使用:

rdd.take(20).foreach(x => println(x))

或者更好的是,rdd.sample,rdd.sampleWithDeviation,rdd.sampleWithReplacement,sampleByKey等。这些可以为大型数据集提供更广泛的图像。
然后有一个rdd.toDebugString,你可以打印出来!
最后,您可以在Eclipse / IntelliJ调试器中放置一个断点并观察RDD,但仅在评估之后..否则您将只看到执行计划而不是值。

相关问题