SparkCore中的广播变量
1.定义
2.为什么使用广播变量
- 在多个并行操作中(Executor)使用同一个变量,Spark默认会为每个任务(Task)分别发送,这样如果共享比较大的对象,会占用很大工作节点的内存。
- 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,甚至是机器学习算法中的一个很大的特征向量,广播变量用起来都很顺手。
3.广播变量的使用步骤
- (1)通过对一个类型T的对象调用SparkContext.broadcast创建出一个Broadcast[T]对象,任何可序列化的类型都可以这么实现。
- (2)通过value属性访问该对象的值(在Java中为value()方法)。
- (3)变量只会被发到各个节点一次,应作为只读值处理(修改这个值不会影响到别的节点)。
4.原理说明
5.案例实操
object Test10_BroadCast {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("Test10_BroadCast").setMaster("local[*]")
val sc: SparkContext = new SparkContext(conf)
val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a",1),("b",2),("c",3)))
val list: List[(String, Int)] = List(("a",4),("b",5),("c",6))
val broadcastList: Broadcast[List[(String, Int)]] = sc.broadcast(list)
val resRDD: RDD[(String, (Int, Int))] = rdd.map {
case (k1, v1) => {
var v3 = 0
for ((k2, v2) <- broadcastList.value) {
if (k1 == k2) {
v3 = v2
}
}
(k1, (v1, v3))
}
}
resRDD.collect().foreach(println)
sc.stop()
}
}