累加器

计算机组成原理-累加器实验——沐雨先生 计算机组成原理-累加器实验 阅读详情

目录
1.累加器简单使用
2.累加器异常
3.自定义累加器

1.累加器简单使用

Spark内置的提供了Long和Double类型的累加器。下面是一个简单的使用示例,在这个例子中我们在过滤掉RDD中奇数的同时进行计数,最后计算剩下整数的和。

/**
  * @Auther: chenyj
  * @Date: 2018/9/7 14:23
  * @Description:
  */
object spark {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("spark").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val accum = sc.longAccumulator("longAccum") //统计偶数的个数
    val rddSum = 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("accum: "+accum.value)
    println("rddSum: "+rddSum)
    sc.stop()
  }
}

这是结果正常的情况,但是在使用累加器的过程中如果对于spark的执行过程理解的不够深入就会遇到两类典型的错误:少加(或者没加)、多加.
结果

accum: 4
rddSum: 20

2.累加器异常

2.1 少加
/**
  * @Auther: chenyj
  * @Date: 2018/9/7 14:23
  * @Description:
  */
object spark {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("spark").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val accum = sc.longAccumulator("longAccum") //统计偶数的个数
    val rddSum = sc.parallelize(Array(1,2,3,4,5,6,7,8,9),2)
      .map(n=>{
          accum.add(1L)
    })
    println("accum: "+accum.value)
    sc.stop()
  }
}

结果:

accum: 0

原因:
执行完毕,打印的值是多少呢?答案是0,因为累加器不会改变spark的lazy的计算模型,即在打印的时候像map这样的transformation还没有真正的执行,从而累加器的值也就不会更新。

2.2 多加
/**
  * @Auther: chenyj
  * @Date: 2018/9/7 14:23
  * @Description:
  */
object spark {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("spark").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val accum = sc.longAccumulator("longAccum") //统计偶数的个数
    val rddSum = sc.parallelize(Array(1,2,3,4,5,6,7,8,9),2)
      .map(n=>{
          accum.add(1L)
        n
    })
    rddSum.count
    println("accum1:"+accum.value)
    rddSum.reduce(_+_)
    println("accum2: "+accum.value)
    sc.stop()
  }
}

结果:

accum1:9
accum2:18

原因:
我们虽然只在map里进行了累加器加1的操作,但是两次得到的累加器的值却不一样这是由于count和reduce都是action类型的操作,触发了两次作业的提交,所以map算子实际上被执行了了两次,在reduce操作提交作业后累加器又完成了一轮计数,所以最终累加器的值为18。究其原因是因为count虽然促使numberRDD被计出来,但是由于没有对其进行缓存,所以下次再次需要使用numberRDD这个数据集是,还需要从并行化数据集的部分开始执行计算。解释到这里,这个问题的解决方法也就很清楚了,就是在count之前调用numberRDD的cache方法(或persist),这样在count后数据集就会被缓存下来,reduce操作就会读取缓存的数据集而无需从头开始计算了。改成如下代码即可:

import org.apache.spark.{SparkConf, SparkContext}

/**
  * @Auther: chenyj
  * @Date: 2018/9/7 14:23
  * @Description:
  */
object spark {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("spark").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val accum = sc.longAccumulator("longAccum") //统计偶数的个数
    val rddSum = sc.parallelize(Array(1,2,3,4,5,6,7,8,9),2)
      .map(n=>{
          accum.add(1L)
        n
    })
    //cache()
    rddSum.cache().count
    println("accum1:"+accum.value)
    rddSum.reduce(_+_)
    println("accum2: "+accum.value)
    sc.stop()
  }
}

3.自定义累加器

在2.0版本后,累加器的易用性有了较大的改进,而且官方还提供了一个新的抽象类:AccumulatorV2来提供更加友好的自定义类型累加器的实现方式。官方同时给出了一个实现的示例:CollectionAccumulator类,这个类允许以集合的形式收集spark应用执行过程中的一些信息。例如,我们可以用这个类收集Spark处理数据时的一些细节,当然,由于累加器的值最终要汇聚到driver端,为了避免 driver端的outofmemory问题,需要对收集的信息的规模要加以控制,不宜过大。
实现自定义类型累加器需要继承AccumulatorV2并至少覆写下例中出现的方法,下面这个累加器可以用于在程序运行过程中收集一些文本类信息,最终以Set[String]的形式返回。

自定义累加器

import java.util

import org.apache.spark.util.AccumulatorV2

/**
  * @Auther: chenyj
  * @Date: 2018/9/7 14:55
  * @Description:
  */
class teAccumulator extends AccumulatorV2[String, java.util.Set[String]]{
  private val _teArray: java.util.Set[String] = new java.util.HashSet[String]()

  override def isZero: Boolean = {
    _teArray.isEmpty
  }

  override def copy(): AccumulatorV2[String, util.Set[String]] = {
    val newTe = new teAccumulator();
    _teArray.synchronized{
      newTe._teArray.addAll(_teArray)
    }
    newTe
  }

  override def reset(): Unit = {
    _teArray.clear()
  }

  override def add(v: String): Unit = {
    _teArray.add(v)
  }

  override def merge(other: AccumulatorV2[String, util.Set[String]]): Unit = {
    other match {
      case o: teAccumulator => _teArray.addAll(o.value)
    }
  }

  override def value: util.Set[String] = {
    java.util.Collections.unmodifiableSet(_teArray)
  }
}

测试类

import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.JavaConversions._

/**
  * @Auther: chenyj
  * @Date: 2018/9/7 14:23
  * @Description:
  */
object spark {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setAppName("spark").setMaster("local[2]")
    val sc = new SparkContext(sparkConf)
    val accum = new teAccumulator()
    sc.register(accum,"teAccSum")
    val sum = sc.parallelize(Array("1", "2a", "3", "4b", "5", "6", "7c", "8d", "9"), 2).filter(line => {
      val pattern = """^-?(\d+)"""
      val flag = line.matches(pattern)
      if (!flag) {
        accum.add(line)
      }
      flag
    }).map(_.toInt).reduce(_ + _)

    println("sum: " + sum)

    for(i <- accum.value)
      println(i)
    sc.stop()
    }
}

ps: 注意导入 import scala.collection.JavaConversions._
否则报错 :value foreach is not a member of java.util.Set[String]
结果:

sum: 24
7c
8d
4b
2a
Spark 累加器 阅读详情

相关推荐

高效爬取懂车帝车型数据:从静态解析到动态反爬实战

本文详细解析了如何高效爬取懂车帝车型数据,从静态HTML解析到动态接口反爬的完整实战路径。文章重点介绍了使用浏览器开发者工具定位数据、应对CSS混淆与参数加密等反爬策略,并提供了整合静态与动态抓取逻辑的Python代码示例,帮助开发者稳健地获取结构化车型信息。

wind6的博客 937

累加器实验

图 1 为本实验数据通路总框图,其中 ALU 由 2 片 74LS181 构成,DR 1、DR2 和 AR 均为一片 74LS273 ,RAM 为一片 6116 芯片,R0 寄存器为一片 74LS374 芯片,△ 表示三态门 74LS245 ,时序发生器为虚拟实验系统提供的虚拟组件。WE:存储器写信号。LDDR2:DR2 的数据加载信号,与 T4 脉冲配合将总线上的数据打入 DR2 中。其中,被加数由数据开关输入,加数存放在存储器中,其地址也从数据开关输入.运算结果存入存储器中,存入的地址由数据开关设置。

m0_73322501的博客 7788

SIMULIA-Simpack 2022x新功能介绍

增加库伦摩擦类型力元95 Coulomb Friction增加了3种新的摩擦方向类型用于模拟平面、圆柱和球面摩擦。针对平移和旋转摩擦改进了滑动到粘着过渡阶段的检测,增加一个参数定义两种不同的滑移-粘滞过渡模式,即“Unloaded stick stiffness”和“Preload stick with last slip”。新增加124'Applied Load’力元允许用户将力或扭矩作为恒定值或通过激励元素施加到To Marker点上。该力元建模操作方便,效率高。支持线性柔性体装配。

crystalzhan的博客 1047

Spark学习笔记(14)——累加器

如果我们在Driver端定义一个变量,然后将该变量发送Executor端进行累加赋值操作,那么Driver端的变量值会发生改变吗?答案是不会,因为Executor端操作的是变量的副本,并不能影响Driver端的变量值。如何在这样的分布式系统中实现变量的共写呢?这就要用到累加器 一、累加器实现原理 累加器是Spark 计算框架为了能够进行高并发和高吞吐的数据处理封装的三大数据结构之一,功能是实现分布式共享只写变量。累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中.

m0_56602092的博客 2013

如何在R中高效安装ropls及其依赖包

本文详细介绍了在R语言中高效安装ropls包及其依赖的完整流程。作为Bioconductor生物信息学分析包,ropls的安装需通过BiocManager管理器进行。文章提供了标准安装步骤、跨系统避坑指南及安装后验证方法,帮助用户解决R版本、编译环境和网络镜像等常见问题,确保代谢组学数据分析工具顺利部署。

efc123456的博客 908

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分

/在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入0,并在k=0时运算。三、程序清单(每条语句必须包括注释或在开发窗口注释后截图)四、综合、管脚分配、生成输出文件、下载(所有步骤截图)五、仿真程序清单、波形(波形截图必做,截图!.k(k),//开关。

Welcome To My6n Blog 4332

计算机组成原理 累加器实验

累加器实验 数据通过总线到R0 74LS245总线收发器 74LS374 参考总线与微命令 加上一个R0寄存器 预设置电路,打开电源 数据开关R0():将数据开关设置为A(00000011);单击时序发生器的Start按钮,等待一个CPU周期。 存储器操作数DR2( ):将数据开关设为B的地址(00001000);单击Start按钮。等待一个CPU周期后,B的值已存入DR2。 R0DR1( ):单击start按钮,等待一个CPU周期后,R0的值已存入DR1。 DR1+DR2

Long_UP的博客 4万+

数据仓库从明细到汇总:DWD与DWS层建模实战指南

DWS层的“主题”是指业务分析的核心场景,通常分为“用户主题、商品主题、订单主题、营销主题”等。主题的定义需紧密结合业务需求,避免“为了汇总而汇总”。例如,电商平台的核心业务需求包括“用户活跃度分析”“商品销售情况分析”“订单转化分析”,对应的DWS层主题即可定义为“用户主题汇总表”“商品主题汇总表”“订单主题汇总表”。主题定义时需注意“粒度适中”——汇总粒度既不能过细(否则与DWD层重复,失去汇总意义),也不能过粗(否则无法满足细分分析需求)。

2401_83088008的博客 644

计算机组成原理实验 累加器

实验6 累加器

人言束负兑生|完美是完蛋的开始 1万+

Simulink仿真入门到精通(三) Simulink信号

本系列教程是根据孙忠潇编著的<<Simulink仿真及代码生成技术入门到精通>>学习笔记。 目录 Simulink仿真入门到精通(一) Simulink界面介绍 Simulink仿真入门到精通(二) Simulink模块 Simulink仿真入门到精通(三) Simulink信号 Simulink仿真入门到精通(四) Simulink子系统 Simulink仿真入门到精通(五) Simulink模型的仿真 Simulink仿真入门到精通(六) Simulink模型保存为图片 Sim

king110108的专栏 5395

灰质-白质组织对比(Gray-white matter tissue contrast,GWC)计算以及可视化

GWC是深层灰质与浅表白质(superficial white matter,SWM)之间T1加权信号强度的比值,已知髓鞘中的胆固醇是T1加权信号强度的主要影响因素,因此GWC大致反映了大脑皮层和浅表白质之间的髓鞘化差异。GWC代表灰白质交界处的模糊程度,较低的GWC表明灰质和白质交界处更相似和更模糊;较高的GWC表明灰白质分界更加清楚。据之前的研究报道,局灶性皮质发育不良、颞叶癫痫、帕金森病、强迫症、精神分裂症和自闭症谱系障碍中存在灰白质交界区GWC异常增高或降低。 灰质信号强度和白质信号强度采集的示意图

xxx 733

Spark中累加器的应用及场景

一、什么是累加器 累加器(Accumulators)与广播变量(Broadcast Variables)共同作为Spark提供的两大共享变量,主要用于跨集群的数据节点之间的数据共享,突破数据在集群各个executor不能共享问题。 而累加器主要定义在driver节点,在executor节点进行操作,最后在driver节点聚合结果做进一步的处理。 二、常见的累加器 Spark提供了三种常见的累加器,分别是LongAccumulator(参数支持Integer、Long)、DoubleAccumulat

星空的风fly 5247

NX二次开发(Python)-UIStyler-选择体和按钮操作

用UG NX的UIStyler块界面编辑器,生成带有“选择体”和“按钮”操作的一个界面,如下图所示:

GimiGimmy 2311

密码学累加器cryptographic accumulator

密码学累加器最早是由 Josh Benaloh 和 Michael de Mare 提出的,原始论文《One-way accumulators: A decentralized alternative to digital sinatures (extended abstract) 》[1] 于 1993 年发表在欧洲密码学会议(EUROCRYPT)上。这篇论文最初就是为了解决区块链上的数据可访问...

mutourend2010@gmail.com 9152

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

spark累加器

spark中有三大数据结构,它们分别是RDD(弹性分布式数据集)、累加器(分布式只写变量)和广播变量(分布式只读变量)。spark累加器就是定义在驱动程序的一个变量,但是在集群中的每一个任务都会有一份新的副本。在各个任务中更新副本的值都不会对驱动程序中的值产生影响,只有到最后所有的任务都计算完成后才会合并每一个任务的副本到驱动程序。累加器的提示如下: spark有系统累加器,同时也支持自定义累加...

weixin_43854618的博客 2553

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

spark 累加器

spark 累加器

qq_43192537的博客 3021

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Flink累加器

Flink累加器

dwjlyl 2281

Spark累加器(Accumulator)

累加器运行解释

limenghao2002的博客 1964

java 累加器_Spark累加器(Accumulator)

一、累加器简介在Spark中如果想在Task计算的时候统计某些事件的数量,使用filter/reduce也可以,但是使用累加器是一种更方便的方式,累加器一个比较经典的应用场景是用来在Spark Streaming应用中记录某些事件的数量。使用累加器时需要注意只有Driver能够取到累加器的值,Task端进行的是累加操作。创建的Accumulator变量的值能够在Spark Web UI上看到,在创...

weixin_31939167的博客 1819

Flink 源码剖析|累加器

(合并多个累加器的结果)功能的一种数据结构,在作业结束后,可以获取所有部分(各个 operator 的各个 subtask)合并后的最终结果并发送到客户端。类型表示累加器结果的类型,这个类型必须是可序列化的。,因此可以在不同算子(operator)的不同 UDF 中使用同一个累加器,Flink 会合并将所有具有相同名称的累加器。,但是要求累加的值的类型与累加器的结果的类型必须相同,适用于一些相对简单的操作,例如计数器。类型表示每一次向累加器中的累加的值的类型,这个类型不要求是可序列化的;

长行 2192

Spark2.10中使用累加器、注意点以及实现自定义累加器

累加器(accumulator)是Spark中提供的一种分布式的变量机制,其原理类似于mapreduce,即分布式的改变,然后聚合这些改变。累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数。 累加器简单使用 Spark内置的提供了Long和Double类型的累加器。下面是一个简单的使用示例,在这个例子中我们在过滤掉RDD中奇数的同时进行计数,最后计算剩下整数的和。 val

古月慕南的代码世界 1万+

PySpark 累加器使用及自定义累加器

累加器(accumulator) 功能 实现在Driver端和Executor端共享变量 写的功能 实现机制 Driver端定义的变量,在Executor端的每个Task都会得到这个变量的副本; 在每个Task对自己内部的变量副本值更新完成后,传回给Driver端,然后将每个变量副本的值进行累计操作; 触发/生效 时机 受惰性求值机制的影响,只有在行动算子执行时 累加器才起作用; 使用地方 最好只在行动算子中使用,不要在转换算子中使用,因为转换算子可能出现失败时会重试,这时对应的累加器的值也会

rgc_520_zyl的博客 2957

RSA累加器的介绍

一个密码学上的累加器是一个单向的隶属函数。它可用于识别一个候选是否为一个集合的成员,且不会在过程中暴露集合中的成员。这是WIKI上的定义。目前在主流的区块链中,用来对交易进行验证的是通过默克尔树传递数据来进行的,特别是轻量级节点和钱包,基本是离不开默克尔树的数据交换的。如果在比特币网络中,还稍好一些,毕竟比特币的交易速度有限。但随着以太坊及EOS的出现,交易量开始不断上升,那么,做为需要进行网络通信的默克尔树的数据,就开始变得越来越大。

qq_46341621的博客 2969

SparkCore之累加器的使用

SparkCore之累加器的使用1. 系统累加器1.1 累加器的说明1.2 使用步骤1.3 案例实操2. 自定义累加器2.1 说明2.2 自定义累加器的步骤2.3 案例实操 1. 系统累加器 1.1 累加器的说明 累加器:分布式共享只写变量。(Task和Task之间不能读数据) 累加器用来对信息进行聚合,通常在向Spark传递函数时,比如使用map()函数或者用filter()传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器

zjfstart的博客 1260

Spark累加器|系统累加器|自定义累加器

累加器 累加器:分布式共享只写变量。(Task和Task之间不能读数据) 累加器用来对信息进行聚合,通常在向Spark传递函数时,比如使用map()函数或者用 filter()传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果我们想实现所有分片处理时更新共享变量的功能,那么累加器可以实现我们想要...

SmallScorpion 982
上一篇: Hive-自定义UDF
下一篇: order by,sort by, distribute by, cluster by作用以及用法
yjgithub
博客等级 码龄11年 53粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值