一起学spark(9) -- 累加器和广播变量

通常在向spark传递函数时,可以使用驱动器程序中的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。

累加器:累加器提供了将工作节点中的词聚合到驱动器程序中的简单语法。
eg:统计空行

file = sc.textFile(input_file)
#创建Accumulator[int] 并初始化为0
blankLines = sc.accumulator(0)

def extractCallSigns(line):
    global blankLines  #访问全局变量,注意不是定义
    if (line == ""):
        blankLines += 1
    return line.split()

callSigns = file.flatMap(extractCallSigns)
callSigns.saveAsTextFile("path")  #只有在使用行动操作后才会计数,注意前面是惰性求值的
print "Blank lines :{0}".format(blankLines.value) #通过 value 访问

累加器的用法总结:

(1)通过在驱动器中调用 SparkContext.accumulator(initialvalue)方法,创建出具有初始值的累加器
(2)访问全局变量 global variable
(3)驱动器程序可以调用累加器的 value 属性来访问累加器中的值

广播变量:可以让程序高效的向所有工作节点发送一个较大的只读值,以供一个或多个Spark 操作使用。
Spark 会自动的把闭包中所有用到的变量发送到工作节点上,虽然这很方便,但也很低效。因此,可以用广播变量解决问题。
备注:什么是闭包?闭包就是一个函数依赖于外部声明,却只在内部使用的变量。

power = 2
def pow(number,power)
    return power(number,power) #这就是闭包,spark会计算闭包,并将它序列化拷贝到每个任务
myRDD.map(lambda x:pow(x,power)) #声明在函数外的 power 变量被传递给map方法,这个值将随任务被拷贝到序列化闭包里

可以这么说,几乎我们工作中使用的大多数函数都是闭包。使用广播变量如下代码所示:

 

power = 2
br_power = sc.broadcast(power) #进行广播
def pow(number,br_power):
    power = br_power.value  #访问变量
    return power(number,power)
myRDD.map(lambda x:pow(x,br_power))

广播变量的过程:
(1)通过对一个类型T 的对象调用 SparkContext.broadcast 创建出一个BroadCast[T] 对象,任何可序列化的类型都可以这么实现。
(2)通过 value 属性访问该对象的值。
(3)变量只会被发到各个节点一次,作为只读值处理。



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值