Spark基础(4)共享变量

  • 广播变量

广播变量(broadcast variables)允许程序开发人员在每个机器上面缓存一个只读的变量,而不是为机器上的每个任务都生成一个副本。

spark的“行动”操作会跨越多个阶段(stage),对于每个阶段内的所有任务所需要的公共数据,Spark都会自动进行广播。

可以通过SparkContext.broadcast(v)来从一个普通变量v中创建一个广播变量。这个广播变量就是对普通变量v的一个包装器,通过调用value方法可以获得这个广播变量的值。

scala> val broadcastVar = sc.broadcast(Array(1,2,3))
scala> broadcastVar.value
res0:Array[Int] = Array(1,2,3)

广播变量被创建后,在集群中的任何函数中,都应该使用广播变量broadcastVar的值,而不是使用v的值,这样就不会把v重复分发到这些节点上。此外,一旦广播变量创建后,普通变量v的值就不能再发生修改,从而确保所有节点都获得广播变量的值是相同的。

完整程序:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object BroadCastValue{
    def main(args:Array[String]):Unit={
        val conf = new SparkConf().setAppName("BroadCastValue1").setMaster("local[1]")
        val sc = new SparkContext(conf)
        val lists = List(1,2,3,4,5)
        val listRDD = sc.parallelize(lists)
    }
}
  • 累加器

累加器是仅仅被相关操作累加的变量,通过可以被用来实现(counter)和求和(sum)

一个数值型累加器,可以通过调用SparkContext.longAccumulator()或者SparkContext.doubleAccmulator()来创建运行在集群中的任务,就可以使用add方法来把数值累加到累加器上,但是,这些任务只能累加操作,不能读取累加器的值,只有任务控制节点(Driver Program)可以使用value方法来读取累加器的值。

scala> val accum = sc.longAccumulator("My Accumulator")
scala> sc.parallelize(Array(1,2,3,4)).foreach(x => accum.add(x))
scala> accum.value

在有很多节点/海量数据的情况下,使用累加器的add方法可以较大的提升效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值