详解 Spark 核心编程之累加器

累加器是分布式共享只写变量

一、累加器功能

​ 累加器可以用来把 Executor 端的变量信息聚合到 Driver 端。在 Driver 程序中定义的变量,在 Executor 端的每个 Task 都会得到这个变量的一份新的副本,每个 task 更新这些副本的值后,传回 Driver 端进行 merge

在这里插入图片描述

二、累加器类型

1. 系统累加器

/**
常见的系统累加器:longAccumulator/doubleAccumulator/collectionAccumulator
说明:累加器一般放在行动算子中进行操作
*/
object TestRDDAcc {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[*]").setAppName("Acc")val sc = new SparkContext(conf)val rdd = sc.makeRDD(List(1,2,3,4), 2)// 创建累加器val accSum = sc.longAccumulator("sum")rdd.foreach(num => {accSum.add(num)    })println(accSum.value)sc.stop()}
}

三、自定义累加器

自定义累加器实现 WordCount 案例,避免 shuffle 操作

/**1.继承 AccumulatorV2[IN, OUT] 抽象类,定义输入输出的泛型类型1.1 IN 表述累加器 add 的数据的类型1.2 OUT 表示累加器 value 的返回类型2.重写累加器的抽象方法
*/
object TestAccWordCount {def main(args: Array[String]): Unit = {val conf = new SparkConf().setMaster("local[*]").setAppName("WCAcc")val sc = new SparkContext(conf)val rdd = sc.makeRDD(List("hello", "hive", "hello", "spark"))// 创建自定义累加器val wcAcc = new MyAccumulator()// 向 spark 进行注册sc.register(wcAcc, "wordCountAcc")// 循环遍历 rddrdd.foreach(word => {// 使用累加器wcAcc.add(word)    })// 输出累加器的值println(wcAcc.value)sc.stop()}
}/*自定义累加器
*/
class MyAccumulator extends AccumulatorV2[String, mutable.Map[String, Long]] {// 定义累加器的返回结果 Mapprivate var resultMap = mutable.Map[String, Long]()// 判断是否为初始状态override def isZero: Boolean = resultMap.isEmpty()// 复制累加器override def copy(): AccumulatorV2[String, mutable.Map[String, Long]] = {this}// 重置累加器override def reset(): Unit = resultMap.clear()// 获取累加器输入的数据进行操作override def add(word: String): Unit = {// 向 resultMap 中添加新值或累加旧值val count = resultMap.getOrElse(word, 0L) + 1resultMap.update(word, count)}// 合并多个累加器的结果override def merge(other:  AccumulatorV2[String, mutable.Map[String, Long]]): Unit = {other.value.foreach({case (word, count) => {val newCount = this.resultMap.getOrElse(word, 0L) + 1this.resultMap.update(word, newCount)}})
}// 返回累加器的结果override def value: mutable.Map[String, Long] = resultMap}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 两两交换链表中的节点

原题链接24. 两两交换链表中的节点 - 力扣(LeetCode) 思路,请看图片的过程模拟,这里添加了一个哨兵节点0,目的是为了方便操作,得到指向1节点的指针。 class Solution {public:ListNode* swapPairs(ListNod…

天润融通:大模型与生成式AI的融合,开辟零售增长新路径

大模型时代,零售消费企业如何用数智化出奇制胜。 近期,由国内领先的科技产业资本研究平台第一新声举办的“2024年中国CIO数字策略大会”在上海隆重举行。 天润融通消费零售行业顾问颜欣欣先生受邀参与此次大会,并发表了《大模型实践分享:基…

基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细

基于Nginx和Consul构建自动发现的Docker服务架构 文章目录 基于Nginx和Consul构建自动发现的Docker服务架构资源列表基础环境一、安装Docker1.1、Consul节点安装1.2、registrator节点安装 二、案例前知识点2.1、什么是Consul 三、基于Nginx和Consul构建自动发现的Docker服务架构…

智慧商砼搅拌车安监运营管理的创新实践

随着城市化进程的加速,商砼搅拌车作为城市建设的重要设备,其安全管理与运营效率直接关系到工程质量和施工进度。近年来,通过引入先进的4G无线视频智能车载终端套件,我们实现了对商砼搅拌车的高精度定位、实时音视频调度、实时油量…

Matlab2010安装注册+激活(保姆级教程)

目录 一、软件安装 二、软件激活 三、软件测试 Matlab2010压缩包: 链接:https://pan.baidu.com/s/1bX4weZ0nC-4zlDLUiSKcRQ?pwdxljj 提取码:xljj 一、软件安装 1.解压所给压缩包,目录双击setup.exe打开. (如果用户名为中文则会遇到这个…

virtualbox虚拟机、centos7安装增强工具

文章目录 1. virtualBox语言设置2. 设置终端启动快捷键3. 添加virtualbox 增强工具4. 设置共享文件夹 1. virtualBox语言设置 virtualbox -> file -> perferences -> language ->选择对应的语言 -> OK virtualbox -> 管理 -> 全局设定 -> 语言 -> …

Ubuntu server 24 (Linux) 普通用户不能sudo 也不能使用root登录 忘记root密码 修复解决方案

一 普通用户无法sudo,同时也没有其他用户可用 #test用户使用sudo报错,没有权限 testtest:~$ sudo vi /etc/sudoers [sudo] password for test: test is not in the sudoers file. 二 关闭ubuntu 服务器,重新开机 按下ESC 键 1 出现GRUB…

SAP跨服务器传输请求号

环境一、两台服务器并没有维护连接传输线路(DEV和QAS) 环境二、需要将外部公司服务器上的请求号传输到内部服务器中 方式:先从开发环境或服务器中下载请求号,再将请求号上传到目标服务器或环境中,在目标服务器使用ST…

JAVA流程控制do...while循环

1.对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次 2.do...while循环和while循环相似,不同的是,do...whlie循环至少会执行一次 do{ //代码语句 }while(…

KMP(Knuth-Morris-Pratt)算法详解及C++代码实现

在计算机科学中,字符串匹配是一个基础且重要的任务。给定一个主字符串(也称为文本)和一个模式字符串(也称为词),字符串匹配算法的任务是在主字符串中查找与模式字符串相同的子串,并返回其位置。…

【ECMAScript 详解:现代 JavaScript 的核心】

ECMAScript 详解 ECMAScript 是 JavaScript 的官方标准,它定义了 JavaScript 的核心语法和功能。在这篇文章中,我们将深入探讨 ECMAScript 的各个方面,包括历史背景、语言特性、新功能和未来发展趋势。 目录 介绍 什么是 ECMAScript&#x…

[240602] ChatGPT 背后的残酷真相:AI 正以吞噬地球的速度消耗资源 | KEV - 已知漏洞利用目录

目录 ChatGPT 背后的残酷真相:AI 正以吞噬地球的速度消耗资源KEV - 已知漏洞利用目录 ChatGPT 背后的残酷真相:AI 正以吞噬地球的速度消耗资源 主要观点: 科技行业,尤其是像 ChatGPT 这样的大型语言模型,正在消耗大量…

yolov10/v8 loss详解

v10出了就想看看它的loss设计有什么不同,看下来由于v8和v10的loss部分基本一致就放一起了。 v10的论文笔记,还没看的可以看看,初步尝试耗时确实有提升 好记性不如烂笔头,还是得记录一下,以免忘了,废话结束…

【基础算法总结】模拟算法

模拟算法 1.替换所有的问号2.提莫攻击3.Z 字形变换4.外观数列5.数青蛙 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 模拟算法 —> 比葫芦…

笔记理财投资

当制定一个具体的理财计划时,可以参考以下步骤和内容: 设定理财目标 短期目标(如1-3年):储蓄一笔紧急备用金,或者为某个短期旅行、购买特定物品等存钱。 中期目标(如3-10年)&#x…

Python魔法之旅-魔法方法(10)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

Swift 并发

并发 一、定义和调用异步函数二、异步序列三、并行的调用异步方法四、任务和任务组1、非结构化并发2、任务取消 五、Actors Swift 对于结构化的编写异步和并行代码有着原生的支持。异步代码可以被挂起并在之后继续执行,同一时间只能有一段代码被执行。代码支持挂起和…

SpringMVC:获取请求数据

1. 通过RequestParma注解接收 /**** value和name都可以使用,互为别名* 如果此处设置了需要什么参数而前端请求时没有提供则会报400(请求参数不一致错误)* required参数用于设置该参数是否为必须传递参数,默认为true必须传递* defa…

HTML5 新的语义化标签

CSS3 和 HTML5 引入了大量新特性&#xff0c;为前端开发提供了更多功能和更好的语义化支持。这本教程将详细介绍 CSS3 新语法和技巧&#xff0c;以及 HTML5 新的语义化标签元素&#xff0c;如 <header>、<footer>、<section>、<article>、<nav> …

07.与jenkins集成实现cicd

7.与jenkins集成实现ci/cd ip地址服务内存192.168.111.11kube-apiserver 80801G192.168.111.13k8s-node22G192.168.111.14jenkins(tomcat jdk) 8080 kubelet docker1G192.168.111.15gitlab 8080,80 docker2G 通过jenkins一键操作实现发布服务&#xff0c;jenkins对接k8s …