Spark高级编程


Spark包含两种不同类型的共享变量 - 一个是 广播变量 ,另一个是 累加器

  • 广播变量 - 用于高效分配大值。

  • 累加器 - 用于汇总特定集合的信息。

广播变量

广播变量允许程序员在每台机器上保存一个只读变量,而不是随任务一起发送它的副本。例如,可以使用它们以有效的方式为每个节点提供一个大型输入数据集的副本。Spark还试图使用高效的广播算法来分发广播变量,以降低通信成本。

Spark动作通过一系列阶段执行,由分布式“混洗”操作分隔。Spark会自动广播每个阶段中任务所需的通用数据。

以这种方式广播的数据以序列化的形式被缓存,并在运行每个任务之前被反序列化。这意味着只有跨多个阶段的任务需要相同的数据或以反序列化形式缓存数据非常重要时,才显式创建广播变量。

广播变量是通过调用 SparkContext.broadcast(v) 从变量 v 创建的。广播变量是 v的 一个包装,它的值可以通过调用 value 方法来访问。下面给出的代码显示了这一点 - **

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中尚未得到支持)。

通过调用 SparkContext.accumulator(v) 从初始值 v 创建累加器。然后,可以使用 add 方法或+ =运算符(在Scala和Python中)添加在群集上运行的任务。但是,它们无法读取其价值。只有驱动程序可以使用其 方法读取累加器的值。

下面给出的代码显示了一个累加器被用来将一个数组的元素相加 -

scala> val accum = sc.accumulator(0)

scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)

如果你想看到上面代码的输出,那么使用下面的命令 -

scala> accum.value

输出

res2: Int = 10

数字RDD操作

Spark允许您使用预定义的API方法之一对数字数据执行不同的操作。Spark的数字操作是通过流式算法实现的,该算法允许构建模型,一次一个元素。

这些操作通过调用 status() 方法计算并作为 StatusCounter 对象返回。 **

以下是 StatusCounter中 可用的数字方法列表。

序号 方法和意义
1 count()
RDD中的元素数目。
2 Mean()
RDD中元素的平均值。
3 Sum()
RDD中元素的总值。
4 Max()
RDD中所有元素的最大值。
5 Min()
RDD中所有元素中的最小值。
6 Variance()
元素的变化。
7 Stdev()
标准偏差。

如果您只想使用这些方法中的一种,则可以直接在RDD上调用相应的方法。