大数据计算框架spark——自定义累加器内部方法作用以及源码分析

前言

spark中有三大数据模型RDD、累加器以及广播变量,其中RDD是重中之重,所以后面我会出一系列专门讲解RDD的文章,今天我们说的也是比较重要的累加器

一 累加器的作用

累加器:又叫分布式共享只写变量

可能现在还不是很理解这是什么意思,那么讲解累加器的作用之前我们先来看一个需求:

我们需要将一个集合中的数据求和,我们可以这样求解(下面所有操作都是在idea代码实现的):

val rdd = sc.makeRDD(List(1,2,3,4))

val i = rdd.reduce(_+_)
println(i)

这样我们完全能够求出最后的结果,但是reduce方法是需要将数据打乱重组的,肯定会进行shuffle操作,这样数据量较大的时候会非常消耗服务器性能的

我们又想如果可以定义一个变量用来存储结果,遍历集合进行累加就行了,因为遍历是不用进行shuffle的

接下来的代码:

var sum = 0

val rdd = sc.makeRDD(List(1,2,3,4))

rdd.foreach(num => {

		sum += num
})

println(sum)

满心欢喜的运行后结果却不是我们预想的那样,结果为0

我们在foreach里面打印sum的值却可以看到sum是累加过num的,仔细思考发现因为scala闭包的原因,我们在函数里面调用外部的变量会在其内部也创建相同的变量,所以sum能够传到每个executor执行结果,但是经过计算的sum却不能返回给driver,所以打印的还是我们初始定义的为0的变量sum,如下图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值