spark三大数据结构之累加器和广播变量
累加器:
-
定义: 累加器是一种分布式共享的只写变量,用于在Spark任务之间进行累加操作。由于任务在Executor端执行,不能直接使用for循环进行累加。
-
使用场景: 在进行累加计算时,为了避免大量的数据传输和重复占用内存,需要使用累加器,即Accumulator(缩写为ACC)。
-
累加器的作用: 累加器在Executor端执行累加操作,最后将结果聚合到Driver端。这样可以实现在分布式环境中的共享和累加计算。
广播变量:
-
问题背景: 闭包数据是以Task为单位发送的,可能导致一个Executor中含有大量重复的数据,占用大量内存。
-
解决方法: 为了避免重复数据占用内存,Spark引入了广播变量的概念。广播变量可以将闭包的数据保存到Executor的内存中,实现共享。
-
特点: 广播变量是分布式共享的只读变量,一旦广播,其值不能更改。它有效地减少了在集群中传输大量数据的开销,提高了任务的执行效率。
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()
}
}