/**
* @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. Wireshark中的结果分析

    Header checksum: 0x9899 [validation disabled] 因为,wireshark不自动做tcp校验和的检验.原因是因为:有时tcp校验和会由网卡计算,因此wires ...

  2. ivew 限制输入 0 到 1 的数字 包括小数, 0 ,1

    input <FormItem label="> <Input v-model="formItem.shapeDifferen.breastScaleOutSpa ...

  3. springboot2.0整合redis的发布和订阅

    1.Maven引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  4. Redis-缓存击穿/穿透/雪崩

    缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题. 缓 ...

  5. hdu 2815 : Mod Tree 【扩展BSGS】

    题目链接 直接用模板好了.实在不行,反正有队友啊~~~~ #include<bits/stdc++.h> using namespace std; typedef long long LL ...

  6. Eclipse 创建springBoot项目的时候需要首先 安装STS(亲测)

    开始我的Eclipse版本是4.4.2.安装网上的步骤多次不成功. 后来直接去下载了最新版的Eclipse 2018-9版本的 是 4.9. 下面是安装步骤: (1)eclipse->Help- ...

  7. 重新定义数据库的时刻,阿里云数据库专家带你了解POLARDB

    摘要:POLARDB是阿里云ApsaraDB数据库团队研发的基于云计算架构的下一代关系型数据库,其最大的特色是计算节点与存储节点分离,借助优秀的RDMA网络以及最新的块存储技术.POLARDB不但满足 ...

  8. 论云时代最经济的APM工具的姿势

    阿里云于大概两月前商业化了一款APM产品 ARMS ,正式填补了 APM 上的云上监控的空白.那么作为阿里云官方 APM 工具,ARMS 和其他传统厂商的 APM 服务相比有什么特点呢? 通过和国内其 ...

  9. iOS多媒体总结&进入后台播放音乐

    1. 播放mp3需要导入框架,AVFoundation支持音频文件(.caf..aif..wav..wmv和.mp3)的播放. #import <AVFoundation/AVFoundatio ...

  10. [CF846B]Math Show题解

    暴力一下就好啦! 枚举一下一共做多少次任务,剩下的时间将子任务排序,从头开始能取多少取多少就行了. 贴个代码 #include <cstdio> #include <algorith ...