scala> broadcastVar.value
res0: Array[Int] = Array(1,2,3)
当广播变量创建后, 在集群中所有函数将以变量v代表该广播变量, 并且该变量v 一次性分发到各节点上。另外,为了确保所有的节点获得相同的变量,对象v广播后只读不能够被修改。
累加器是Spark中仅有通过关联操作进行累加的变量, 因此能够有效地支持并行计算, 它们能够用于计数(如MapReduce)和求和。 Spark原生支持数值类型的累加器, 不过开发人员能够定义新的类型。如果在创建累加器时指定了名称, 可以通过Spark的UI监控界面中进行查看, 这种方式能够帮助理解作业所构成的调度阶段执行过程。
通过调用SparkContext.accumulator(v)方法初始化累加器变量V,在集群中的任务能够使用加法或者"+="操作符进行累加操作(在Scala和Python中)。然而, 它们不能在应用程序中读取这些值, 只能由Driver程序通过读方法获取这些累加器的值。
下面代码演示如何把一个数组的元素追加到累加器中:
scala> val accum = sc.accumulator (0, “My Accumulator”)
accum: spark.Accumulator[Int] = 0
scala> Sc.parallelize(Array(l, 2, 3, 4)).foreach(x => accum += x)
…
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
scala> accum.value
res2: Int = 10
尽管上面的例子使用Spark原生所支持的累加器Int类型, 但是开及人员能够通过继承AccumulatorParam类来创建自定义的累加类型。 AccumulatorParam接口提供了两个方法: zero 方法为自定义类型设置 ”0值 " 和addInPlace方法将两个变量进行求和。例如, 下面将对Vector 类所提供的向量vector进行求和, 代码如下:
object VectorAccumulatorParam extends AccumulatorParam[MyVector, MyVector] {
def zsro(initialValue: Vector): Vector = {
Vector.zeros(initialValue.size)
}
def addInPlace(v1: Vector, v2: Vector): Vector = {
v1 += v2
}
…
}
// 可以创建向量的累加器变量
val vecAccum = sc.accumulator(new Vetor(…))(VectorAccumulatorParam)
在Scala中, 尽管结果的类型和累加元素的数据类型可能存在不一致的情况,Spark提供更通用的接口来累加数据(例如, 通过创建一个列表来容纳累加的元素), 另外SparkContext. accumulableCollection提供了通用的方法来累加Scala集合类型。
累加器只能由Spark内部进行更新, 并保址每个任务在累加器的更新操作仅执行一次, 也就是说, 重启任务也不应该更新。 在转换操作中, 用户必须意识到任务和作业的调度过程重新执行会造成累加器多次更新。
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618164986)
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!