spark三大数据结构之累加器和广播变量

累加器:

  1. 定义: 累加器是一种分布式共享的只写变量,用于在Spark任务之间进行累加操作。由于任务在Executor端执行,不能直接使用for循环进行累加。

  2. 使用场景: 在进行累加计算时,为了避免大量的数据传输和重复占用内存,需要使用累加器,即Accumulator(缩写为ACC)。

  3. 累加器的作用: 累加器在Executor端执行累加操作,最后将结果聚合到Driver端。这样可以实现在分布式环境中的共享和累加计算。

广播变量:

  1. 问题背景: 闭包数据是以Task为单位发送的,可能导致一个Executor中含有大量重复的数据,占用大量内存。

  2. 解决方法: 为了避免重复数据占用内存,Spark引入了广播变量的概念。广播变量可以将闭包的数据保存到Executor的内存中,实现共享。

  3. 特点: 广播变量是分布式共享的只读变量,一旦广播,其值不能更改。它有效地减少了在集群中传输大量数据的开销,提高了任务的执行效率。

 

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

object AccumulatorExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("AccumulatorExample").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 创建累加器,初始值为0
    val sumAccumulator = sc.longAccumulator("sumAccumulator")

    // 创建一个RDD
    val data = List(1, 2, 3, 4, 5)
    val rdd = sc.parallelize(data)

    // 使用累加器进行元素之和的累加操作
    rdd.foreach { element =>
      sumAccumulator.add(element)
    }

    // 获取累加器的最终值
    val sumResult = sumAccumulator.value
    println(s"Sum of elements: $sumResult")

    sc.stop()
  }
}

 

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

object BroadcastVariableExample {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("BroadcastVariableExample").setMaster("local[*]")
    val sc = new SparkContext(conf)

    // 创建一个要广播的数据集
    val broadcastData = sc.broadcast(Seq("Apple", "Orange", "Banana"))

    // 创建一个RDD
    val rdd = sc.parallelize(Seq(1, 2, 3, 4, 5))

    // 使用广播变量进行数据集的过滤操作
    val filteredData = rdd.filter { element =>
      // 在所有节点上共享广播变量
      broadcastData.value.contains("Orange")
    }

    // 打印过滤后的数据
    filteredData.foreach(println)

    sc.stop()
  }
}
posted @ 2024-01-30 17:42  突破铁皮  阅读(64)  评论(0编辑  收藏  举报