Apache spark 关于火花蓄能器内部动作的混淆

Apache spark 关于火花蓄能器内部动作的混淆,apache-spark,pyspark,Apache Spark,Pyspark,从官方文件中我们可以看到: 对于仅在内部操作中执行的累加器更新,Spark 保证每个任务对累加器的更新只会 应用一次,即重新启动的任务不会更新该值。在里面 转换时,用户应该知道每个任务的更新可能会 如果重新执行任务或作业阶段,则可以多次应用 我认为这意味着累加器应该只在操作中执行,例如rdd.foreachPartition() 通过pyspark中rdd.foreachPartition的API代码,我发现rdd.foreachPartition(accum_func)等于: rdd.mapP

从官方文件中我们可以看到:

对于仅在内部操作中执行的累加器更新,Spark 保证每个任务对累加器的更新只会 应用一次,即重新启动的任务不会更新该值。在里面 转换时,用户应该知道每个任务的更新可能会 如果重新执行任务或作业阶段,则可以多次应用

我认为这意味着累加器应该只在操作中执行,例如
rdd.foreachPartition()

通过pyspark中
rdd.foreachPartition
的API代码,我发现
rdd.foreachPartition(accum_func)
等于:

rdd.mapPartitions(accum_func).mapPartitions(lambda i: [sum(1 for _ in i)]).mapPartitions(lambda x: [sum(x)]).mapPartitions(some_add_func).collect()
似乎accum_func可以在转换内部运行(rdd.mapPartition)


非常感谢您在运行map()操作分区的节点崩溃时所做的解释, Spark将在另一个节点上重新运行它,即使该节点没有崩溃,但只是简单地 Spark比其他节点慢得多,它可以抢先启动“推测性”拷贝 另一个节点上的任务,并在任务完成时获取其结果

即使没有节点出现故障,Spark也可能需要重新运行任务来重建内存中的缓存值。因此,最终结果是,根据集群上发生的情况,同一函数可能会在同一数据上运行多次


在动作中使用的累加器中,Spark仅将每个任务的更新应用于每个累加器一次。因此,如果我们想要一个可靠的绝对值计数器,不管失败或多次求值,我们都必须将它放在像foreach()这样的操作中。

如果我们只想在转换中读取累加器的值,我希望它是好的?例如,使用IF条件执行一些逻辑
code
IF(累加器1.value()>0){--do something}
code