累加器

Spark的累加器和广播变量

佐手、 提交于 2020-03-09 08:17:39
累加器 累加器用来对信息进行聚合,通常在向 Spark传递函数时,比如使用 map() 函数或者用 filter() 传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果想实现所有分片处理时更新共享变量的功能,那么累加器可以实现想要的效果。 系统累加器 针对一个输入的文件,如果我们想计算文件中所有空行的数量,编写以下程序: scala > val notice = sc . textFile ( "/hyk/spark/words.txt" ) notice : org . apache . spark . rdd . RDD [ String ] = / hyk / spark / words . txt MapPartitionsRDD [ 1 ] at textFile at < console > : 24 scala > val blanklines = sc . longAccumulator ( "MyAccumulator" ) blanklines : org . apache . spark . util . LongAccumulator = LongAccumulator ( id : 0 , name : Some ( MyAccumulator ) ,

combineByKey算子

Deadly 提交于 2020-03-09 00:38:11
combineByKey算子 包括createCombiner(累加器),mergeValue(将该键的累加器对应的当前值与新的值合并),mergeCombiners(将各个分区的结果进行合并)。 Function<ScoreDetail, Tuple2<Float, Integer>> createCombine = new Function<ScoreDetail, Tuple2<Float, Integer>>() { @Override public Tuple2<Float, Integer> call(ScoreDetail scoreDetail) throws Exception { return new Tuple2<>(scoreDetail.score, 1); } }; Function2<Tuple2<Float, Integer>, ScoreDetail, Tuple2<Float, Integer>> mergeValue = new Function2<Tuple2<Float, Integer>, ScoreDetail, Tuple2<Float, Integer>>() { @Override public Tuple2<Float, Integer> call(Tuple2<Float, Integer> tp, ScoreDetail

第5章 RDD编程进阶

社会主义新天地 提交于 2020-02-08 17:08:01
上篇: 第4章 大数据Spark连接HBase数据读取与保存 Spark 三大数据结构 RDD:分布式数据集 广播变量:分布式只读共享变量 累加器: 分布式只写共享变量 1、累加器 累加器用来对信息进行聚合,通常在向 Spark传递函数时,比如使用 map() 函数或者用 filter() 传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果我们想实现所有分片处理时更新共享变量的功能,那么累加器可以实现我们想要的效果。 代码具体实现: package com . study . bigdatabase import org . apache . hadoop . hbase . HBaseConfiguration import org . apache . hadoop . hbase . client . Put import org . apache . hadoop . hbase . io . ImmutableBytesWritable import org . apache . hadoop . hbase . mapred . TableOutputFormat import org . apache . hadoop . hbase . util . Bytes

累加器与装载传送指令

可紊 提交于 2020-02-03 12:18:47
累加器与装载指令,传送指令。 录制的视频实现的STL语句表的功能: (1)通过装载指令 将 300付给 MW2 研究装载指令执行的过程 (2)通过装载指令 将500付给MW4 研究装载指令执行的过程 (3)通过"+I" 指令,将累加器1中的16位整数与累加器2 中的16位整数相加,结果保存在累加器1中。 (4)通过传送指令 将累加器1中的内容 复制到 目标地址 MW6中去。 通过视频 了解 累加器 与装载指令 传送指令的关系。 了解 32位 累加器 是用来 处理字 字节 双字 的 寄存器 累加器是执行STL语句标的关键部件。 在STL语句表程序中,存储区的地址之间,存储区的地址与外设输入/外设输出 之间 不能直接进行数据交换,只能通过累加器进行交换,累加是上述数据交换的中转站。 通过视频 了解到以下关键问题点。 问题1:PLCSIM 在仿真 S7-300 的时候 不能像单片机那样进行 单步调试程序。 刚开始 我猜想 在PKCSIM中可以 完成 操作 "单步调试" 当STL语句表红箭头指向 第2条语句 表示第一条语句中 执行完毕,相对应 下面照片中 右边的视图只有第一行 更新。 实际上是没法实现的。 问题2:PLCSIM中的单次扫描图表,并不是但不运行,他表示 程序只执行一次循环 问题3:如果非要看一条指令的执行结果 。怎么办? 我可以只写一条指令,然后 单步运行。 问题4:实际上

Java8笔记(2)

自闭症网瘾萝莉.ら 提交于 2020-01-27 17:54:20
Java8笔记(2) 用流收集数据 收集器 函数式编程相对于指令式编程的一个主要优势:你只需指出希望的结果——“做什么”,而不用操心执行的步骤——“如何做” 收集器用作高级归约 收集器非常有用,因为用它可以简洁而灵活地定义 collect 用来生成结果集合的标准。更具体地说,对流调用collect 方法将对流中的元素触发一个归约操作(由 Collector 来参数化) 一般来说, Collector 会对元素应用一个转换函数(很多时候是不体现任何效果的恒等转换,例如 toList ),并将结果累积在一个数据结构中,从而产生这一过程的最终输出 预定义收集器 预定义收集器的功能,也就是那些可以从 Collectors类提供的工厂方法(例如 groupingBy )创建的收集器。它们主要提供了三大功能 将流元素归约和汇总为一个值 元素分组 元素分区 归约和汇总 在需要将流项目重组成集合时,一般会使用收集器( Stream 方法 collect的参数)。再宽泛一点来说,但凡要把流中所有的项目合并成一个结果时就可以用。这个结果可以是任何类型,可以复杂如代表一棵树的多级映射,或是简单如一个整数 public class M1 { public static void main(String[] args) { List<Dish> menu = Data.create(); // 利用

Flink分布式缓存与累加器

◇◆丶佛笑我妖孽 提交于 2020-01-14 07:50:06
分布式缓存 Flink提供了一个分布式缓存,类似于hadoop,可以使用户在并行函数中很方便的读取本地文件,并把它放在taskmanager节点中,防止task重复拉取。此缓存的工作机制如下:程序注册一个文件或者目录(本地或者远程文件系统,例如hdfs或者s3),通过ExecutionEnvironment注册缓存文件并为它起一个名称。 当程序执行,Flink自动将文件或者目录复制到所有taskmanager节点的本地文件系统,仅会执行一次。用户可以通过这个指定的名称查找文件或者目录,然后从taskmanager节点的本地文件系统访问它。 其实分布式缓存就相当于spark的广播,把一个变量广播到所有的executor上,也可以看做是Flink的广播流,只不过这里广播的是一个文件. 示例 Step 1 : 注册一个文件,可以使用hdfs上的文件 也可以是本地文件进行测试 Step 2 : 使用文件 注意: 在用户函数中访问缓存文件或者目录(这里是一个map函数)。这个函数必须继承RichFunction,因为它需要使用RuntimeContext读取数据: java分布式缓存代码如下: /** * <p/> DataSet 分布式缓存 </li> * <li>@author: li.pan</li> * <li>Date: 2019/12/29 16:10 下午</li> * <li

jdk8-》reduce操作

若如初见. 提交于 2020-01-07 08:34:54
什么是reduce操作   聚合操作,中⽂意思是 “减少”   根据⼀定的规则将Stream中的元素进⾏计算后返回⼀个 唯⼀的值   常⽤⽅法⼀:     Optional<T> reduce(BinaryOperator<T> accumulator);     accumulator 计算的累加器     例⼦: 第⼀个元素相加和第⼆个元素相加,结果再和第三个元素相加,直到全部相加完成     int value = Stream.of(1, 2, 3, 4, 5).reduce((item1, item2) -> item1+ item2).get();   常⽤⽅法⼆:     T reduce(T identity, BinaryOperator<T> accumulator);     identity ⽤户提供⼀个循环计算的初始值     accumulator 计算的累加器     例⼦: 100作为初始值,然后和第⼀个元素相加,结果在和第⼆个元素相加,直到全部相加完成     int value = Stream.of(1, 2, 3, 4,5).reduce(100, (sum, item) -> sum +item);   练习 : 求最⼤值   int value = Stream.of(1645, 234345, 32,44434,564534,435

【转载】spark累加器(详细)

社会主义新天地 提交于 2019-12-21 04:00:46
一、生产常用Spark累加器剖析之一 由于最近在项目中需要用到Spark的累加器,同时需要自己去自定义实现Spark的累加器,从而满足生产上的需求。对此,对Spark的累加器实现机制进行了追踪学习。 本系列文章,将从以下几个方面入手,对Spark累加器进行剖析: Spark累加器的基本概念 累加器的重点类构成 累加器的源码解析 累加器的执行过程 累加器使用中的坑 自定义累加器的实现 Spark累加器基本概念 Spark提供的Accumulator,主要用于多个节点对一个变量进行共享性的操作。Accumulator只提供了累加的功能,只能累加,不能减少累加器只能在Driver端构建,并只能从Driver端读取结果,在Task端只能进行累加。 至于这里为什么只能在Task累加呢?下面的内容将会进行详细的介绍,先简单介绍下: 在Task节点,准确的就是说在executor上; 每个Task都会有一个累加器的变量,被序列化传输到executor端运行之后再返回过来都是独立运行的; 如果在Task端去获取值的话,只能获取到当前Task的,Task与Task之间不会有影响 累加器不会改变Spark lazy计算的特点,只会在Job触发的时候进行相关的累加操作 累加器的重点类介绍 class Accumulator extends Accumulable 源码

Spark自定义累加器实现WordCount

北城以北 提交于 2019-12-18 02:34:09
Spark自定义累加器实现WordCount 自定义累加器,继承AccumulatorV2 继承后需要实现几个方法 class AccWordCount extends AccumulatorV2 [ String , mutable . HashMap [ String , Int ] ] { override def isZero : Boolean = ? ? ? override def copy ( ) : AccumulatorV2 [ String , mutable . HashMap [ String , Int ] ] = ? ? ? override def reset ( ) : Unit = ? ? ? override def add ( v : String ) : Unit = ? ? ? override def merge ( other : AccumulatorV2 [ String , mutable . HashMap [ String , Int ] ] ) : Unit = ? ? ? override def value : mutable . HashMap [ String , Int ] = ? ? ? } 方法的具体实现代码 private val hashAcc = new mutable . HashMap [

spark记录(20)自定义累加器Accumulator

戏子无情 提交于 2019-12-03 15:12:04
自定义累加器 /** * 自定义累加器需要继承AccumulatorV2<IN,OUT>类 * 并且要指定要累加的类型 */ public class MyAccumulator extends AccumulatorV2<MyKey,MyKey> implements Serializable { private MyKey info = new MyKey(0, 0); public MyKey getInfo() { return info; } public void setInfo(MyKey info) { this.info = info; } //判断是否是初始状态,直接与原始状态的值比较 @Override public boolean isZero() { return info.getPersonAgeSum()==0 && info.getPersonNum()==0; } //复制一个新的累加器 @Override public AccumulatorV2<MyKey, MyKey> copy() { MyAccumulator myAccumulator = new MyAccumulator(); myAccumulator.info = this.info; return myAccumulator; } /