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 Edge

虚拟机的类加载机制1 类加载的时机

25010
来自专栏木木玲

Reference 、ReferenceQueue 详解

2467
来自专栏java初学

java — JVM调优

3329
来自专栏码代码的陈同学

Procedure Call and Stack

最近查资料时,偶然在youtobe看到了华盛顿大学自然科学与工程一位老师 关于 Procedure & Stacks 的课程,深入讲解了基于Stack的过程调用...

59029
来自专栏Java编程

Java虚拟机体系结构

一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消...

7281
来自专栏云霄雨霁

Java虚拟机--方法调用

1715
来自专栏冷冷

Spring整合Hibernate 之 save、saveorupdate、persist方法的区别

这三个方法,也就是save()、saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别。例如,save()只能...

20510
来自专栏运维技术迷

Python获得13位unix时间戳

Python中的time模块把datetime时间转换为10位的时间戳,之前有记录过转换的方法。而今天调用的API中需要的是13位(一般Java里默认是13位(...

3175
来自专栏coding for love

JS入门难点解析8-作用域,作用域链,执行上下文,执行上下文栈等分析

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

651
来自专栏加米谷大数据

Spark RDD Map Reduce 基本操作

RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。从编程的角度来看,RDD可以简单看成是一个数组。和普通数组的区别是,RDD中的数...

1102

扫码关注云+社区