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. windows下使用redis

    一.下载windows版本的Redis 官网只提供linux版本的下载 官网下载地址:http://redis.io/download Redis 没有官方的Windows版本,但是微软开源技术团队( ...

  2. vue 使用axios 数据请求第三方插件的使用

    axios 基于http客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...

  3. 使用Git 管理heroku的项目(windows)

    此过程与管理github中的项目类似,即是普通的git配置 安装 Heroku Toolbelt, 里面包含了 msygit Foreman,以及heroku的命令行界面 1.首先在heroku上新建 ...

  4. 浏览器缓存和Service Worker

    浏览器缓存和Service Worker @billshooting 2018-05-06 字数 6175 Follow me on Github 标签: BOM 1. 传统的HTTP浏览器缓存策略 ...

  5. django设置cookie和session

    1 设置cookie 本例中应用名称为cookie 模型model from django.db import models from django.db import models class Us ...

  6. testNG的高级用法 --DataProvider

    @DataProvider Method参数 数据提供者的第一个参数是java.lang.reflect.Method,TestNG传递这个将调用的测试方法.如果您希望数据提供者根据不同的测试方法返回 ...

  7. [C#学习笔记]分部类和分部方法

    知识在于积累. 前言 好久没写博客了,因为在看<CLR via C#>的时候,竟然卡在了分部方法这一小节几天没下去.今天重新认真阅读,有些感悟,所以在此记录. 然后. 每天早晨第一句,&l ...

  8. 简易网页 html

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 重装SQL前,一定要把SQL2005、SQL2008之类的彻底删除干净

    0.预备 如果你曾删除过VS2010或者VS2008之类的,同理也要照此方法删除 1.步骤,顺序无妨 卸载程序:控制面板---查找SQL..NET   删除干净 停掉SQL的所有服务:  计算机--管 ...

  10. MyBatis高级及其SSM框架搭建

    代码生成器 首先meaven项目中导入支持包 <dependencies> <!-- https://mvnrepository.com/artifact/mysql/mysql-c ...