Spark的共享变量

Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,内部的变量有不同的作用域,不能相互访问,有些情况下不太方便,所以Spark提供了两类共享变量供编程使用——广播变量和计数器。

1. 广播变量

这是一个只读对象,在所有节点上都有一份缓存,创建方法是SparkContext.broadcast(),比如:

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)

注意,广播变量是只读的,所以创建之后再更新它的值是没有意义的,一般用val修饰符来定义广播变量。

2. 计数器

计数器只能增加,可以用于计数或求和,默认是数值型,支持自定义类型。在Web界面上,也可以看到计数器共享变量。

计数器变量的创建方法是SparkContext.accumulator(v, name),其中v是初始值,name是名称。注意,只有Driver程序可以读这个计算器变量,RDD操作中读取计数器变量是无意义的。

示例如下:

scala> val accum = sc.accumulator(0, "My Accumulator")
accum: org.apache.spark.Accumulator[Int] = 0
scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum += x)
...
17/01/22 17:57:51 INFO DAGScheduler: Job 0 finished: foreach at <console>:24, took 0.649155 s
scala> accum.value
res1: Int = 10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

Java Web技术经验总结(十五)

1113
来自专栏专注 Java 基础分享

深入理解Struts2----类型转换

     之前的一系列文章主要介绍了有关Struts2的一些基本用法和部分的简单原理,但是始终没有介绍有关拦截器的相关内容,从本篇开始我们将从另一个角度去深入理...

2199
来自专栏自学笔记

python基本常识

tuple,str都可以看做是一种list,都可以进行切片操作。 利用切片操作,去掉一个字符串的前后空格。要注意是是前后空格是不止一个的,可能有很多个。

2535
来自专栏技术点滴

编译器构造

编译器构造 一、 编译器简介 前面谈到静态链接器构造的基本流程,最后提到所构造的链接器若要能正常工作的前提是需要构造一个能生成符合链接器输入文件格式的编译器,本...

2318
来自专栏程序员的知识天地

最值得你收藏的30个Python常用小技巧!

[0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 121, 144, 169, 196, 225,...

1212
来自专栏Java技术

那些鲜为人知的序列化和反序列化底层实现原理!

序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列...

802
来自专栏木木玲

JVM中 对象的内存布局 以及 实例分析

2038
来自专栏数据科学

redis流计算

使用了tornado的异步和streamz的流处理两个库,需要redis 5.0以上版本

1704
来自专栏大内老A

ModelBinder——ASP.NET MVC Model绑定的核心

Model的绑定体现在从当前请求提取相应的数据绑定到目标Action方法的参数。通过前面的介绍我们知道Action方法的参数通过ParameterDescrip...

2179
来自专栏与神兽党一起成长

强类型与弱类型语言关于存取对象(数据)的问题

在旧的业务流程加入一个“拦截”,原来从前端表单提交到后台的处理逻辑延后处理,本质上是一个异步化的处理过程。 此时将表单参数存储到数据库,在适当的时刻“拦截”结束...

1709

扫码关注云+社区