spark 获取广播变量_Spark2.x入门:共享变量类型:广播变量和累加器(下)

微信公众号: 大数据开发运维架构

关注可了解更多大数据相关的资讯。问题或建议,请公众号留言;

如果您觉得“大数据开发运维架构”对你有帮助,欢迎转发朋友圈


概述:

上篇文章我们讲了“Spark2.x进阶:深入理解Spark中的闭包”,我建议你看本篇文章之前先看上一篇关于闭包的讲解,上篇文章中sum求和后是0,而不是期望的15。如何解决闭包问题呢?如果RDD想操作一个作用域外的变量,一般都是用共享变量来实现,之前也写广播变量的用法,这里讲一下累加器的用法。

为什么要定义累加器?

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

这里还是跟上篇文章类似的代码,只不过定义了一个累加器sum,而不是普通变量,实例实例代码如下:

package com.hadoop.ljs.spark220.studyimport org.apache.spark.{SparkConf, SparkContext}/**  * @author: Created By lujisen  * @company ChinaUnicom Software JiNan  * @date: 2020-02-20 19:36  * @version: v1.0  * @description: com.hadoop.ljs.spark220.study  */object AccumlatorTest {  def main(args: Array[String]): Unit = {    val sparkConf=new SparkConf().setMaster("local[*]").setAppName("AccumlatorTest")    val sc=new SparkContext(sparkConf)    /*定义一个共享变量:累加器*/    val sum=sc.accumulator(0)    /*输入数据*/    val rdd1=sc.parallelize(List(1,2,3,4,5))    /*求和 ,然后各个元素加1*/    val rdd2=rdd1.map(x=>{      sum+=x      x    })    /*这里是个action操作 没有这个操作,程序不会执行*/    rdd2.collect()    println("求和:"+sum)    sc.stop()  }}

运行结果如下,sum=15,符合我们的期望值:

6901adf9f906f32a4348cd83fefc9230.png

结合上面的代码说一下累加器的执行过程:

1).Accumulator需要在Driver进行定义和并初始化,并进行注册,同时Accumulator首先需要在Driver进行序列化,然后发送到Executor端;另外,Driver接收到Task任务完成的状态更新后,会去更新Value的值,然后在Action操作执行后就可以获取到Accumulator的值了。

2).Executor接收到Task之后会进行反序列化操作,反序列化得到RDD和function,同时在反序列化的同时也去反序列化Accumulator,同时也会向TaskContext完成注册,完成任务计算之后,随着Task结果一起返回给Driver端进行处理。

这里有执行过程图可以参考下:

eaf35e0f18930d244990229dd54dca95.png

累加器特性:

1.累加器也是也具有懒加载属性,只有在action操作执行时,才会强制触发计算求值;

2.累加器的值只可以在Driver端定义初始化,在Executor端更新,不能在Executor端进行定义初始化,不能在Executor端通过[.value]获取值,任何工作节点上的Task都不能访问累加器的值;

3.闭包里的执行器代码可以使用累加器的 += 方法(在Java中是 add )增加累加器的值。


特别提醒:

累加器在Driver端定义赋初始值,累加器只能在Driver端读取最后的值,在Excutor端更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值