Ébe*_*aac 5 python scala apache-spark rdd
弹性分布式数据集 (RDD) 被设计为不可变的。使它们不可变的原因之一在于容错和避免,因为它们由许多进程并且可能由许多节点同时处理。这可以避免竞争条件,也可以避免尝试控制这些条件所涉及的开销。
有几个关于如何实现 RDD 的说明(例如,这个)。然而,我似乎找不到一个说明累加器是如何实现的。它位于Apache Spark 文档中的 RDD 部分。这是否意味着为值的每个增量创建一个新的 RDD,或者它是完全不同的数据结构?
Accumulator是执行程序的只写变量。它们只能由执行程序添加,并且只能由驱动程序读取。
executors and read by the driver only.
executor1: accumulator.add(incByExecutor1)
executor2: accumulator.add(incByExecutor2)
driver: println(accumulator.value)
Run Code Online (Sandbox Code Playgroud)
Accumulators不是线程安全的。它们实际上不必这样做,因为驱动程序在任务完成(成功或失败)后用于更新累加器值的DAGScheduler.updateAccumulators方法仅在运行调度循环的单个线程上执行。除此之外,它们是具有自己的本地累加器引用的工作人员的只写数据结构,而仅驱动程序允许访问累加器的值。
累加器是可序列化的,因此可以在执行器中执行的代码中安全地引用它们,然后安全地通过网络发送以执行。
val counter = sc.longAccumulator("counter")
sc.parallelize(1 to 9).foreach(x => counter.add(x))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1337 次 |
| 最近记录: |