1.这是hadoop基础系列教程,适合入门者学习。

2.MapReduce是一种分布式计算模型,解决海量数据问题,由两个阶段组成,map()和reduce()。本文不讲解原理,下面实际操作利用MapReduce实现一个统计单词。

首先准备一个单词源文件,我们要统计每个单词出现的次数
新建word.txt文件,内容如下:

hadluo jeadong flash
flash
jea hadluo hadluo
read flash

MapReduce计算后的结果文件应该是:

单词  次数
hadluo 3
jeadong 1
flash 3
jea 1
read 1

将word.txt 上传到hdfs文件系统的根目录下

hadoop fs -put words.txt路径 hdfs://

新建测试java工程
maven配置

        <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-core --><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-core</artifactId><version>0.20.2</version></dependency><dependency><groupId>jdk.tools</groupId><artifactId>jdk.tools</artifactId><version>1.7</version><scope>system</scope><systemPath>${JAVA_HOME}/lib/tools.jar</systemPath></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins></build>

新建java类hadoop.WordCount.java

package hadoop;import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {System.err.println("输入:" + args[0] + "  输出:" + args[1]);Job job = new Job(new Configuration());//设置main函数的类job.setJarByClass(WordCount.class);//设置map的classjob.setMapperClass(WCMapper.class);// map 的输出key类型job.setMapOutputKeyClass(Text.class);// map 的 输出 value类型job.setMapOutputValueClass(LongWritable.class);// 设置  单词文件的路径FileInputFormat.setInputPaths(job, new Path(args[0]));//设置 reduce 的 classjob.setReducerClass(MCReducer.class);//设置reduce的 输出keyjob.setOutputKeyClass(Text.class);//设置reduce的 输入 valuejob.setOutputValueClass(LongWritable.class);//设置输出文件的 路径FileOutputFormat.setOutputPath(job, new Path(args[1]));//提交任务job.waitForCompletion(true); // true 打印进度详情System.err.println("启动MapReduce,  输入文件:" + args[0] + "  输出:" + args[1]);}
}/**** Map过程,* 输入key:字符偏移量    LongWritable类型* 输入value: 文件一行的内容   Text类型* 输出key: 一个单词    Text类型* 输出value: 整形值 1   LongWritable类型* * LongWritable 对应long ,在hadoop中序列化了* Text 对应String ,在hadoop中序列化了* @author HadLuo* @since JDK1.7* @history 2017年12月27日 新建*/
class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable> {@Overrideprotected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws IOException,InterruptedException {// 得到输入文件的一行数据String line = value.toString();//以空格分隔 ,这样得到了每个单词String[] words = line.split(" ");for (String word : words) {// 输出到reduce 阶段进行计算统计context.write(new Text(word), new LongWritable(1));}}
}
/**** Reduce过程,* 输入key:一个单词    Text类型* 输入value: 整形值 1    LongWritable类型* 输出key: 一个单词    Text类型* 输出value: 整形值(总单词个数)   LongWritable类型* * @author HadLuo* @since JDK1.7* @history 2017年12月27日 新建*/
class MCReducer extends Reducer<Text, LongWritable, Text, LongWritable>{/***key : map阶段 分组后的 单词,*values : 迭代器,map输出的 所有值**/@Overrideprotected void reduce(Text key, Iterable<LongWritable> values,Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException,InterruptedException {long wordSum = 0;for(LongWritable l : values){wordSum += l.get();}context.write(key, new LongWritable(wordSum));}
}

代码分析:

源文件word.txt

hadluo jeadong flash
flash
jea hadluo hadluo
read flash

先经过map()函数

map()的输入如下:

(0,hadluo jeadong flash)
(20,flash)
(26,jea hadluo hadluo)
(44,read flash)

输入key是字符偏移量(包括换行符),map函数并不需要此信息,将其忽略, map函数的功能只以空格提取每个单词,并输出如下:

(hadluo,1)
(jeadong,1)
(flash,1)
(flash,1)
(jea,1)
(hadluo,1)
(hadluo,1)
(read,1)
(flash,1)

然后经过MapReduce框架处理后,将以上map的输出进行排序和重组,得到如下:

( hadluo,[1,1,1] )
( jeadong,[1] )
( flash,[1,1,1] )
( jea,[1] )
( read,[1] )

以上就是reduce函数的输入,然后经过reduce函数,我们的reduce函数逻辑如下:

    // values: 就是上面我们的 [1,1,1...]//key: 就是我们上面的单词protected void reduce(Text key, Iterable<LongWritable> values,Reducer<Text, LongWritable, Text, LongWritable>.Context context) throws IOException,InterruptedException {// 求和long wordSum = 0;for(LongWritable l : values){wordSum += l.get();}context.write(key, new LongWritable(wordSum));}

最后一步就是提交作业,也就是我们main函数的内容,已经有注释了不再多解释。

代码写好之后,在包上右键export,导出jarFile,得到wc.jar,并提交到Linux文件系统 /home/wc.jar
运行hadoop命令

>> hadoop jar /home/wc.jar hadoop.WordCount /words.txt /words_outhadoop.WordCount : 为jar文件main类的全路径
/words.txt :  为hdfs的源单词文件
/words_out : 经过MapReduce后的结果输出文件(在hdfs上)

将结果文件words_out 下载到linux文件系统上

hadoop fs -get /words_out ./words_out

我们看到words_out有两个文件,

-rw-r--r--. 1 root root 43 12月 28 14:51 part-r-00000
-rw-r--r--. 1 root root  0 12月 28 14:51 _SUCCESS

vim part-r-00000就是我们统计单词的结果

flash   3
hadluo  3
jea     1
jeadong 1
read    1

今天的单词统计过程和代码分析就到这里,谢谢大家!

老生常谈:深圳有爱好音乐的会打鼓(吉他,键盘,贝斯等)的程序员和其它职业可以一起交流加入我们乐队一起嗨。我的QQ:657455400 表演视频实例:https://v.qq.com/x/page/f0517awx0x4.html

hadoop基础教程(二) MapReduce 单词统计相关推荐

  1. 【Hadoop基础教程】7、Hadoop之一对一关联查询

    我们都知道一个产品唯一对应一个单价,本案例将通过两种类型输入文件:product类(产品)和price类(价格)进行一对一的关联查询,得到产品名(例如:手表)与产品价格(例如:$100)的关联信息. ...

  2. 《Hadoop基础教程》之初识Hadoop

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  3. hadoop基础教程

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  4. Hadoop基础教程》之初识Hadoop【转】

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  5. 《Hadoop基础教程》读后感

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  6. 运行Hadoop自带的wordcount单词统计程序

    1.使用示例程序实现单词统计 (1)wordcount程序 wordcount程序在hadoop的share目录下,如下: 1 2 3 4 5 6 7 8 9 [root@leaf mapreduce ...

  7. Hadoop学习教程(MapReduce)(四)

    MapReduce 1.MapReduce概述 1.1.MapReduce定义 1.2.MapReduce优缺点 1.2.1.MapReduce优点 1.2.2.MapReduce缺点 1.3.Map ...

  8. 关于MapReduce单词统计的例子:

    要统计的文件的文件名为hello hello中的内容如下 hello you hello me 通过MapReduce程序统计出文件中的各个单词出现了几次.(两个单词之间通过tab键进行的分割) 1 ...

  9. mapreduce单词统计

    该程序的功能: (1)读取文件 (2)统计每个单词出现的数量 1.创建words.txt文件并上传到HDFS 创建words.txt文件,添加内容 vim words.txt #添加单词(任意单词) ...

最新文章

  1. 99_leetcode_Best Time to Buy and sell Stock
  2. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结
  3. 颠覆传统的电商智能助理-阿里小蜜技术揭秘
  4. 带你深入探究云原生时代的分布式操作系统 Kubernetes
  5. 求递归算法时间复杂度:递归树
  6. Benefits of SIMD Programming | SIMD的优势
  7. 转:Nginx 性能优化有这篇就够了!
  8. Python 保留字和关键字的用法
  9. PHP自学笔记 ---李炎恢老师PHP第一季 TestGuest0.4
  10. erp系统的优点和不足?云系统给企业带来的好处?
  11. 一个主机多显示器的操作方法
  12. Js实现在线Hex转Base64,在线Base64转Hex
  13. Windows操作系统各版本的历史 Windows系统历史版本简介
  14. 机电信息杂志机电信息杂志社机电信息编辑部2022年第13期目录
  15. 2020届c++工程师求职准备——计划篇(2019.03.05.)
  16. 计算机类sci四大水刊,生信类文章可以投四大水刊吗
  17. 检查cad检查线压盖lisp_在CAD中对多段线进行拓扑检查
  18. 分享30个高品质的抽象网页背景素材
  19. 众包数据标注中的隐类别分析
  20. 如何在 R 中进行 Bartlett 的球形检验

热门文章

  1. SAP-QM QA32/QA33权限控制IQC/OQC
  2. 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器
  3. eclipse war tomcat_Web基础配置篇(三): tomcat的配置及使用
  4. Keil调试笔记:数组越界
  5. c语言乘法顺序,c语言运算符分类及运算顺序和级别总结
  6. crm2011 分配角色和删除角色
  7. U盘文件删除如何恢复?试试这2招,实测有效
  8. Google开发者交流群
  9. 晶振为什么要加电容 需要配多大电容
  10. 企业级数据仓库建设最新版(附16页文档)