Broadcast
功能:broadcast 就是将数据从一个节点发送到其他各个节点上去
广播变量
原理:
- 常量定义在driver端,广播的数值
- rdd算子的计算在executor端,常量值广播之后再修改值,rdd的计算用的还是修改之前的值
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("broadcastDemo")
val sc: SparkContext = SparkContext.getOrCreate(conf)
var value=20 //定义广播变量
val broadcastValue: Broadcast[Int] = sc.broadcast(value) //将变量广播出去
value=40 //修改变量的值
val rdd: RDD[(Int, String)] = sc.parallelize(Array((1,"a"),(2,"b"),(3,"c"))) //定义一个rdd
val rdd1: RDD[(Int, Int)] = rdd.mapValues(x => {
println("value is :" + x) //打印rdd的value
broadcastValue.value //返回广播变量的value
})
rdd1.collect().foreach(println) //打印rdd1,看value的值是否变为40
value is :c
value is :a
value is :b
(1,20)
(2,20)
(3,20)
广播数组
原理:
- 在driver端定义数组,广播的是地址值
- 在driver端修改数组元素后,在executor端对rdd算子进行操作使用数组时,使用的是修改后的值
val conf:SparkConf=new SparkConf().setMaster("local[*]").setAppName("BroadcastDemo")
val sc:SparkContext=SparkContext.getOrCreate(conf)
var arr=Array("hello","hi")
println(arr)//打印的是地址值
val broadcastVar=sc.broadcast(arr)//将数组广播出去
arr(0)="haha" //在广播之后修改数组的值
val rdd=sc.parallelize(Array((1,"leader"),(2,"teacher"),(3,"student")))
val rdd1=rdd.mapValues(x=>{
println("value is :"+x) //打印rdd的value的值
broadcastVar.value(0) //返回广播下标为0的value
})
rdd1.collect.foreach(println)
[Ljava.lang.String;@4816c290
value is :teacher
value is :student
value is :leader
(1,haha)
(2,haha)
(3,haha)