累加器(accumulator)是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变。累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。

累加器简单使用
Spark内置的提供了Long和Double类型的累加器。下面是一个简单的使用示例,在这个例子中我们在过滤掉RDD中奇数的同时进行计数,最后计算剩下整数的和。
val sparkConf = new SparkConf().setAppName("Test").setMaster("local[2]")
val sc = new SparkContext(sparkConf)
val accum = sc.longAccumulator("longAccum") //统计奇数的个数
val sum = sc.parallelize(Array(1,2,3,4,5,6,7,8,9),2).filter(n=>{
if(n%2!=0) accum.add(1L)
n%2==0
}).reduce(_+_)
println("sum: "+sum)
println("accum: "+accum.value)
sc.stop()
结果为:
sum: 20
accum: 5
这是结果正常的情况,但是在使用累加器的过程中如果对于spark的执行过程理解的不够深入就会遇到两类典型的错误:少加(或者没加)、多加。
自定义累加器
自定义累加器类型的功能在1.X版本中就已经提供了,但是使用起来比较麻烦,在2.0版本后,累加器的易用性有了较大的改进,而且官方还提供了一个新的抽象类:AccumulatorV2来提供更加友好的自定义类型累加器的实现方式。官方同时给出了一个实现的示例:CollectionAccumulator类,这个类允许以集合的形式收集spark应用执行过程中的一些信息。例如,我们可以用这个类收集Spark处理数据时的一些细节,当然,由于累加器的值最终要汇聚到driver端,为了避免 driver端的outofmemory问题,需要对收集的信息的规模要加以控制,不宜过大。
继承AccumulatorV2类,并复写它的所有方法
package spark
import constant.Constant
import org.apache.spark.util.AccumulatorV2
import util.getFieldFromConcatString
import util.setFieldFromConcatString
open class SessionAccmulator : AccumulatorV2<String, String>() {
private var result = Constant.SESSION_COUNT + "=0|"+
Constant.TIME_PERIOD_1s_3s + "=0|"+
Constant.TIME_PERIOD_4s_6s + "=0|"+
Constant.TIME_PERIOD_7s_9s + "=0|"+
Constant.TIME_PERIOD_10s_30s + "=0|"+
Constant.TIME_PERIOD_30s_60s + "=0|"+
Constant.TIME_PERIOD_1m_3m + "=0|"+
Constant.TIME_PERIOD_3m_10m + "=0|"+
Constant.TIME_PERIOD_10m_30m + "=0|"+
Constant.TIME_PERIOD_30m + "=0|"+
Constant.STEP_PERIOD_1_3 + "=0|"+
Constant.STEP_PERIOD_4_6 + "=0|"+
Constant.STEP_PERIOD_7_9 + "=0|"+
Constant.STEP_PERIOD_10_30 + "=0|"+
Constant.STEP_PERIOD_30_60 + "=0|"+
Constant.STEP_PERIOD_60 + "=0"
override fun value(): String {
return this.result
}
/**
* 合并数据
*/
override fun merge(other: AccumulatorV2<String, String>?) {
if (other == null) return else {
if (other is SessionAccmulator) {
var newResult = ""
val resultArray = arrayOf(Constant.SESSION_COUNT,Constant.TIME_PERIOD_1s_3s, Constant.TIME_PERIOD_4s_6s, Constant.TIME_PERIOD_7s_9s,
Constant.TIME_PERIOD_10s_30s, Constant.TIME_PERIOD_30s_60s, Constant.TIME_PERIOD_1m_3m,
Constant.TIME_PERIOD_3m_10m, Constant.TIME_PERIOD_10m_30m, Constant.TIME_PERIOD_30m,
Constant.STEP_PERIOD_1_3, Constant.STEP_PERIOD_4_6, Constant.STEP_PERIOD_7_9,
Constant.STEP_PERIOD_10_30, Constant.STEP_PERIOD_30_60, Constant.STEP_PERIOD_60)
resultArray.forEach {
val oldValue = other.result.getFieldFromConcatString("|", it)
if (oldValue.isNotEmpty()) {
val newValue = oldValue.toInt() + 1
//找到原因,一直在循环赋予值,debug30分钟 很烦
if (newResult.isEmpty()){
newResult = result.setFieldFromConcatString("|", it, newValue.toString())
}
//问题就在于这里,自定义没有写错,合并错了
newResult = newResult.setFieldFromConcatString("|", it, newValue.toString())
}
}
result = newResult
}
}
}
override fun copy(): AccumulatorV2<String, String> {
val sessionAccmulator = SessionAccmulator()
sessionAccmulator.result = this.result
return sessionAccmulator
}
override fun add(p0: String?) {
val v1 = this.result
val v2 = p0
if (v2.isNullOrEmpty()){
return
}else{
var newResult = ""
val oldValue = v1.getFieldFromConcatString("|", v2!!)
if (oldValue.isNotEmpty()){
val newValue = oldValue.toInt() + 1
newResult = result.setFieldFromConcatString("|", v2, newValue.toString())
}
result = newResult
}
}
override fun reset() {
val newResult = Constant.SESSION_COUNT + "=0|"+
Constant.TIME_PERIOD_1s_3s + "=0|"+
Constant.TIME_PERIOD_4s_6s + "=0|"+
Constant.TIME_PERIOD_7s_9s + "=0|"+
Constant.TIME_PERIOD_10s_30s + "=0|"+
Constant.TIME_PERIOD_30s_60s + "=0|"+
Constant.TIME_PERIOD_1m_3m + "=0|"+
Constant.TIME_PERIOD_3m_10m + "=0|"+
Constant.TIME_PERIOD_10m_30m + "=0|"+
Constant.TIME_PERIOD_30m + "=0|"+
Constant.STEP_PERIOD_1_3 + "=0|"+
Constant.STEP_PERIOD_4_6 + "=0|"+
Constant.STEP_PERIOD_7_9 + "=0|"+
Constant.STEP_PERIOD_10_30 + "=0|"+
Constant.STEP_PERIOD_30_60 + "=0|"+
Constant.STEP_PERIOD_60 + "=0"
result = newResult
}
override fun isZero(): Boolean {
val newResult = Constant.SESSION_COUNT + "=0|"+
Constant.TIME_PERIOD_1s_3s + "=0|"+
Constant.TIME_PERIOD_4s_6s + "=0|"+
Constant.TIME_PERIOD_7s_9s + "=0|"+
Constant.TIME_PERIOD_10s_30s + "=0|"+
Constant.TIME_PERIOD_30s_60s + "=0|"+
Constant.TIME_PERIOD_1m_3m + "=0|"+
Constant.TIME_PERIOD_3m_10m + "=0|"+
Constant.TIME_PERIOD_10m_30m + "=0|"+
Constant.TIME_PERIOD_30m + "=0|"+
Constant.STEP_PERIOD_1_3 + "=0|"+
Constant.STEP_PERIOD_4_6 + "=0|"+
Constant.STEP_PERIOD_7_9 + "=0|"+
Constant.STEP_PERIOD_10_30 + "=0|"+
Constant.STEP_PERIOD_30_60 + "=0|"+
Constant.STEP_PERIOD_60 + "=0"
return this.result == newResult
}
}
方法介绍
value方法:获取累加器中的值
merge方法:该方法特别重要,一定要写对,这个方法是各个task的累加器进行合并的方法(下面介绍执行流程中将要用到)
iszero方法:判断是否为初始值
reset方法:重置累加器中的值
copy方法:拷贝累加器
spark中累加器的执行流程:
首先有几个task,spark engine就调用copy方法拷贝几个累加器(不注册的),然后在各个task中进行累加(注意在此过程中,被最初注册的累加器的值是不变的),执行最后将调用merge方法和各个task的结果累计器进行合并(此时被注册的累加器是初始值)
总结
以上就是本文关于Spark自定义累加器的使用实例详解的全部内容,希望对大家有所帮助。有什么问题可以随时留言,小编会及时回复大家的。
# spark
# 自定义累加器
# 累加器
# Spark的广播变量和累加器使用方法代码示例
# Spark入门简介
# 使用docker快速搭建Spark集群的方法教程
# java 中Spark中将对象序列化存储到hdfs
# Hadoop组件简介
# 深入浅析Java Object Serialization与 Hadoop 序列化
# Java执行hadoop的基本操作实例代码
# 浅谈七种常见的Hadoop和Spark项目案例
# 自定义
# 过程中
# 是一个
# 这是
# 器中
# 有什么
# 几个
# 就会
# 是在
# 在这个
# 出了
# 在此
# 可以用
# 错了
# 有几个
# 后将
# 过大
# 类似于
# 就在于
相关文章:
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
贸易公司网站制作流程,出口贸易网站设计怎么做?
如何用AWS免费套餐快速搭建高效网站?
为什么Go需要go mod文件_Go go mod文件作用说明
北京网站制作的公司有哪些,北京白云观官方网站?
建站上市公司网站建设方案与SEO优化服务定制指南
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
建站主机如何安装配置?新手必看操作指南
如何在企业微信快速生成手机电脑官网?
如何在搬瓦工VPS快速搭建网站?
如何通过二级域名建站提升品牌影响力?
,购物网站怎么盈利呢?
如何通过商城免费建站系统源码自定义网站主题?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何在阿里云通过域名搭建网站?
如何快速生成橙子建站落地页链接?
建站之星后台密码遗忘如何找回?
如何选择CMS系统实现快速建站与SEO优化?
潮流网站制作头像软件下载,适合母子的网名有哪些?
浅析上传头像示例及其注意事项
MySQL查询结果复制到新表的方法(更新、插入)
如何通过PHP快速构建高效问答网站功能?
建站之星后台管理系统如何操作?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
广州建站公司哪家好?十大优质服务商推荐
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
,交易猫的商品怎么发布到网站上去?
建站之星安装后如何自定义网站颜色与字体?
建站主机服务器选购指南:轻量应用与VPS配置解析
如何快速搭建二级域名独立网站?
建站之星代理费用多少?最新价格详情介绍
如何在香港免费服务器上快速搭建网站?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
金*站制作公司有哪些,金华教育集团官网?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何做静态网页,sublimetext3.0制作静态网页?
大连网站设计制作招聘信息,大连投诉网站有哪些?
如何通过山东自助建站平台快速注册域名?
怎么将XML数据可视化 D3.js加载XML
广州美橙建站如何快速搭建多端合一网站?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
在线制作视频的网站有哪些,电脑如何制作视频短片?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何快速搭建自助建站会员专属系统?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。