广播变量 − 采用高效,分发大值
累加器 − 用于聚集特定集合的信息
广播变量允许程序员保持每台机器上一个只读变量缓存,而不是运输它的一个副本任务。它们可用于,例如,给每一个节点,一个大的输入数据集的副本,以有效的方式。Spark 也尝试分发广播变量来使用高效的广播算法来降低通信成本。
Spark 操作通过一组阶段执行,通过分布式“洗牌”作业分开。Spark 会自动广播各阶段任务所需的通用数据。
广播数据缓存到序列化的形式,在运行每个任务之前,反序列化。这意味着显式地创建广播变量,当仅是在多个阶段的任务需要相同的数据或在反序列化形式缓存数据时非常重要的。
广播变量从一个变量v通过调用 SparkContext.broadcast(v)来创建。广播变量是围绕 v 封装,其值可以通过调用值的方法来访问。下面给出的代码显示了这一点
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))输出
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)创建广播变量之后,它应该被用来代替任何函数的值 v 的集群上运行, v 不运到节点不止一次。此外,对象 v 不应在它的广播后修饰,以确保所有节点获得广播变量的相同的值。
蓄电池仅是“补充”到通过关联操作变量,因此可以,可以并行有效的支持。它们可以被用来实现计数器(如在MapReduce)或求和。Spark原生支持累加器的数字类型,程序员可以添加支持新类型。如果累加器使用自定义的一个名称创建,它将显示在 Spark 的 UI 中。这对于了解运行阶段和进度很有用(注 - 这还不支持在Python)。
累加器从初始值v的值是通过调用 SparkContext.accumulator(v) 创建. 在集群上运行任务可以使用 add 方法或 += 运算符(在 Scala 和Python)来添加它。 然而无法读取它的值。只有驱动程序可以读取累加器的值,使用 value 方法。
下面给出的代码显示一个累加器,用来相加数组的元素
scala> val accum = sc.accumulator(0) scala> sc.parallelize(Array(1,2,3,4)).foreach(x => accum += x)如果想看到的上面的代码的输出,可以使用下面的命令
scala> accum.value输出
res2: Int = 10
允许使用预定义的API方法之一做不同数字数据的操作。 Spark 数字运算是与流传输算法,允许构建模型,一次一个元素实现。
S.No | 方法 & 含义 |
---|---|
1 |
count()
在RDD元素的数量
|
2 |
Mean()
在RDD元素的平均值
|
3 |
Sum()
在RDD中元素的总和
|
4 |
Max()
在RDD中所有元素的最大值
|
5 |
Min() 在RDD中所有元素的最小值 |
6 |
Variance()
元素的差异
|
7 |
Stdev()
元素的标准差
|