分布式共享只读变量
(1) 变量
(2) 分布式中执行的
(3) 共享:一个Executor中的多个Task共享
(1) 如上图所示,当一个算子用到了Driver端的数据(图中的map),那么就会对此数据进行闭包,发送到Executor端进行运算
(2) 每个Task中都需要用到map(闭包数据),如果有十个分区意味着十个Task。场景如下:如果只有一个Executor,且只有一个core,此时就是并发执行了。一个Executor放了十份数据,造成大量冗余占用内存。
(3)广播变量所解决的问题: Executor就是一个JVM,启动的时候会自动分配内存,完全可以将闭包数据放置在Executor内存中,达到Task共享的目的,如下所示,将Task的变量提取到Executor共享
注意:这个共享变量是不能被Task所修改的,只能被Task读取
Spark中的广播变量将Task所需要的闭包数据保存到Executor内存中,由当前Executor中的多个Task共享,并不是每个Task享有一个。
广播变量用来高效分发较大的对象。向所有工作节点只发送一个较大的只读值,以供一个或多个Task使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,广播变量用起来都很顺手。在多个并行操作中使用同一个变量,但是 Spark会为每个任务分别发送。
广播变量的使用val rdd1 = sc.makeRDD(List( ("a",1), ("b", 2), ("c", 3), ("d", 4) ),4)
val list = List( ("a",4), ("b", 5), ("c", 6), ("d", 7) )
//1. 声明广播变量
val broadcast: Broadcast[List[(String, Int)]] = sc.broadcast(list)
val resultRDD: RDD[(String, (Int, Int))] = rdd1.map {
case (key, num) => {
var num2 = 0
// 2.使用广播变量的值
for ((k, v) <- broadcast.value) {
if (k == key) {
num2 = v
}
}
(key, (num, num2))
}
}



