Broadcast广播变量

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()

  }
}

猜你喜欢

转载自blog.csdn.net/qq_42706464/article/details/108440617