spark累计器

因为task的执行是在多个Executor中执行,所以会出现计算总量的时候,每个Executor只会计算部分数据,不能全局计算。

累计器是可以实现在全局中进行累加计数。

注意:

累加器只能在driver端定义,driver端读取,不能在Executor端读取。

广播变量只能在driver端定义,在Executor端读取,Executor不能修改。

下面是实践的代码

package SparkStreaming;

import org.apache.commons.collections.iterators.ArrayListIterator;
import org.apache.commons.io.LineIterator;
import org.apache.spark.Accumulator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2; import java.util.Iterator;
import java.util.List; public class totalization_device {
public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setMaster("local[2]")
.setAppName("totalization_device");
JavaSparkContext sc = new JavaSparkContext(conf);
/*
* 定义一个累加器
* */
Accumulator<Integer> accumulator = sc.accumulator();
JavaRDD<String> fileRDD = sc.textFile("E:/2018_cnic/learn/wordcount.txt");
JavaRDD<String> fileRDD1 = fileRDD.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterator<String> call(String s) throws Exception {
accumulator.add();
return new ArrayListIterator(s.split(" "));
}
});
JavaPairRDD<String, Integer> pairRDD = fileRDD1.mapToPair(new PairFunction<String, String, Integer>() { @Override
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<String, Integer>(s,);
}
});
JavaPairRDD<String, Integer> reducebykeyRDD = pairRDD.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) throws Exception {
return integer + integer2;
}
});
List<Tuple2<String, Integer>> collect = reducebykeyRDD.collect();
for(Tuple2 tup:collect){
System.out.println(tup);
}
Integer num = accumulator.value();
System.out.println("一共有:"+num+"行");
sc.close();
}
}

结果输出:

// :: INFO TaskSetManager: Finished task 1.0 in stage 1.0 (TID ) in  ms on localhost (executor driver) (/)
// :: INFO TaskSetManager: Finished task 0.0 in stage 1.0 (TID ) in ms on localhost (executor driver) (/)
// :: INFO TaskSchedulerImpl: Removed TaskSet 1.0, whose tasks have all completed, from pool
// :: INFO DAGScheduler: ResultStage (collect at totalization_device.java:) finished in 0.051 s
// :: INFO DAGScheduler: Job finished: collect at totalization_device.java:, took 0.273877 s
(,)
(authentication,)
(Registered,)
(is,)
(Found,)
(master.Master:,)
(spark.SecurityManager:,)
(util.log:,)
(,)
(modify,)
(classes,)
(,)
([jar:file:/opt/workspace/hive-3.1./lib/log4j-slf4j-impl-2.10..jar!/org/slf4j/impl/StaticLoggerBinder.class],)
(.,)
(type,)
(with,)
(INFO,)
(permissions:,)
(groups,)
(using,)
(//,)
(Class,)
(@1326ms,)
(WARN,)
(root,)
(signal,)
('MasterUI',)
(,)
(,)
(Set(root);,)
(version,)
(,)
(ui,)
(,)
(load,)
(Set();,)
(,)
(,)
(::,)
(Actual,)
(initialized,)
(server.Server:,)
(master,)
(,)
(multiple,)
(56130C,)
(handler,)
(,)
(,)
(TERM,)
(,)
(daemon,)
(bindings.,)
(builtin-java,)
(server.AbstractConnector:,)
(users,)
([jar:file:/opt/workspace/hbase-1.4./lib/slf4j-log4j12-1.7..jar!/org/slf4j/impl/StaticLoggerBinder.class],)
(http://www.slf4j.org/codes.html#multiple_bindings,1)
(105L,,)
(Starting,)
(jetty-9.3.z-SNAPSHOT,)
(Spark,)
(,)
(SLF4J,)
(platform...,)
(,)
(util.NativeCodeLoader:,)
(Successfully,)
(on,)
('sparkMaster',)
(library,)
(service,)
(,)
(at,)
(in,)
(,)
(@master1,)
(See,)
(.,)
(Logging,)
(missions:,)
(util.Utils:,)
(spark://master1:7077,1)
(for,)
(Changing,)
(,)
(native-hadoop,)
(port,)
(Running,)
(explanation.,)
(your,)
(view,)
(acls,)
(,)
(Unable,)
(binding,)
(to:,)
(disabled;,)
(contains,)
(util.SignalUtils:,)
(process,)
(,)
(SLF4J:,)
(ServerConnector@1cbf22af{HTTP/1.1,[http/1.1]}{0.0.0.0:},)
(,)
(,)
(,)
(SecurityManager:,)
(Started,)
(INT,)
(Set(),)
("spark-root-org.apache.spark.deploy.master.Master-1-master1.out",)
(to,)
(applicable,)
(HUP,)
(started,)
(of,)
(path,)
(where,)
(,)
(an,)
([jar:file:/opt/workspace/hadoop-2.9./share/hadoop/common/lib/slf4j-log4j12-1.7..jar!/org/slf4j/impl/StaticLoggerBinder.class],)
([org.slf4j.impl.Log4jLoggerFactory],)
(2.3.,)
(::,)
(@1280ms,)
(name:,)
(per,)
一共有:25行
// :: INFO SparkUI: Stopped Spark web UI at http://hadoop:4040
// :: INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
// :: INFO MemoryStore: MemoryStore cleared
// :: INFO BlockManager: BlockManager stopped
// :: INFO BlockManagerMaster: BlockManagerMaster stopped
// :: INFO

Spark累加器的更多相关文章

  1. Spark 累加器

    由于spark是分布式的计算,所以使得每个task间不存在共享的变量,而为了实现共享变量spark实现了两种类型 - 累加器与广播变量, 对于其概念与理解可以参考:共享变量(广播变量和累加器).可能需 ...

  2. spark累加器、广播变量

    一言以蔽之: 累加器就是只写变量 通常就是做事件统计用的 因为rdd是在不同的excutor去执行的 你在不同excutor中累加的结果 没办法汇总到一起 这个时候就需要累加器来帮忙完成 广播变量是只 ...

  3. Spark累加器(Accumulator)陷阱及解决办法

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

  4. Spark累加器(Accumulator)

    一.累加器简介 在Spark中如果想在Task计算的时候统计某些事件的数量,使用filter/reduce也可以,但是使用累加器是一种更方便的方式,累加器一个比较经典的应用场景是用来在Spark St ...

  5. 入门大数据---Spark累加器与广播变量

    一.简介 在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景: ...

  6. Spark(八)【广播变量和累加器】

    目录 一. 广播变量 使用 二. 累加器 使用 使用场景 自定义累加器 在spark程序中,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的 ...

  7. Spark处理日志文件常见操作

    spark有自己的集群计算技术,扩展了hadoop mr模型用于高效计算,包括交互式查询和 流计算.主要的特性就是内存的集群计算提升计算速度.在实际运用过程中也当然少不了对一些数据集的操作.下面将通过 ...

  8. spark面试总结3

    Spark core面试篇03 1.Spark使用parquet文件存储格式能带来哪些好处? 1) 如果说HDFS 是大数据时代分布式文件系统首选标准,那么parquet则是整个大数据时代文件存储格式 ...

  9. Spark面试相关

    Spark Core面试篇01 随着Spark技术在企业中应用越来越广泛,Spark成为大数据开发必须掌握的技能.前期分享了很多关于Spark的学习视频和文章,为了进一步巩固和掌握Spark,在原有s ...

随机推荐

  1. 【转载】Reactor模式,或者叫反应器模式

    Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ...

  2. Web图片编辑控件开发文档-Xproer.ImageEditor

    版权所有 2009-2014 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com 产品首页:http://www.ncmem.com/webplug/image-e ...

  3. linux每天一小步---cp命令详解

    1 命令功能      cp命令用于复制文件或者目录,cp是copy的缩写. 2 命令语法 cp  [参数] 源文件或者目录  目的文件或者目录 3 命令参数 -a  等同于-dRp,保存所有 -d ...

  4. Shell编程-02-Shell变量

    目录 什么是Shell变量 变量类型 环境变量初始化及其对应文件的生效顺序 什么是Shell变量     在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右两边的x和y称 ...

  5. Linux 基础教程 39-作业控制

        在Linux系统中,作业是由一个或多个关联进程组成的.用户可以运行多个作业并可以在作业间切换.而作业控制则是对作业的行为进行控制,允许用户对作业的前后台的进行切换和终止操作等.作业相关的控制命 ...

  6. solrconfig.xml配置详解

    solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置. 可以在tomcat的安装路径下找到这个文件C:\Program File ...

  7. 如何创建一个自己的.NET Core Global Tools

    索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:https://www.bitadmincore.com 框架源码:https://github.com/chenyi ...

  8. NET Core 拓展方法和中间件集合(支持NET Core2.0+)

    # Pure.NETCoreExtentensions https://github.com/purestackorg/Pure.NETCoreExtensions NET Core 拓展方法和中间件 ...

  9. sql游标循环结果集

    我们知道游标是一种对结果集操作的神器,使用游标,可以很方便的循环结果集,并对结果集进行数据处理. 1.建表 CREATE TABLE [dbo].[Student]( ,) NOT NULL, ) N ...

  10. 如何关闭SQL进程

    --通过下面的查询得到trace ID select * from sys.traces --修改下面的@traceid参数,关闭,删除对应的trace exec sp_trace_setstatus ...