前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spark的共享变量

Spark的共享变量

作者头像
天策
发布2018-06-22 14:33:17
6100
发布2018-06-22 14:33:17
举报
文章被收录于专栏:行者悟空行者悟空

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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年01月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档