Spark-共享变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/awiner/article/details/84998092

共享变量

通常,当在远程集群节点上执行传递给Spark操作(例如mapor reduce)的函数时,它将在函数中使用的所有变量的单独副本上工作。这些变量将复制到每台计算机,并且远程计算机上的变量更新不会传播回驱动程序。支持跨任务的通用,读写共享变量效率低下。但是,Spark确实为两种常见的使用模式提供了两种有限类型的共享变量:广播变量和累加器。

广播变量

广播变量允许程序员在每台机器上保留一个只读变量,而不是随副本一起发送它的副本。例如,它们可用于以有效的方式为每个节点提供大输入数据集的副本。Spark还尝试使用有效的广播算法来分发广播变量,以降低通信成本。

Spark动作通过一组阶段执行,由分布式“shuffle”操作分隔。Spark自动广播每个阶段中任务所需的公共数据。以这种方式广播的数据以序列化形式缓存并在运行每个任务之前反序列化。这意味着显式创建广播变量仅在跨多个阶段的任务需要相同数据或以反序列化形式缓存数据很重要时才有用。

广播变量是v通过调用从变量创建的SparkContext.broadcast(v)。广播变量是一个包装器v,可以通过调用该value 方法来访问它的值。下面的代码显示了这个:
官方文档

//来自官方文档

//scala版
scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)


//java版
Broadcast<int[]> broadcastvar=sc.broadcast(new int[]{1,2,3});

broadcastvar.value();

//练习scala.广播变量BroadcastVariable
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

Object BroadcastVariable{
    val conf=new SparkConf().setAppName("BroadcastVariable").setMaster("local")
    
    val sc = new SparkContext(conf)
    
    val factor=3
    val factorBroadcast=sc.broadcast(factor)
    
    val numberArray=Array(1,2,3,4,5)
    val numbers=sc.parallelize(numberArray,1)
    val multipleNumbers=numbers.map(num=>num*factorBroadcast.value)
    
    multipleNumbers.foreach(num=>println(num))
}


//累加变量AccumulatorVariable
object AccumulatorVariable {
  
  def main(args: Array[String]) {
    val conf = new SparkConf()
        .setAppName("AccumulatorVariable")  
        .setMaster("local")  
    val sc = new SparkContext(conf)
    
    val sum = sc.accumulator(0)  
    
    val numberArray = Array(1, 2, 3, 4, 5) 
    val numbers = sc.parallelize(numberArray, 1)  
    numbers.foreach { num => sum += num }  
    
    println(sum) 
  }
  
}

图解在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/awiner/article/details/84998092
今日推荐