Spark - 广播变量 & 累加器

本文深入探讨了Spark中的广播变量和累加器,解释了它们在分布式计算中的作用,提供了代码示例,包括如何创建和使用广播变量及累加器,以及在Spark应用程序中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广播变量 broadcast variable

1、广播变量的意义

如果我们要在分布式计算里面分发大对象,例如:字典,集合,黑白名单等,这个都会由Driver端进行分发,一般来讲,如果这个变量不是广播变量,那么每个task就会分发一份,这在task数目十分多的情况下Driver的带宽会成为系统的瓶颈,而且会大量消耗task服务器上的资源,如果将这个变量声明为广播变量,那么只是每个executor拥有一份,这个executor启动的task会共享这个变量,节省了通信的成本和服务器的资源。
如:一个spark应用有50个executor,1000个tasks,一个10M大小的数据,不使用广播变量,则需要10M*1000 = 10G的内存,而使用广播变量则只需要10M * 50 = 500M内存

2、代码样例
package com.test.bigdata

import org.apache.spark.{SparkConf, SparkContext}

object BroadcastApp {

  def main(args: Array[String]) {
    val sparkConf = new SparkConf()
      .setMaster("local[2]").setAppName("SparkContextApp")

    val sc = new SparkContext(sparkConf)

    //    commonJoin(sc)

    broadcastJoin(sc)
    sc.stop()
  }

  def broadcastJoin(sc: SparkContext): Unit = {
    // 假设 a1是个小表
    val a1 = sc.parallelize(Array(("1", "大米"), ("2", "土豆"), ("29", "小花"))).collectAsMap()
  	//广播
    val a1Broadcast = sc.broadcast(a1) 

    sc.longAccumulator("").add(1)

    val f11 = sc.parallelize(Array(("29", "深圳", 18), ("10", "北京", 2)))
      .map(x => (x._1, x))

    f11.mapPartitions(partition => {
   	 // 获取广播里面的内容
      val a1Stus = a1Broadcast.value 
      for ((key, value) <- partition if (a1Stus.contains(key)))
        yield (key, a1Stus.getOrElse(key,""), value._2, value._3)
    })
  }

  def commonJoin(sc: SparkContext): Unit = {

    // a1 join f11 on a1.id = f11.id   ==> 29,"小花","深圳",18
    val a1 = sc.parallelize(Array(("1", "大米"), ("2", "土豆"), ("29", "小花"))).map(x => (x._1, x))

    val f11 = sc.parallelize(Array(("29", "深圳", 18), ("10", "北京", 2))).map(x => (x._1, x))

    a1.join(f11).map(x => {
      x._1 + " , " + x._2._1._2 + " , " + x._2._2._2 + " , " + x._2._2._3
    }).collect()


  }
}
3、注意事项
  • 广播变量不能过大
  • 广播变量是只读属性,不能修改,在Driver端可以修改广播变量的值,重新进行广播,在Executor端无法修改广播变量的值。
  • 必须将RDD进行action操作之后在进行广播
    val a1 = sc.parallelize(Array((“1”, “大米”), (“2”, “土豆”), (“29”, “小花”))).collectAsMap()
    val a1Broadcast = sc.broadcast(a1) //广播

累加器 accumulator

1、累加器

在spark应用程序中,我们经常会有这样的需求,如异常监控,调试,记录符合某特性的数据的数目,这种需求都需要用到计数器,如果一个变量不被声明为一个累加器,那么它将在被改变时不会再driver端进行全局汇总,即在分布式运行时每个task运行的只是原始变量的一个副本,并不能改变原始变量的值,但是当这个变量被声明为累加器后,该变量就会有分布式计数的功能。

2、累加器的使用
val conf = new SparkConf()
conf.setMaster("local").setAppName("accumulator")
val sc = new SparkContext(conf)
//定义累加器
val accumulator = sc.accumulator(0) 
//分布式累加
sc.textFile("./words.txt").foreach { x =>{accumulator.add(1)}} 
//获取累加器的结果
println(accumulator.value) 
sc.stop()
一、AutoCAD 2016的新增功能 版本演进: 从V1.0到2016版已更新数十次,具备绘图、编辑、图案填充、尺寸标注、三维造型等完整功能体系 界面优化: 新增暗黑色调界面:使界面协调深沉利于工作 底部状态栏整体优化:操作更实用便捷 硬件加速:效果显著提升运行效率 核心新增功能: 新标签页和功能区库:改进工作空间管理 命令预览功能:增强操作可视化 地理位置和实景计算:拓展设计应用场景 Exchange应用程序和计划提要:提升协同效率 1. 几何中心捕捉功能 新增选项: 在对象捕捉模式组中新增&quot;几何中心&quot;选项 可捕捉任意多边形的几何中心点 启用方法: 通过草图设置对话框&rarr;对象捕捉选项卡 勾选&quot;几何中心(G)&quot;复选框(F3快捷键启用) 2. 标注功能增强 DIM命令改进: 智能标注创建:基于选择的对象类型自动适配标注方式 选项显示优化:同时在命令行和快捷菜单中显示标注选项 应用场景: 支持直线、圆弧、圆等多种图形元素的智能标注 3. 打印输出改进 PDF输出增强: 新增专用PDF选项按钮 支持为位图对象添加超链接 可连接到外部网站和本地文件 操作路径: 快速访问工具栏&rarr;打印按钮&rarr;PDF选项对话框 4. 其他重要更新 修订云线增强: 支持创建矩形和多边形云线 新增虚拟线段编辑选项 系统变量: 新增多个控制新功能的系统变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值