Broadcast广播变量:
广播变量用来高效分发较大的对象,向所有工作节点发送一个较大的只读值,以供一个或者多个spark操作使用。
比如,如果你的应用,需要向所有节点发送一个较大只读查询表,甚至是机器学习1算法中的一个很大的特征向量,
广播变量用起来都是很顺手的。
广播变量
广播变量在广播的时候,将driver端的变量广播到每一个worker端,一个worker端会受到一份仅一份该变量的值。
应用场景:
在提交作业后,task在执行的过程中,有一个或者多个值需要在计算过程时钟多次从Driver端拿取时,此时会必然会发生大量的网络IO。
这时,最好用广播的方式,将Driver端的变量值先广播到每一个Worker端,以后再计算的过程中只要在本地拿值就可以了,提高效率,避免网络IO。广播的时候回将Driver端的变量广播到每一个worker端,一个Worker端收到仅一份。
注意:广播的值必须是一个确切的值,不能广播RDD(因为RDD是一个数据的描述,没有拿到确切的值),如果想要广播RDD,需要将该RDD对应的数据获取到Driver端然后再进去广播。 广播的数据是不可改变的。
import org.apache.spark.{
SparkConf, SparkContext}
object BroadcastDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName(this.getClass.getName).setMaster("local[2]")
val sc = new SparkContext(conf)
//list是在Driver端创建也相当于本地变量
val list = List("hello java")
//封装广播变量,并进行广播,该方法也是transformation,只有action的时候才执行
val broadcast = sc.broadcast(list)
//算子部分是在Executor端执行
val lines = sc.parallelize(List("dd ff","ff ffd"))
//使用广播变量进行数据处理value可以获取广播变量的值
val filterStr = lines.filter(broadcast.value.contains(_))
filterStr.foreach(println)
sc.stop()
}
}