Hadoop示例程序WordCount详解及实例
部分参考:http://www.javaeye.com/topic/606962
1.图解MapReduce
MapReduce整体流程图
并行读取文本中的内容,然后进行MapReduce操作
Map过程:并行读取三行,对读取的单词进行map操作,每个词都以<key,value>形式生成
reduce操作是对map的结果进行排序,合并,最后得出词频。
2.简单过程:
Input:
Hello World Bye World
Hello Hadoop Bye Hadoop
Bye Hadoop Hello Hadoop
Map:
<Hello,1>
<World,1>
<Bye,1>
<World,1>
<Hello,1>
<Hadoop,1>
<Bye,1>
<Hadoop,1>
<Bye,1>
<Hadoop,1>
<Hello,1>
<Hadoop,1>
Sort:
<Bye,1>
<Bye,1>
<Bye,1>
<Hadoop,1>
<Hadoop,1>
<Hadoop,1>
<Hadoop,1>
<Hello,1>
<Hello,1>
<Hello,1>
<World,1>
<World,1>
Combine:
<Bye,1,1,1>
<Hadoop,1,1,1,1>
<Hello,1,1,1>
<World,1,1>
Reduce:
<Bye,3>
<Hadoop,4>
<Hello,3>
<World,2>
MergeSort的过程(ps:2012-10-18)
Map:
<Hello,1><World,1><Bye,1><World,1><Hello,1><Hadoop,1><Bye,1><Hadoop,1><Bye,1><Hadoop,1><Hello,1><Hadoop,1>
MergeSort:
- <Hello,1><World,1><Bye,1><World,1><Hello,1><Hadoop,1> | <Bye,1><Hadoop,1><Bye,1><Hadoop,1><Hello,1><Hadoop,1>
- <Hello,1><World,1><Bye,1> || <World,1><Hello,1><Hadoop,1> | <Bye,1><Hadoop,1><Bye,1> || <Hadoop,1><Hello,1><Hadoop,1>
- <Hello,1><World,1> ||| <Bye,1> || <World,1><Hello,1> ||| <Hadoop,1> | <Bye,1><Hadoop,1> ||| <Bye,1> || <Hadoop,1><Hello,1> ||| <Hadoop,1>
- MergeArray结果:<Hello,1><World,1> ||| <Bye,1> || <Hello,1><World,1> ||| <Hadoop,1> | <Bye,1><Hadoop,1> ||| <Bye,1> || <Hadoop,1><Hello,1> ||| <Hadoop,1> 在|||这一层级
- MergeArray结果:<Bye,1><Hello,1><World,1> || <Hadoop,1><Hello,1><World,1> | <Bye,1><Bye,1><Hadoop,1> || <Hadoop,1><Hadoop,1><Hello,1> 在||这一层级
- MergeArray结果:<Bye,1><Hadoop,1><Hello,1><World,1><Hello,1><World,1> | <Bye,1><Bye,1><Hadoop,1><Hadoop,1><Hello,1><Hadoop,1> 在|这一层级
- MergeArray结果:<Bye,1><Bye,1><Bye,1><Hadoop,1><Hadoop,1><Hadoop,1><Hadoop,1><Hello,1><Hello,1><Hello,1><World,1><World,1> 排序完成
3.代码实例:
package com.felix; import java.io.IOException; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; /*** * 描述:WordCount explains by Felix* @author Hadoop Dev Group*/ public class WordCount {/*** MapReduceBase类:实现了Mapper和Reducer接口的基类(其中的方法只是实现接口,而未作任何事情)* Mapper接口:* WritableComparable接口:实现WritableComparable的类可以相互比较。所有被用作key的类应该实现此接口。* Reporter 则可用于报告整个应用的运行进度,本例中未使用。 * */public static class Map extends MapReduceBase implementsMapper<LongWritable, Text, Text, IntWritable>{/*** LongWritable, IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,* 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为long,int,String 的替代品。*/private final static IntWritable one = new IntWritable(1);private Text word = new Text();/*** Mapper接口中的map方法:* void map(K1 key, V1 value, OutputCollector<K2,V2> output, Reporter reporter)* 映射一个单个的输入k/v对到一个中间的k/v对* 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。* OutputCollector接口:收集Mapper和Reducer输出的<k,v>对。* OutputCollector接口的collect(k, v)方法:增加一个(k,v)对到output*/public void map(LongWritable key, Text value,OutputCollector<Text, IntWritable> output, Reporter reporter)throws IOException{String line = value.toString();StringTokenizer tokenizer = new StringTokenizer(line);while (tokenizer.hasMoreTokens()){word.set(tokenizer.nextToken());output.collect(word, one);}}}public static class Reduce extends MapReduceBase implementsReducer<Text, IntWritable, Text, IntWritable>{public void reduce(Text key, Iterator<IntWritable> values,OutputCollector<Text, IntWritable> output, Reporter reporter)throws IOException{int sum = 0;while (values.hasNext()){sum += values.next().get();}output.collect(key, new IntWritable(sum));}}public static void main(String[] args) throws Exception{/*** JobConf:map/reduce的job配置类,向hadoop框架描述map-reduce执行的工作* 构造方法:JobConf()、JobConf(Class exampleClass)、JobConf(Configuration conf)等*/JobConf conf = new JobConf(WordCount.class);conf.setJobName("wordcount"); //设置一个用户定义的job名称conf.setOutputKeyClass(Text.class); //为job的输出数据设置Key类conf.setOutputValueClass(IntWritable.class); //为job输出设置value类conf.setMapperClass(Map.class); //为job设置Mapper类conf.setCombinerClass(Reduce.class); //为job设置Combiner类conf.setReducerClass(Reduce.class); //为job设置Reduce类conf.setInputFormat(TextInputFormat.class); //为map-reduce任务设置InputFormat实现类conf.setOutputFormat(TextOutputFormat.class); //为map-reduce任务设置OutputFormat实现类/*** InputFormat描述map-reduce中对job的输入定义* setInputPaths():为map-reduce job设置路径数组作为输入列表* setInputPath():为map-reduce job设置路径数组作为输出列表*/FileInputFormat.setInputPaths(conf, new Path(args[0]));FileOutputFormat.setOutputPath(conf, new Path(args[1]));JobClient.runJob(conf); //运行一个job } }
Hadoop示例程序WordCount详解及实例相关推荐
- STM32应用IAP进行程序更新详解及实例
这是以前就想写的一个小专题关于IAP,以及IAP在STM32编程的应用,专题分三小节,主要介绍常见的单片机烧录方式,IAP的实际应用,以及Ymodem协议在IAP编程中应用,在笔记吃灰很久了,终于 ...
- java公钥加密私钥解密_公钥加密,私钥解密示例程序(JAVA)详解
公钥与私钥机制属于非对称加密的范畴,非对称是相对于对称加密而言的,对称加密用于加密与解密的密钥是同一把,而非对称加密则用于加密与解密的密钥不相同,一个公开,称为公钥:一个保密,称为私钥,公钥与私钥必须 ...
- python随机数程序源码_Python 实现随机数详解及实例代码
Python3实现随机数 random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Pyth ...
- java拉姆达表达式事例,Java Lambda表达式详解和实例
简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...
- hadoop之hdfs命令详解
目录 一.hadoop命令 1.archive 2.checknative 3.classpath 4.credential 5.distcp(比较常用) 6.fs 7.jar 8.key 9.tra ...
- Flutter中Scaffold布局的使用详解及实例代码
Flutter中Scaffold布局的使用详解及实例代码 Scaffold实现了基本的Material布局.只要是在Material中定义了的单个界面显示的布局控件元素,都可以使用Scaffold来绘 ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- java super实例_java Super 用法详解及实例代码
java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...
- java技术详解_Java反射技术详解及实例解析
前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...
最新文章
- Ubuntu 防火墙常用配置操作(ufw)【适用于 Debian 及其衍生版---Linux Mint、Deepin 等】
- xbox可以录视频声音吗_什么是Xbox Live Gold,它值得吗?
- 在浏览器地址栏按回车、F5、Ctrl+F5刷新网页的区别
- cout输出精确小数点
- java双向链表结构_【Java数据结构】2.3双向链表的迭代实现
- LR报错 No buffer space available Try changing the registry value 端口号不够用了
- Linux安装Jenkins教程
- 基于JavaWeb的汽车销售管理系统
- Matlab plot画图线型、符号及颜色
- [论文总结] 深度学习在农业领域应用论文笔记8
- VTN联合GWI共同启动“全球健康登月计划”让更多人享受到健康新生活
- 自定义 iPhone 铃声
- 发明专利名称的撰写原则和技巧总结
- 王小云院士真地破解了 MD5 吗
- 惠普打印机卡纸问题,解决.
- 解决org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ 1. No runnable methods
- 原理+实战|7天带你学会GAN,生活从此乐无限
- 嵌入式系统学习---------2.嵌入式系统设计过程
- 语文天地杂志语文天地杂志社语文天地编辑部2022年第6期目录
- sqli-labs靶场(1-22关)