当前位置: 首页 > news >正文

Spark-06:共享变量

目录

1.广播变量(broadcast variables)

2.累加器(accumulators)


      在分布式计算中,当在集群的多个节点上并行运行函数时,默认情况下,每个任务都会获得函数中使用到的变量的一个副本。如果变量很大,这会导致网络传输占用大量带宽,并且在每个节点上都占用大量内存空间。为了解决这个问题,Spark引入了共享变量的概念。

        共享变量允许在多个任务之间共享数据,而不是为每个任务分别复制一份变量。这样可以显著降低网络传输的开销和内存占用。Spark提供了两种类型的共享变量:广播变量(broadcast variables)和累加器(accumulators)。

1.广播变量(broadcast variables)

        通常情况下,Spark程序运行时,通常会将数据以副本的形式分发到每个执行器(Executor)的任务(Task)中,但当变量较大时,这会导致大量的内存和网络开销。通过使用广播变量,Spark将变量只发送一次到每个节点,并在多个任务之间共享这个副本,从而显著降低了内存占用和网络传输的开销。

Scala 实现:

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)

Java 实现:

Broadcast<int[]> broadcastVar = sc.broadcast(new int[] {1, 2, 3});broadcastVar.value();
// returns [1, 2, 3]

2.累加器(accumulators)

        累加器是Spark中的一种特殊类型的共享变量,主要用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量,在Executor端的每个task都会得到这个变量的一份新的副本,每个task更新这些副本的值后,传回Driver端进行merge。累加器支持的数据类型仅限于数值类型,包括整数和浮点数等。

Scala 实现:

scala> val accum = sc.longAccumulator("My Accumulator")
accum: org.apache.spark.util.LongAccumulator = LongAccumulator(id: 0, name: Some(My Accumulator), value: 0)scala> sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum.add(x))
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 sscala> accum.value
res2: Long = 10

Java 实现:

LongAccumulator accum = jsc.sc().longAccumulator();sc.parallelize(Arrays.asList(1, 2, 3, 4)).foreach(x -> accum.add(x));
// ...
// 10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 saccum.value();
// returns 10

相关文章:

  • SWOT是什么意思?SWOT分析必备的10款软件,别说你还不知道!
  • 朋友圈为什么会折叠?
  • render函数举例
  • Raptor安装
  • 「 Tomcat-pass-getshell 弱口令」
  • 【开源】基于Vue.js的车险自助理赔系统的设计和实现
  • 为什么vue中数组和对象的props默认值要写成函数形式?
  • 11-23 SSM4
  • 一个关于proto 文件的经验分享 :gRPC 跨语言双端通信显示错误码:12 UNIMPLEMENTED (附赠gRPC错误码表)
  • 【快应用】小程序转快应用中如何获取用户已授权的权限
  • Node.js之Buffer(缓冲器)
  • 前端开发工具集合
  • 01-了解微服务架构的演变过程和微服务技术栈
  • 免费接口集合让开发更简单
  • 管道在Vue和Angular中的作用及React的替代方案
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • GraphQL学习过程应该是这样的
  • HTTP请求重发
  • JAVA SE 6 GC调优笔记
  • Java方法详解
  • JS+CSS实现数字滚动
  • JSDuck 与 AngularJS 融合技巧
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node-glob通配符
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python打包系统简单入门
  • Python中eval与exec的使用及区别
  • Terraform入门 - 3. 变更基础设施
  • 从setTimeout-setInterval看JS线程
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 聊一聊前端的监控
  • 实现简单的正则表达式引擎
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 详解NodeJs流之一
  • 如何在招聘中考核.NET架构师
  • #pragam once 和 #ifndef 预编译头
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (十三)Flask之特殊装饰器详解
  • (算法二)滑动窗口
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)认识微服务
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)EOS中账户、钱包和密钥的关系
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .cfg\.dat\.mak(持续补充)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET企业级应用架构设计系列之技术选型