栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【Spark Core】广播变量

【Spark Core】广播变量

概念

分布式共享只读变量
(1) 变量
(2) 分布式中执行的
(3) 共享:一个Executor中的多个Task共享

实现原理


(1) 如上图所示,当一个算子用到了Driver端的数据(图中的map),那么就会对此数据进行闭包,发送到Executor端进行运算
(2) 每个Task中都需要用到map(闭包数据),如果有十个分区意味着十个Task。场景如下:如果只有一个Executor,且只有一个core,此时就是并发执行了。一个Executor放了十份数据,造成大量冗余占用内存。

(3)广播变量所解决的问题: Executor就是一个JVM,启动的时候会自动分配内存,完全可以将闭包数据放置在Executor内存中,达到Task共享的目的,如下所示,将Task的变量提取到Executor共享

注意:这个共享变量是不能被Task所修改的,只能被Task读取
Spark中的广播变量将Task所需要的闭包数据保存到Executor内存中,由当前Executor中的多个Task共享,并不是每个Task享有一个。

广播变量用来高效分发较大的对象。向所有工作节点只发送一个较大的只读值,以供一个或多个Task使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,广播变量用起来都很顺手。在多个并行操作中使用同一个变量,但是 Spark会为每个任务分别发送。

广播变量的使用
val rdd1 = sc.makeRDD(List( ("a",1), ("b", 2), ("c", 3), ("d", 4) ),4)
val list = List( ("a",4), ("b", 5), ("c", 6), ("d", 7) )
//1. 声明广播变量
val broadcast: Broadcast[List[(String, Int)]] = sc.broadcast(list)

val resultRDD: RDD[(String, (Int, Int))] = rdd1.map {
  case (key, num) => {
    var num2 = 0
    // 2.使用广播变量的值
    for ((k, v) <- broadcast.value) {
      if (k == key) {
        num2 = v
      }
    }
    (key, (num, num2))
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/312914.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号