Spark 包含两种不同类型的共享变量 - 一种是广播变量 ,另一种是累加器 。
广播变量
广播变量允许程序员在每台机器上缓存一个只读变量,而无需在任务中传递副本。例如,它们可以高效地为每个节点提供一份大型输入数据集的副本。Spark 还尝试使用高效的广播算法来分发广播变量,以降低通信成本。
Spark 操作通过一系列阶段执行,这些阶段由分布式 shuffle 操作分隔。Spark 会自动广播每个阶段内任务所需的公共数据。
以这种方式广播的数据以序列化形式缓存,并在运行每个任务之前反序列化。这意味着,显式创建广播变量仅在跨多个阶段的任务需要相同数据或以反序列化形式缓存数据很重要时才有用。
通过调用 SparkContext.broadcast(v) 方法,可以从变量 v 创建广播变量。广播变量是 v 的包装器,可以通过调用 value 方法访问其值。以下代码演示了这一点:
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
Output − 输出
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
广播变量创建后,应在集群上运行的任何函数中使用它来代替值 v ,这样 v 就不会被多次发送到节点。此外,对象 v 广播后不应被修改,以确保所有节点都获得相同的广播变量值。
累加器
累加器是只能通过关联运算进行加法运算的变量,因此可以高效地并行执行。它们可用于实现计数器(例如在 MapReduce 中)或求和。Spark 原生支持数值类型的累加器,程序员也可以添加对新类型的支持。如果创建了带有名称的累加器,它们将显示在 Sparks UI 中。这有助于了解正在运行的阶段的进度(注意:Python 尚不支持此功能)。
通过调用 SparkContext.accumulator(v) ,可以从初始值 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
Output 输出
res2: Int = 10
数值 RDD 操作
Spark 允许您使用预定义的 API 方法之一对数值数据执行不同的操作。Spark 数值操作采用流式算法实现,该算法允许一次构建一个元素的模型。
通过调用 status() 方法计算这些操作并将其作为 StatusCounter 对象返回。
以下是 StatusCounter 中可用的数字方法列表。
S.No 序号 | Methods & Meaning 方法与意义 |
---|---|
1 | count() 数数() Number of elements in the RDD. |
2 | Mean() 意思是() Average of the elements in the RDD. |
3 | Sum() 和() Total value of the elements in the RDD. |
4 | Max() 最大限度() Maximum value among all elements in the RDD. |
5 | Min() Minimum value among all elements in the RDD. |
6 | Variance() 方差() Variance of the elements. |
7 | Stdev() 标准差() Standard deviation. 标准差。 |
如果只想使用其中一种方法,可以直接在 RDD 上调用相应的方法。
Comments