0%

共享变量之广播变量

共享变量之广播变量

spark中有两种共享变量,累加器和广播变量

闭包数据是以Task为单位发送的,每个任务中都会包含有闭包数据,这样就会导致一个Executor中会含有大量重复的数据,并且占用大量的内存,可以使用spark的广播变量将闭包的数据保存到Executor的内存中,从而使得一个Executor中的Task可以共享这些数据,广播变量每个节点只会发送一次,Spark中的广播变量不能够更改,是分布式只读变量,如果在某个节点上修改了广播变量的数据,则该数据只对本节点有效,其他节点不可见

广播变量用来高效分发较大的对象

使用sc.broadcast来声明广播变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
val rdd = sc.makeRDD(List(("a", 1), ("b", 2), ("c", 3), ("d", 4)))

val list = List(("a", 4), ("b", 3), ("c", 2), ("d", 1))

// 声明广播变量
val bc = sc.broadcast(list)

val mapRdd = rdd.map(t => {
val bcv = bc.value
var num = 0
t match {
case (key, value) => {
for ((k, v) <- bcv) {
if (k == key) {
num = v
}
}
}
}
(t._1, t._2 + num)


})
mapRdd.collect().foreach(println)