spark-广播变量-★★★★

广播变量-★★★★

总结:

  • 当Task中使用到了本地的变量,而该变量不是经常变化且数据量不大
  • 那么可以使用广播机制,将该变量发送到各个Executor内存中,这样各个Task就可以从Executor中直接获取并使用
  • 避免了Driver将该变量单独发给各个Task
  • 现象比较难理解,但是代码很简单
package cn.hanjiaxiaozhi.core

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

/**
 * Author hanjiaxiaozhi
 * Date 2020/7/23 10:36
 * Desc 演示Spark的广播变量
 */
object BroadcastTest {
  def main(args: Array[String]): Unit = {
    //0.创建sc-Spark执行环境
    val conf: SparkConf = new SparkConf().setAppName("wc").setMaster("local[*]") //虽然是local,但是运行机制和集群一样,是用本地线程模拟集群
    val sc: SparkContext = new SparkContext(conf)
    sc.setLogLevel("WARN")
    //0.准备数据
    //水果id和水果名称组成的map
    val fruitMap: collection.Map[Int, String] = Map((1, "apple"), (2, "orange"), (3, "banana"), (4, "grape"))
    //scala.collection.Map[Int,String] = Map(2 -> orange, 4 -> grape, 1 -> apple, 3 -> banana)
    //水果id组成的RDD
    val fruitIds: RDD[Int] = sc.parallelize(List(2, 4, 1, 3))
     //val fruitIds: RDD[Int] = sc.parallelize(List(1,2,3,5))//如果没有会报错key not found: 5

    //1.不使用广播变量来完成根据水果id去map中获取水果名称
    val fruitNames: RDD[String] = fruitIds.map(id => fruitMap(id))
    fruitNames.collect().foreach(println)//完全可以正常执行并获取
    println("============================")

    //2.使用广播变量来完成根据水果id去map中获取水果名称
    //将水果id和水果名称组成的map作为广播变量
    val mapBroadcast: Broadcast[collection.Map[Int, String]] = sc.broadcast(fruitMap)//声明广播变量
    //使用广播变量
    val fruitNames2: RDD[String] = fruitIds.map(id => {
      //从广播中取出之前广播出去的map
      val map: collection.Map[Int, String] = mapBroadcast.value
      map(id) //根据id从map中取出水果名称
    })
    fruitNames2.collect().foreach(println)

    //注意:上面不使用广播变量和使用广播变量最后的运行效果一样的
    //但是底层的执行原理完全不同
  }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值