6.Spark共享变量

概述

  • 共享变量
    • 共享变量的工作原理
    • Broadcast Variable
    • Accumulator

共享变量

共享变量的工作原理

通常,当给 Spark 操作的函数(如 mpareduce) 在 Spark 集群上执行时,函数中的变量单独的拷贝到各个节点上,函数执行时,使用的是自己节点执行上的变量,节点上的变量更新不会更新至 driver ,在任务之间支持通用的读写共享变量是低效的;然而,Spark 的提供了两种有限类型的共享变量:broadcast variablesaccumulators

Broadcast Variable

Broadcast Variable会将使用到的变量,仅仅为每个节点拷贝一份,而不会为每个task都拷贝一份副本,因此其最大的作用,就是减少变量到各个节点的网络传输消耗,以及在各个节点上的内存消耗

通过调用SparkContextbroadcast()方法,针对某个变量创建广播变量
注意: 广播变量,是只读的,在算子函数内,使用到广播变量时,每个节点只会拷贝一份副本。可以使用广播变量的value()方法获取值。

由下图,深入理解 Broadcast Variable

由图可知,普通变量Broadcast Variable 区别就是,网络传输可以大大的降低,Broadcast Variable 是每个节点机器只有一份,而 普通变量 是每个 task 都会有一份,浪费内存存储。

可以想象一个极端情况,如果map算子有10个task,恰好这10个task还都在一个worker节点上,那么这个时候,map算子使用的外部变量就会在这个worker节点上保存10份,这样就很占用内存了。

接下来通过具体的案例,来使用一下这个广播案例;代码如下图:

scala 复制代码
object BroadcastOpScala {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setAppName("BroadcastOpScala")
      .setMaster("local")
    val sc = new SparkContext(conf)

    val dataRdd = sc.parallelize(Array(1, 2, 3, 4, 5))
    val variable = 2
    // 1.定义广播变量
    val variableBroadcast = sc.broadcast(variable)
    // 2.使用广播变量,调用其 value方法
    dataRdd.map(_ * variableBroadcast.value).foreach(println _)
  }
}

Accumulator

Spark 提供的 Accumulator,主要用于多个节点对一个变量进行共享性的操作。

正常情况下在 Spark的任务中,由于一个算子可能会产生多个 task 并行执行,所以在这个算子内部执行的聚合计算,都是局部的,想要实现多个 task 进行全局聚合计算,此时就需要用到 Accumulator 这个共享的累加变量 。

注意: Accumulator只提供了累加的功能。在task只能对Accumulator进行累加操作,不能读取它的值 。只有在Driver 进程中才可以读取Accumulator的值。

代码如下:

scala 复制代码
object AccumulatorOpScala {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
    conf.setAppName("AccumulatorOpScala")
      .setMaster("local")
    val sc = new SparkContext(conf)

    val dataRDD = sc.parallelize(Array(1,2,3,4,5))
    // 1.定义累加变量
    val sumAccumulator = sc.longAccumulator
    // 2.使用累加变量
    dataRDD.foreach(sumAccumulator.add(_))
    println(sumAccumulator.value)
  }
}

结束

至此共享变量就结束了,如有问题,欢迎评论区提问。

相关推荐
得物技术4 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
肌肉娃子4 天前
20260227.spark.Spark 性能刺客:千万别在 for 循环里写 withColumn
spark
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
十月南城5 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
Asher05095 天前
Spark核心基础与架构全解析
大数据·架构·spark
FYKJ_20109 天前
springboot大学校园论坛管理系统--附源码42669
java·javascript·spring boot·python·spark·django·php
鸿乃江边鸟11 天前
Spark Datafusion Comet 向量化Rust Native--Native算子ScanExec以及涉及到的Selection Vectors
大数据·rust·spark·arrow
派可数据BI可视化12 天前
一文读懂系列:数据仓库为什么分层,分几层?数仓建模方法有哪些
大数据·数据仓库·信息可视化·spark·商业智能bi
码字的字节12 天前
锚点模型:数据仓库中的高度可扩展建模技术详解
大数据·数据仓库·spark