一、广播变量
在App中经常会用到List、MaP等变量。如果不适用广播变量,默认每个task都会拉取一份副本到本地。广播变量的好处,不是每个task一份变量副本,而是变成每个节点的executor才一份副本。这样的话,就可以让变量产生的副本大大减少。
广播变量,初始的时候,就在Drvier上有一份副本。 task在运行的时候,想要使用广播变量中的数据,此时首先会在自己本地的Executor对应的BlockManager中,尝试获取变量副本;如果本地没有,那么就从Driver远程拉取变量副本,并保存在本地的BlockManager中;此后这个executor上的task,都会直接使用本地的BlockManager中的副本。 executor的BlockManager除了从driver上拉取,也可能从其他节点的BlockManager上拉取变量副本,距离越近越好。
val rdd23: RDD[Int] = sc.makeRDD(1 to 9)
var broad: String = "test"
//广播变量,如果是从hdfs读取需要将executor的数据collect到driver端合并,再广播到executor
val broadcastRef: Broadcast[String] = sc.broadcast(broad)
val rdd24: RDD[Int] = rdd23.map(d => {
//Executor中获取广播变量
val executorStr: String = broadcastRef.value
println(executorStr)
d * 10
})
rdd24.collect()