从0开始学习spark(6)Spark共享变量之累加器和广播变量的使用!!!

在这里插入图片描述
每日福利来一个。


没有看前面的同学可以回顾一下:

5.RDD常用算子用法训练(附习题答案)(aggregateByKey与combineByKey)!!!
4.Spark Rdd常用算子和RDD必备知识
3.spark core 核心知识
2.spark 之 wordcount入门
1.spark 入门讲解

1. spark共享变量(Shared Variables)

1.1 简介:

在 Spark 程序中,当一个传递给 Spark 操作(例如 map 和 reduce)的函数在远程节点上面运行 时,Spark 操作实际上操作的是这个函数所用变量的一个独立副本。这些变量会被复制到每台机器上,并且这些变量在远程机器上的所有更新都不会传递回驱动程序。通常跨任务的读 写变量是低效的,但是,Spark 还是为两种常见的使用模式提供了两种有限的共享变量:
广播变(Broadcast Variable)和累加器(Accumulator)

1.2 为什么要定义广播变量 :

如果我们要在分布式计算里面分发大对象,例如:字典,集合,黑白名单等,这个都会由 Driver 端进行分发,一般来讲,如果这个变量不是广播变量,那么每个 task 就会分发一份, 这在 task 数目十分多的情况下 Driver 的带宽会成为系统的瓶颈,而且会大量消耗 task 服务 器上的资源,如果将这个变量声明为广播变量,那么知识每个 executor 拥有一份,这个 executor 启动的 task 会共享这个变量,节省了通信的成本和服务器的资源。
如果没有使用广播变量如下图:
在这里插入图片描述
使用了广播变量之后:

在这里插入图片描述

1.3 、如何定义和还原一个广播变量 :

//定义: 
val a = 3 
val broadcast = sc.broadcast(a) 
//还原: 
val c = broadcast.value 
//注意:变量一旦被定义为一个广播变量,那么这个变量只能读,不能修改 

注意事项 :
1、能不能将一个 RDD 使用广播变量广播出去? 不能,因为 RDD 是不存储数据的。可以将 RDD 的结果广播出去。
2、广播变量只能在 Driver 端定义,不能在 Executor 端定义。
3、在 Driver 端可以修改广播变量的值,在 Executor 端无法修改广播变量的值。
4、如果 executor 端用到了 Driver 的变量,如果不使用广播变量在 Executor 有多少 task 就有 多少 Driver 端的变量副本。
5、如果 Executor 端用到了 Driver 的变量,如果使用广播变量在每个 Executor 中都只有一份 Driver 端的变量副本。

2. Accumulators(累加器)

2.1 为什么要定义累加器 :

在 Spark 应用程序中,我们经常会有这样的需求,如异常监控,调试,记录符合某特性的数 据的数目,这种需求都需要用到计数器,如果一个变量不被声明为一个累加器,那么它将在 被改变时不会在 driver 端进行全局汇总,即在分布式运行时每个 task 运行的只是原始变量的 一个副本,并不能改变原始变量的值,但是当这个变量被声明为累加器后,该变量就会有分 布式计数的功能。

图解累加器:

错误的图解:
在这里插入图片描述

正确的图解:

在这里插入图片描述

2.2 如果定义和还原一个累加器

定义累加器: 
val a = sc.longAccumulator(0) 
还原累加器:
val b = a.value

注意事项
1、累加器在 Driver 端定义赋初始值,累加器只能在 Driver 端读取最后的值,在 Excutor 端更 新。
2、累加器不是一个调优的操作,因为如果不这样做,结果是错的

累加器代码案例:

object _03SparkRDDAccumulatorOps {
   
    def main(args: Array[String]): Unit = {
   
        Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
        Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
        Logger.getLogger
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋蛋淡淡定

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值