有一个简单的,可能是奇怪的问题:对于以下代码,DAG执行两次,这是预期的,因为我调用了两次动作:
val input = sc.parallelize(List(1,2,3,4))
val result = input.map(x => {
println("!!! Input Map !!!")
errorLines.add(1)
(x,1)
})
//.reduceByKey(_+_)
println(result.count())
println(result.collect())
如果我取消注释reduceByKey
行 - DAG只会执行一次,虽然reduceByKey
正在转换,而且我会两次调用操作。
这是否意味着Spark并不总是重新计算DAG?
答案 0 :(得分:4)
Spark中的随机文件充当隐式缓存,因此每当您的管道包含一个shuffle阶段(如*ByKey
),并且涉及节点故障时,Spark将仅重复最后一个阶段。
据说既不使用stdout,也不使用累加器errorLines
是一个转换是可靠的。在正常执行期间,前者将丢失,而后者不会提供一次保证。