/**
* @Author: dreamer Q
* @Date: 2019/11/4 22:26
* @Version 1.0
* @Discription 使用MapReduce 开发 WordCount应用程序
*/
public class WordCount2App{ /**
* Map: 读取输入的文件
* Mapper里面四个泛型的含义
* 输入的数据类型:
* LongWritable:表示偏移量,由于Long要在服务器之间传输,LongWritable是hadoop封装的可序列的类型
* Text:文本类型
* 输出的数据类型:
* Text:文本类型
* LongWritable:表示统计的数量,同Long一样,要在服务器之间传输,IntWritable是hadoop封装的可序列化的类型
*/
public static class WCMapper extends Mapper<LongWritable,Text,Text,LongWritable>{ //mapreduce框架每读一行数据就调用一次该方法
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//具体的业务逻辑就卸载这个方法中,而且我们业务要处理的数据已经被框架传递进来,在方法的参数中key-value
//key 是这一行数据的起始偏移量,value 是这一行的文本内容 //将这一行的内容换成String类型
String line = value.toString(); //对这一行的文本按特定分隔符切分
String[] words = StringUtils.split(line, " "); //遍历这个单词数据输出为key-value的形式 k:单词 v :1
for (String word : words) {
context.write(new Text(word), new LongWritable(1));
} }
} /**
* Reduce:归并操作
*/
public static class WCReducer extends Reducer<Text,LongWritable,Text,LongWritable>{ //框架在map处理完成之后,将所有kv对缓存起来,进行分组,然后传递一个组<key,values{}> 调用一次reduce方法
//<hello,{1,1,1,1,1,....}>
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
long count=0; for (LongWritable value : values) {
count +=value.get();
} //输出这一个单词的统计结果
context.write(key, new LongWritable(count));
}
} /**
* 用来描述一个特定的作业
* 比如:改作业使用那个类作为逻辑处理中的map,哪个作为reduce
* 还可以指定该作业要处理的数据所在的路径
* 还可以指定该作业输出的结果的结果放到哪个路径
* @param args
*/
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { // Job job = new Job(); 已过时
Configuration conf =new Configuration(); Job job = Job.getInstance(conf); //设置整个job所有的那些类所用的jar包的位置-因为是分布式
job.setJarByClass(WordCount2App.class); //本job使用的mapper和reducer的类
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReducer.class); //指定reduce 的输出 key 和 value 类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); //指定mapper的输出数据 key 和 value 类型 //指定要输入的数据存放的路径--输入的数据路径
FileInputFormat.setInputPaths(job, new Path("/wc/srcdata")); //指定处理结果的输出数据存放路径--输出的数据路径
FileOutputFormat.setOutputPath(job, new Path("/wc/output")); //将job提交给集群运行
job.waitForCompletion(true); } }

MapReduce-WordCountDemo的更多相关文章

  1. MapReduce 单词统计案例编程

    MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1.   解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...

  2. 2_分布式计算框架MapReduce

    一.mr介绍 1.MapReduce设计理念是移动计算而不是移动数据,就是把分析计算的程序,分别拷贝一份到不同的机器上,而不是移动数据. 2.计算框架有很多,不是谁替换谁的问题,是谁更适合的问题.mr ...

  3. Mapreduce的文件和hbase共同输入

    Mapreduce的文件和hbase共同输入 package duogemap;   import java.io.IOException;   import org.apache.hadoop.co ...

  4. mapreduce多文件输出的两方法

    mapreduce多文件输出的两方法   package duogemap;   import java.io.IOException;   import org.apache.hadoop.conf ...

  5. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  6. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  7. [Hadoop in Action] 第5章 高阶MapReduce

    链接多个MapReduce作业 执行多个数据集的联结 生成Bloom filter   1.链接MapReduce作业   [顺序链接MapReduce作业]   mapreduce-1 | mapr ...

  8. MapReduce

    2016-12-21  16:53:49 mapred-default.xml mapreduce.input.fileinputformat.split.minsize 0 The minimum ...

  9. 使用mapreduce计算环比的实例

    最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个 ...

  10. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

随机推荐

  1. Java 多态概念、使用

    1.概念 2.多态的格式与使用 package Java12; /* 代码当中体现多态性,其实就是一句话: 父类引用指向子类对象 格式: 父类名称 对象名 = new 子类名称(): 或者: 接口名称 ...

  2. 2018-10-16-weekly

    Algorithm 判断子序列 What 给定字符串 s 和 t ,判断 s 是否为 t 的子序列.如,"ace"是"abcde"的一个子序列,而"a ...

  3. bzoj3991 [SDOI2015]寻宝游戏 树链的并

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3991 题解 貌似这个东西叫做树链的并,以前貌似写过一个类似的用来动态维护虚树. 大概就是最终的 ...

  4. thinkphp 模板

    一. 模板函数  教程https://www.kancloud.cn/manual/thinkphp5/125005 我们往往需要对模板输出变量使用函数,可以使用: {$data.name|md5} ...

  5. AJAX——理解XMLHttpRequest对象

    AJAX大家已经都知道了,XMLHttpRequest对象则是AJAX的核心.这篇博客重点总结一下这个对象的使用. XMLHttpRequest对象的属性和方法: 属性 说明 readyState 表 ...

  6. Dubbo学习-3-管理控制台搭建

    dubbo 2.6.x 的dubbo-admin管理控制台搭建 1.下载源码:https://github.com/apache/incubator-dubbo-ops 打开后切换到master分支 ...

  7. asp.net大文件断点续传

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  8. POJ 2391--Ombrophobic Bovines(最大流(拆点)+二分+最短路)

    Ombrophobic Bovines Description FJ's cows really hate getting wet so much that the mere thought of g ...

  9. scau 1142 巡逻的士兵(分治)

    1142 巡逻的士兵 时间限制:1000MS  内存限制:65536K 提交次数:217 通过次数:58 题型: 编程题   语言: G++;GCC Description 有N个士兵站成一队列, 现 ...

  10. jdbc odbc JDBC-ODBC

    https://zh.wikipedia.org/zh-cn/ODBC ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来 ...