Apache Spark:Dag 不会针对 reduceByKey 执行两次
Apache Spark: Dag is not executed twice for reduceByKey
有一个简单但可能很奇怪的问题:对于以下代码,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?
Spark 中的 Shuffle 文件用作隐式缓存,因此每当您的管道包含一个 shuffle 阶段(如 *ByKey
),并且涉及节点故障时,Spark 将仅重复最后一个阶段。
据说在转换中既不使用标准输出,也不使用累加器 errorLines
是可靠的。正常执行时,前者会丢失,后者不提供exactly once保证。
与相关
有一个简单但可能很奇怪的问题:对于以下代码,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?
Spark 中的 Shuffle 文件用作隐式缓存,因此每当您的管道包含一个 shuffle 阶段(如 *ByKey
),并且涉及节点故障时,Spark 将仅重复最后一个阶段。
据说在转换中既不使用标准输出,也不使用累加器 errorLines
是可靠的。正常执行时,前者会丢失,后者不提供exactly once保证。
与