SparkCore之广播变量

SparkCore中的广播变量是一种优化策略,用于在多个并行任务中高效分享只读对象,避免了每次任务都复制大对象,从而节省内存。本文介绍了广播变量的定义、使用原因、步骤、原理和实战案例,帮助理解如何在Spark中有效利用广播变量。
摘要由CSDN通过智能技术生成

SparkCore中的广播变量

1.定义

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

2.为什么使用广播变量

  • 在多个并行操作中(Executor)使用同一个变量,Spark默认会为每个任务(Task)分别发送,这样如果共享比较大的对象,会占用很大工作节点的内存。
  • 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的只读值,以供一个或多个Spark操作使用。比如,如果你的应用需要向所有节点发送一个较大的只读查询表,甚至是机器学习算法中的一个很大的特征向量,广播变量用起来都很顺手。

3.广播变量的使用步骤

  • (1)通过对一个类型T的对象调用SparkContext.broadcast创建出一个Broadcast[T]对象,任何可序列化的类型都可以这么实现。
  • (2)通过value属性访问该对象的值(在Java中为value()方法)。
  • (3)变量只会被发到各个节点一次,应作为只读值处理(修改这个值不会影响到别的节点)。

4.原理说明

在这里插入图片描述

5.案例实操

object Test10_BroadCast {

    def main(args: Array[String]): Unit = {
        // 创建SparkConf对象,设置APP名称以及Master名称
        val conf: SparkConf = new SparkConf().setAppName("Test10_BroadCast").setMaster("local[*]")

        // 创建SparkContext对象,该对象是提交Spark App的入口
        val sc: SparkContext = new SparkContext(conf)

        //需求:想实现类似join效果   (a,(1,4)),(b,(2,5)),(c,(3,6))
        val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a",1),("b",2),("c",3)))
        val list: List[(String, Int)] = List(("a",4),("b",5),("c",6))

        // 声明一个广播变量
        val broadcastList: Broadcast[List[(String, Int)]] = sc.broadcast(list)

        val resRDD: RDD[(String, (Int, Int))] = rdd.map {
            case (k1, v1) => {
                var v3 = 0
                //for ((k2, v2) <- list) {
                // 使用广播变量
                for ((k2, v2) <- broadcastList.value) {
                    if (k1 == k2) {
                        //(k1, (v1, v2))
                        v3 = v2
                    }
                }
                (k1, (v1, v3))
            }
        }

        resRDD.collect().foreach(println)

        // 关闭连接
        sc.stop()
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值