2019独角兽企业重金招聘Python工程师标准>>>

一般来说,当一个函数被传递给Spark操作(例如map和reduce),在一个远程集群上运行,它实际上操作的是这个函数用到的所有变量的独立拷贝。这些变量会被拷贝到每一台机器,在远程机器上对变量的所有更新都不会被传播回驱动程序。通常看来,在任务之间中,读写共享变量显然不够高效。然而,Spark还是为两种常见的使用模式,提供了两种有限的共享变量:广播变量和累加器。

广播变量 Broadcast Variables

广播变量允许程序员保留一个只读的变量,缓存在每一台机器上,而非每个任务保存一份拷贝。他们可以这样被使用,例如,以一种高效的方式给每个结点一个大的输入数据集。Spark会尝试使用一种高效的广播算法来传播广播变量,从而减少通信的代价。

广播变量是通过调用SparkContext.broadcast(v)方法从变量v创建的。广播变量是一个v的封装器,它的值可以通过调用value方法获得。如下模块展示了这个:

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: spark.Broadcast[Array[Int]] = spark.Broadcast(b5c40191-a864-4c7d-b9bf-d87e1a4e787c)
scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

在广播变量被创建后,它应该在集群运行的任何函数中,代替v值被调用,从而v值不需要被再次传递到这些结点上。另外,对象v不能在广播后修改,这样可以保证所有结点的收到的都是一模一样的广播值。

累加器 Accumulators

累加器是一种只能通过关联操作进行“加”操作的变量,因此可以高效被并行支持。它们可以用来实现计数器(如MapReduce中)和求和器。Spark原生就支持Int和Double类型的累加器,开发者可以自己添加新的支持类型。

一个累加器可以通过调用SparkContext.accumulator(v)方法从一个初始值v中创建。运行在集群上的任务,可以通过使用+=来给它加值。然而,他们不能读取这个值。只有驱动程序可以使用value的方法来读取累加器的值。

如下的解释器模块,展示了如何利用累加器,将一个数组里面的所有元素相加:

scala> val accum = sc.accumulator(0, "My Accumulator")
accum: spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
scala> accum.valueres2: Int = 10

代码使用了内建的Int的累加器, 程序员也可以自己创建累加器接口AccumulatorParam的子类。. AccumulatorParam接口有两个方法, zero代表提供一个零值,addInPlace代表将两个值相加。 例如假定我们有一个Vector类,代表数学里的vector, 我们可以实现代码如下:

object VectorAccumulatorParam extends AccumulatorParam[Vector] {
def zero(initialValue: Vector): Vector = {
Vector.zeros(initialValue.size)
}
def addInPlace(v1: Vector, v2: Vector): Vector = {
v1 += v2
}
}
// Then, create an Accumulator of this type:
val vecAccum = sc.accumulator(new Vector(...))(VectorAccumulatorParam)

如果使用Scala, Spark也支持更通用的Accumulable接口, 可以累加不同类型的元素, SparkContext.accumulableCollection方法累加通用的collection类型.

转载于:https://my.oschina.net/forrest420/blog/469892

spark共享变量(广播变量Broadcast Variable,累加器Accumulators)相关推荐

  1. Spark共享变量(广播变量、累加器)

    Spark两种共享变量:广播变量(broadcast variable)与累加器(accumulator) 累加器用来对信息进行聚合,而广播变量用来高效分发较大的对象. 共享变量出现的原因: 通常在向 ...

  2. 【Spark】广播变量和累加器

    文章目录 一.Spark广播变量 二.累加器 Reference 一.Spark广播变量 多进程编程中,不同进程可以通过创建共享内存,进行进程间通信.而在分布式中,Spark通过[广播变量]和[累加器 ...

  3. spark 获取广播变量_Spark流式程序中广播变量和累加器为何使用单例模式

    Spark中广播变量详解以及如何动态更新广播变量​mp.weixin.qq.com 1.广播变量是只读的,使用单例模式可以减少Spark流式程序中每次job生成执行,频繁创建广播变量带来的开销 2. ...

  4. Spark编程指引(四)----共享变量(广播变量和累加器)

    转自:http://blog.csdn.net/happyanger6/article/details/46576831 共享变量 通常情况下,当向Spark操作(如map,reduce)传递一个函数 ...

  5. spark 广播变量大数据_Spark基础知识(三)--- Spark的广播变量和累加器

    在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本.这些变量会被复制到每台机器上,并且这些 ...

  6. spark中的广播变量broadcast

    Spark中的Broadcast处理 首先先来看一看broadcast的使用代码: val values = List[Int](1,2,3) val broadcastValues = sparkC ...

  7. Spark广播变量Broadcast

    注意:原文出处https://www.jianshu.com/p/3bd18acd2f7f Broadcast 顾名思义,broadcast 就是将数据从一个节点发送到其他各个节点上去.这样的场景很多 ...

  8. Spark中广播变量(boardcast)的使用

    1 使用广播变量的使用步骤 (1)声明广播变量 val board = sc.boardcast(XX) (2)使用 .value 获得广播变量的值 (3)变量只会被发到各个节点一次,且作为" ...

  9. spark 获取广播变量_spark使用广播变量

    import java.io.{File, FileReader} import java.util import org.apache.spark.SparkConf import org.apac ...

最新文章

  1. 亿级流量压力来袭,你的网站会被击垮吗?(下篇)
  2. Windows Azure Platform Introduction (6) Windows Azure应用程序运行环境
  3. Android开发高手课笔记--如何打造高质量应用?
  4. 【指标统计】删除抖动遥信
  5. Java线程详解(8)-线程的同步
  6. html设置flash满屏,在网页中实现flash全屏的几种方法
  7. Python 那些永远用不到的对象,我们称之为「垃圾」
  8. thinking-in-java(19)枚举类型
  9. 十分钟让你明白AIDL
  10. 文件操作,列表实例NiceHexSpiral
  11. 苹果对体无完肤的 iOS 11 最后的弥补
  12. VSCode 中文乱码
  13. 冬虫夏草之技术路线图之三【“路”——经营篇】
  14. Java第十一章总结
  15. Linux rm/rmdir 命令使用介绍
  16. html 整个页面只能看,如何截图整个完整的网页页面(包含滚动条下面看不到的网页)...
  17. nvidia驱动安装,屏幕偏移调整,及屏幕刷新率解决办法(摘自:中国Linux公社)
  18. python基础:模块的使用——time使用——时间记录器实现
  19. 计算机知识利用率,电脑CPU使用率怎么看 查看CPU使用率的快速方法图解
  20. 书山有路勤为径,学海无涯苦作舟

热门文章

  1. HTML 5 画布
  2. citrix xendesktop edition
  3. 一打开excel表,总提示有4.0版的宏
  4. View4.5测试参考文档1--测试环境规划
  5. android style theme
  6. 1177:奇数单增序列
  7. c#asp.net url 传递中文参数要使用 System.Web.HttpUtility.UrlEncode 而不能使用Server.UrlEncode...
  8. C#.NET 权限管理系统组件 - 大数据读写分离实现的例子
  9. Mybatis 别名机制,自动扫描 数据的增删改
  10. FastDFS存储服务器部署