Accumulator简介

Accumulator是spark提供的累加器,顾名思义,该变量只能够增加。

只有driver能获取到Accumulator的值(使用value方法),Task只能对其做增加操作(使用 +=)。你也可以在为Accumulator命名(不支持Python),这样就会在spark web ui中显示,可以帮助你了解程序运行的情况。

Accumulator使用

使用示例

举个最简单的accumulator的使用例子:

//在driver中定义

val accum = sc.accumulator(0, "Example Accumulator")//在task中进行累加

sc.parallelize(1 to 10).foreach(x=> accum += 1)//在driver中输出

accum.value//结果将返回10

res: 10

累加器的错误用法

val accum= sc.accumulator(0, "Error Accumulator")val data = sc.parallelize(1 to 10)//用accumulator统计偶数出现的次数,同时偶数返回0,奇数返回1

val newData = data.map{x => {if(x%2 == 0){accum += 10}else 1}}//使用action操作触发执行

newData.count//此时accum的值为5,是我们要的结果

accum.value//继续操作,查看刚才变动的数据,foreach也是action操作

newData.foreach(println)//上个步骤没有进行累计器操作,可是累加器此时的结果已经是10了//这并不是我们想要的结果

accum.value

原因分析

官方对这个问题的解释如下描述:

For accumulator updates performed inside actions only, Spark guarantees that each task’s update to the accumulator will only be applied once, i.e. restarted tasks will not update the value. In transformations, users should be aware of that each task’s update may be applied more than once if tasks or job stages are re-executed.

我们都知道,spark中的一系列transform操作会构成一串长的任务链,此时需要通过一个action操作来触发,accumulator也是一样。因此在一个action操作之前,你调用value方法查看其数值,肯定是没有任何变化的。

所以在第一次count(action操作)之后,我们发现累加器的数值变成了5,是我们要的答案。

之后又对新产生的的newData进行了一次foreach(action操作),其实这个时候又执行了一次map(transform)操作,所以累加器又增加了5。最终获得的结果变成了10。

这里写图片描述

解决办法

看了上面的分析,大家都有这种印象了,那就是使用累加器的过程中只能使用一次action的操作才能保证结果的准确性。

事实上,还是有解决方案的,只要将任务之间的依赖关系切断就可以了。什么方法有这种功能呢?你们肯定都想到了,cache,persist。调用这个方法的时候会将之前的依赖切除,后续的累加器就不会再被之前的transfrom操作影响到了。

val accum= sc.accumulator(0, "Error Accumulator")val data = sc.parallelize(1 to 10)//代码和上方相同

val newData = data.map{x => {...}}//使用cache缓存数据,切断依赖。

newData.cache.count//此时accum的值为5

accum.valuenewData.foreach(println)//此时的accum依旧是5

accum.value

总结

使用Accumulator时,为了保证准确性,只使用一次action操作。如果需要使用多次则使用cache或persist操作切断依赖。

转自:http://www.jianshu.com/p/1b7c9a63bc7c

在《spark快速大数据分析》一书里,作者提到转换操作中的累加器最好是在调试中使用,而真正使用的话最好是行动操作中!

转载于:https://www.cnblogs.com/bonelee/p/6038999.html

Spark累加器(Accumulator)陷阱及解决办法相关推荐

  1. Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法

    Spark运行程序异常信息: org.apache.spark.SparkException: Task not serializable 解决办法 参考文章: (1)Spark运行程序异常信息: o ...

  2. MySQL : ROUND 函数四舍五入陷阱及解决办法

    在MySQL中, ROUND 函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并无预期的那样,本文将这一问题记录下来,并提出解决方案. 问题描述 假如咱们有以下一个数据表 ...

  3. IDEA15 下运行Scala遇到问题以及解决办法

    为了让Scala运行起来还是很麻烦,为了大家方便,还是记录下来: 1.首先我下载的是IDEA的社区版本,版本号为15. 2.下载安装scala插件: 2.1 进入设置菜单. 2.2 点击安装JetBr ...

  4. 【原创】搭建spark环境中的坑及解决办法

    一.在搭建好环境之后如果在安装了 spark-1.6-bin-without-hadoop (spark.apache.org/download) 之后,在python 中 "import ...

  5. spark环境安装及配置详细(附带相关错误及解决办法)

    安装spark之前需要成功安装scala 解压安装包 更改名字 修改环境变量 使环境变量生效 修改配置文件 进入spark目录 进入conf 查看文件 更改文件名称 将spark-env.sh.tem ...

  6. spark 累加器的使用探索

    spark 累加器的使用探索 1 spark不能在遍历rdd过程中修改全局map 2 spark 提供的累加器的使用 2.1 了解累加器 2.2 spark 提供的累加器的使用 2.3 完整代码 3 ...

  7. 全网最详细的Xshell或SecureCRT下spark-shell里出现无法退格或者删除的问题现象的解决办法(图文详解)...

    不多说,直接上干货! 前言 打开spark的命令行后,发现输错字符了,但是无法退格或者删除,这是比较苦恼的问题. 这个问题,得看你是用Xshell,还是SecureCRT. 一般是出现在SecureC ...

  8. Spark面对OOM问题的解决方法及优化总结 (转载)

    Spark面对OOM问题的解决方法及优化总结 (转载) 转载地址: http://blog.csdn.net/yhb315279058/article/details/51035631 Spark中的 ...

  9. java写入carbondata_Carbondata使用过程中遇到的几个问题及解决办法

    本文总结了几个本人在使用 Carbondata 的时候遇到的几个问题及其解决办法.这里使用的环境是:Spark 2.1.0.Carbondata 1.2.0. 必须指定 HDFS nameservic ...

最新文章

  1. 水平和垂直翻转可视对象
  2. python绘制动态模拟图-如何利用Python动态模拟太阳系运转
  3. 人机交互、大数据分析:移动互联网的技术创新探索
  4. [J2ME QA]真机报告MontyThread -n的错误之解释
  5. JQ插件 jquery mobiscroll
  6. Android之用命令uninstall卸载apk和用 -i 过滤日志忽略大小写
  7. 面试中遇到这 3 个SQL问题,最容易掉坑里!
  8. Linux清mysql磁盘,mysql与linux ~ 磁盘分析与调优
  9. skywalking使用方法_SkyWalking 源码分析—— Collector Server Component 服务器组件
  10. win7下hosts文件位置
  11. zabbix-2.0.8日常巡检-检测项目状态
  12. 消费者Heartbeat分析
  13. log4j mysql 异步_spring boot:配置druid数据库连接池(开启sql防火墙/使用log4j2做异步日志/spring boot 2.3.2)...
  14. 如何测量太阳距离地球的距离
  15. 细说在兄弟连搞上PHP的那些事儿
  16. 典型相关分析(CCA)原理及例子
  17. 建群网培PMP每日一练2020-7-17
  18. 【ImportError: cannot import name ‘json‘ from ‘itsdangerous‘】
  19. iOS 手机记录登录账号密码列表
  20. 用户访问我计算机不用凭据,如何进行凭据管理实现自动登录网络

热门文章

  1. Linux下的USB总线驱动 3
  2. python 3.7.3 运算7错误_Python中通常不应该犯的7个错误
  3. constraintlayout布局新特性_安卓ConstraintLayout布局
  4. 计算机二级在学校报还是外面报好,谁知道考计算机二级在哪个学校比较好啊?...
  5. 大学期间可以获得哪些荣誉_大学期间没有什么荣誉经历,该怎么写简历呢?找工作会很难吗?...
  6. centos oracle命令,CentOS7命令行方式搭建Oracle11gR2
  7. ajax提交表单,导致浏览器卡死
  8. react native 的底部导航栏以及跳转页面带参数
  9. 【Java面试题】docker启动失败原因
  10. 计算机仿真实训操作开车步骤,仿真实训系统解决方案