Spark 高级编程
Spark包含两种不同类型的共享变量-一个是广播变量和第二个是蓄电池 。
广播变量 -用于高效地分配大的值。
累加器 -用于聚集特定集合的信息。
广播变量
广播变量允许程序员保持每台机器上一个只读变量缓存,而不是出货它的一个副本任务。他们可以用,例如,给每一个节点,一个大型输入数据集的副本,以有效的方式。Spark也尝试使用高效广播算法以降低通信成本来分发广播变量。
Spark行动是通过一组阶段执行,分布式“洗牌”操作分开。Spark自动广播由每个阶段内的任务所需要的公共数据。
播出这样的数据序列化的形式被缓存和运行的每个任务之前,反序列化。这意味着显式创建广播的变量,只有用当在多个阶段的工作需要相同的数据或在反序列化形式缓存数据时是重要的。
广播变量从变量v通过调用SparkContext.broadcast(五)创建的。广播变量是围绕V A的包装,其值可以通过调用值法进行访问。下面给出的代码显示了这一点 -
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
输出 -
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
创建广播变量之后,它应该被用来代替在集群上运行的任何函数的值v,这样,V不是运到节点不止一次。此外, 宾语不应被它的广播后修饰,以确保所有节点获得广播变量的相同的值。
蓄电池
蓄电池是唯一被“添加”到通过关联操作,因此可以在平行进行有效支持的变量。它们可以被用来实现计数器(如在MapReduce的)或求和。Spark原生支持数字类型的蓄电池,并且程序员可以增加对新类型的支持。如果蓄电池被创建一个带有名字,他们将显示在Spark的UI。这可以理解为运行阶段的进度很有用(注 - 这是尚未在Python支持)。
蓄能器从初始值v通过调用SparkContext.accumulator(ⅴ)创建。 =运算符(在Scala和Python);然后在集群上运行的任务可以使用add方法或与加添加到它。然而,他们无法读取它的价值。只有驱动程序可以读取累加器的值,使用它的价值的方法。
下面给出的代码显示一个累加器被用来加起来数组中的元素 -
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的数字的操作,可以允许构建模型,一次一个元件的流算法实现。
这些操作被计算,并返回调用状态()方法StatusCounter对象。
以下是StatusCounter可用数值方法的列表。
| S.No | 方法与意义 |
|---|---|
| 1 | 计数() 在RDD元素的个数。 |
| 2 | 意思() 在RDD元素的平均值。 |
| 3 | 和() 在RDD元素的总价值。 |
| 4 | MAX() 在RDD的所有元素中的最大值。 |
| 五 | MIN() 在RDD的所有元素中最小值。 |
| 6 | 方差() 元素的变迁。 |
| 7 | 发网() 标准偏差。 |
如果您只希望这些方法之一来使用,你可以在RDD直接调用相应的方法。