导航

  • ​​scala outline​​
  • ​​spark 为什么要使用广播变量​​
  • ​​spark 广播变量使用​​

scala outline

​​scala outline​​

spark 为什么要使用广播变量

广播变量:分布式共享只读变量

如果Executor端需要访问Driver端的某个变量,spark​​会向Executor端每个task​​都发送一个此变量的副本,如果此变量很大,就会占用大量的Executor节点的内存,为了杜绝这种情况产生,可以使用广播变量,使用广播变量后spark只会给一个Executor节点发送一个变量;另外就是可以大幅度减少网络IO(发送一次变量总比发送n次占用的网络IO少)

spark 广播变量_spark

spark 广播变量使用

需求:现有一个rdd 和 list,去实现类似join效果

val rdd: RDD[(String, Int)] = sc.makeRDD(List((“a”, 1), (“b”, 2), (“c”, 2)))
val list: List[(String, Int)] = List((“a”, 4), (“b”, 5), (“c”, 6))

目标输出:

(a,(4,1))
(b,(5,2))
(c,(6,2))

package com.xcu.bigdata.spark.core.pg02_broadcast

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
* @Desc : 广播变量的声明和使用
*/
object Spark01_Broadcast {
def main(args: Array[String]): Unit = {
//创建配置文件
val conf: SparkConf = new SparkConf().setAppName("Spark01_Broadcast").setMaster("local[*]")
//创建SparkContext,该对象是提交的入口
val sc = new SparkContext(conf)
//创建RDD
val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("b", 2), ("c", 2)))
val list: List[(String, Int)] = List(("a", 4), ("b", 5), ("c", 6))
//以下的这种方式每一个excutor的不同task都会有一个list,效率极其地下
//实现类似join效果 (a,(1,4)),(b,(2,5)),(c,(3,6))
val resRDD: RDD[(String, (Int, Int))] = rdd.map {
case (k1, v1) => {
var v3 = 0
for ((k2, v2) <- list) {
if (k1 == k2)
v3 = v2
}
(k1, (v1, v3))
}
}
//打印输出
resRDD.collect().foreach(println)

//********************使用广播变量********************
println("**************************************")
//声明广播变量
val broadcastList: Broadcast[List[(String, Int)]] = sc.broadcast(list)
val resRDD1: RDD[(String, (Int, Any))] = rdd.map {
case (k1, v1) => {
var v3 = 0
//获取广播变量的值
for ((k2, v2) <- broadcastList.value) {
if (k1 == k2)
v3 = v2
}
(k1, (v3, v1))
}
}
//打印输出
resRDD1.collect().foreach(println)
//释放资源
sc.stop()
}
}