千家信息网

大数据开发中Spark共享变量的累加器和广播变量怎么理解

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这期内容当中小编将会给大家带来有关大数据开发中Spark共享变量的累加器和广播变量怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spark 累加器与广播变量
千家信息网最后更新 2025年12月03日大数据开发中Spark共享变量的累加器和广播变量怎么理解

这期内容当中小编将会给大家带来有关大数据开发中Spark共享变量的累加器和广播变量怎么理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Spark 累加器与广播变量

一、简介

在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable):

  • 累加器:用来对信息进行聚合,主要用于累计计数等场景;

  • 广播变量:主要用于在节点间高效分发大对象。

二、累加器

这里先看一个具体的场景,对于正常的累计求和,如果在集群模式中使用下面的代码进行计算,会发现执行结果并非预期:

var counter = 0val data = Array(1, 2, 3, 4, 5)sc.parallelize(data).foreach(x => counter += x) println(counter)

counter 最后的结果是 0,导致这个问题的主要原因是闭包。

2.1 理解闭包

1. Scala 中闭包的概念

这里先介绍一下 Scala 中关于闭包的概念:

var more = 10val addMore = (x: Int) => x + more

如上函数 addMore 中有两个变量 x 和 more:

  • x : 是一个绑定变量 (bound variable),因为其是该函数的入参,在函数的上下文中有明确的定义;

  • more : 是一个自由变量 (free variable),因为函数字面量本生并没有给 more 赋予任何含义。

按照定义:在创建函数时,如果需要捕获自由变量,那么包含指向被捕获变量的引用的函数就被称为闭包函数。

2. Spark 中的闭包

也可以参考:https://blog.csdn.net/hu_lichao/article/details/112451982

在实际计算时,Spark 会将对 RDD 操作分解为 Task,Task 运行在 Worker Node 上。在执行之前,Spark 会对任务进行闭包,如果闭包内涉及到自由变量,则程序会进行拷贝,并将副本变量放在闭包中,之后闭包被序列化并发送给每个执行者。因此,当在 foreach 函数中引用 counter 时,它将不再是 Driver 节点上的 counter,而是闭包中的副本 counter,默认情况下,副本 counter 更新后的值不会回传到 Driver,所以 counter 的最终值仍然为零。

需要注意的是:在 Local 模式下,有可能执行 foreach 的 Worker Node 与 Diver 处在相同的 JVM,并引用相同的原始 counter,这时候更新可能是正确的,但是在集群模式下一定不正确。所以在遇到此类问题时应优先使用累加器。

累加器的原理实际上很简单:就是将每个副本变量的最终值传回 Driver,由 Driver 聚合后得到最终值,并更新原始变量。

2.2 使用累加器

SparkContext 中定义了所有创建累加器的方法,需要注意的是:被中横线划掉的累加器方法在 Spark 2.0.0 之后被标识为废弃。

使用示例和执行结果分别如下:

val data = Array(1, 2, 3, 4, 5)// 定义累加器val accum = sc.longAccumulator("My Accumulator")sc.parallelize(data).foreach(x => accum.add(x))// 获取累加器的值accum.value

三、广播变量

在上面介绍中闭包的过程中我们说道每个 Task 任务的闭包都会持有自由变量的副本,如果变量很大且 Task 任务很多的情况下,这必然会对网络 IO 造成压力,为了解决这个情况,Spark 提供了广播变量。

广播变量的做法很简单:就是不把副本变量分发到每个 Task 中,而是将其分发到每个 Executor,Executor 中的所有 Task 共享一个副本变量。

// 把一个数组定义为一个广播变量val broadcastVar = sc.broadcast(Array(1, 2, 3, 4, 5))// 之后用到该数组时应优先使用广播变量,而不是原值sc.parallelize(broadcastVar.value).map(_ * 10).collect()

四、观察变量

创建的Accumulator变量的值能够在Spark Web UI上看到,在创建时应该尽量为其命名,下面探讨如何在Spark Web UI上查看累加器的值

上述就是小编为大家分享的大数据开发中Spark共享变量的累加器和广播变量怎么理解了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

变量 累加器 闭包 广播 函数 副本 自由 任务 就是 情况 模式 结果 更新 数据 开发 原始 相同 内容 场景 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 直销直销软件开发公司 湖北二五六网络技术有限公司 通达oa数据库用的哪个 招商证券网络安全事件 网络技术与实践技能的关系 数据库 linux 监听 信息系统数据库访问模式 网络安全基础知识学习心得 互联网科技公司经营什么 五个数据库应用系统 票据交易软件开发 宁波科技服务项目互联网 数据库怎么删除字符中的一个数字 网络安全大讲堂观后感250字 成立网络安全自查领导小组的通知 网络安全和硬件工程师哪个好 三瑞网络技术有限公司 惠普服务器更新bios版本 cs1.6好玩点的服务器 网址链接客户端和服务器不支持 可视化数据库服务平台 不是网络安全问题因数 关于学生相关的数据库设计 奥维自定义地图服务器 怀柔区节能软件开发服务技术规范 网络技术ar 售票系统数据库需求分析简介 网络安全知识儿歌大全 华三hdm服务器默认密码 传统型数据库有哪些
0