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)
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每个单词。
| 归档时间: |
|
| 查看次数: |
2445 次 |
| 最近记录: |