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. ibatis 常用标签

    prepend:自动在前面加上:自动新手:自动预:自动前置 property:属性 compareValue:指定的常数,值 //判断不相等: <isNotEqual prepend=" ...

  2. [Selenium]点击下拉框之后,从下拉列表选择元素进行点击很容易失败

    点击下拉框之后,下拉列表会显示出来,但是有时候下拉列表会很快就消失掉,导致后面选择元素的时候会失败. 像这种情况,需要将鼠标移动到下拉列表上,使下拉列表维持显示,然后才选择元素进行点击. 将鼠标移动到 ...

  3. Android应用开发环境的搭建和使用

    主要包括Android SDK.Android开发工具:也包括如何使用Android提供的ADB.DDMS.AAPT.DX等工具,掌握这些工具是开发Android应用的基础技能. 1.Android的 ...

  4. git 回退到某个特定提交

    1.先用git log commit aba290c570d3894f4f39a1fdf52aa512c0231525 Author: huzhengbo <@qq.com> Date: ...

  5. 前端福利之盘飞那个 "阿里矢量图" (转)

    一.准备工作 1.首先,进入阿里的矢量图标库,在这个图标库里面可以找到很多图片资源,当然了需要登录才能下载或者使用,用GitHub账号或者新浪微博账号登录都可以 2.登录以后,可以搜索自己需要的资源, ...

  6. [label][转载][web-design-psychology]网页设计心理

    原文出处: http://mux.alimama.com/posts/1301 Tip1:信息不要同时全部展示,阶段性地向用户展示当前场景里必要的信息 设计师经常犯的错误:同时将大量信息展示给用户.不 ...

  7. CAS实战のclient自定义过滤器

    我们在配置cas client肯定写过如下代码: <filter> <filter-name>CASFilter</filter-name> <filter- ...

  8. Android-自定义开关

    效果图: 需要两张图片,一张图片为背景,一张图片为滑动的点 布局去指定一个自定义View对象: view.custom.shangguigucustomview.MyCustomSwitch < ...

  9. linux apache安装https证书

    1.首先查看是否安装apache 命令:rpm -qa|grep httpd 如果存在,卸载命令:rpm -e XXXX 如果不存在,安装命令:yum install httpd 安装完apache之 ...

  10. MVP社区巡讲 12月5日北京站| 12月12日上海站

    2015年底的社区巡讲Powered MVP Roadshow正式启动啦!12月5日周六下午北京场,12月12日周六下午上海场. 欢迎各位邀请您的同事朋友来参加MVP的社区活动,也邀请您发送活动信息( ...