单词统计的是统计一个文件中单词出现的次数,比如下面的数据源
![b564b79adfd217bd1d71d48ca5769c1a.png](https://i-blog.csdnimg.cn/blog_migrate/854b3dd204a5679f6c47ee2147172be1.jpeg)
其中,最终出现的次数结果应该是下面的显示
![6f012ae7014a053324301c6300e130a9.png](https://i-blog.csdnimg.cn/blog_migrate/a22178a23214ebe4ddb68e999cb8669b.jpeg)
那么在MapReduce中该如何编写代码并出现最终结果?
首先我们把文件上传到HDFS中(hdfs dfs –put …)
数据名称:data.txt,大小是size是2G
红黄绿三个块表示的是数据存放的块
![e662d961191a0fb03c6e86913dc1923c.png](https://i-blog.csdnimg.cn/blog_migrate/6a21a91e077fe14575c99ca693641d78.jpeg)
然后数据data.txt进入map阶段,会以(KV对)的形式进入,K表示的是:每行首字母相对于文件头的字节偏移量,V表示的是每一行的文本。
![f8805b22ff096bdc2786c3c5d6a0b4f1.png](https://i-blog.csdnimg.cn/blog_migrate/577087ecd4abb07147610a97a5560dd0.jpeg)
那么我可以用图表示:蓝色的椭圆球表示一个map,红黄绿数据块在进入map阶段的时候,数据的形式为左边红色的(KV对)的形式
![e3222a516e3ba2f1090681e4431b6d83.png](https://i-blog.csdnimg.cn/blog_migrate/c8fb0741d03a6c2b1b3bbeb31d15ae9c.jpeg)
经过map处理,比如String.split(""),做一次处理,数据会在不同的红黄绿数据块中变为下面的KV形式
![b63d424652189b6bd61ae42a2f6418e1.png](https://i-blog.csdnimg.cn/blog_migrate/4a60a5eb29b16695eb17a8e35c9b30d8.jpeg)
![48cb6e2353ac5a7d9a870e20b406a4d4.png](https://i-blog.csdnimg.cn/blog_migrate/a1dba382ef7f43b4a3e96262c37c2b76.jpeg)
我们在配置Hadoop的时候或设置reduce的数量,假如有两个reduce
Map执行完的数据会放到对应的reduce中,如下图
![620887c7bc657412dd2d6d7b6b8ff459.png](https://i-blog.csdnimg.cn/blog_migrate/0acda2253f8a3e730c8bff96d492b82d.jpeg)
这个地方有一个简单的原理就是
Job.setNumReduce(2)会设置reduce的数量
而HashPartioner类可以利用 key.hashcode % reduce的结果,将不同的map结果输入到不同的reduce中,比如a-e开头的放到一个地方,e-z开头的放到一个地方,那么
![b63d424652189b6bd61ae42a2f6418e1.png](https://i-blog.csdnimg.cn/blog_migrate/4a60a5eb29b16695eb17a8e35c9b30d8.jpeg)
![48cb6e2353ac5a7d9a870e20b406a4d4.png](https://i-blog.csdnimg.cn/blog_migrate/a1dba382ef7f43b4a3e96262c37c2b76.jpeg)
这样的数据结果就会变成
![58a8517e0beb945de8f0c35ab3384368.png](https://i-blog.csdnimg.cn/blog_migrate/907aecfd053b128e2b15a7cae910205e.jpeg)
![f3598a25a000d2527f1134889304d620.png](https://i-blog.csdnimg.cn/blog_migrate/ec86a1946b21924a710e3c906580a100.jpeg)
![0dcc185bbbd682fc90b5a04dda04a8ec.png](https://i-blog.csdnimg.cn/blog_migrate/acd23754ae3b5bd0d61e478c3a75bb8f.jpeg)
好那么我们此时可以统计了,我开始编写代码
首先我们创建一个wordCount项目,我们创建的项目是maven项目
![8d602524e075b2b4e1bed3d881af7619.png](https://i-blog.csdnimg.cn/blog_migrate/924aefdcb4a5428ca48ba6ab836cdfeb.jpeg)
其中pom的配置部分
![a3626fb6f2625f7aee047ad5b3482535.png](https://i-blog.csdnimg.cn/blog_migrate/134f95d4124416e7e9ca1edc552329d3.jpeg)
![d7aa9ff1072b7307d810c8119fd234e8.png](https://i-blog.csdnimg.cn/blog_migrate/2350a469b799bfb0ee001a1c4d89ee96.jpeg)
![0fa57d473270a87094ddac411060dc0b.png](https://i-blog.csdnimg.cn/blog_migrate/7c02950cd8845bdd68312cefddb19cae.jpeg)
我们创建类
![05c85499ca62fe2168d864208b27da2a.png](https://i-blog.csdnimg.cn/blog_migrate/0618aaea4342a2e7e5ccac001da36735.jpeg)
继承Mapper(注意注释)
![754a2bf849b7893cfec5c93eec12dc1f.png](https://i-blog.csdnimg.cn/blog_migrate/f417d42f06972d0855ead00c1ea7b134.jpeg)
编写代码
![c59da15d3514212cae0ba05acc7cfb8d.png](https://i-blog.csdnimg.cn/blog_migrate/4061685ebcf3c6657b10efc3c30e2b5f.jpeg)
同样创建WordCountReducer,编写代码,利用前面的reduce思想理解
![12eee312b3e80c572a01f6b0eb11b364.png](https://i-blog.csdnimg.cn/blog_migrate/80ed60db58d936e0f08d0d6adfa4c8ef.jpeg)
创建WordCountDriver类编写代码
![11b56ef0b21dcca677cf39d9e05ec25b.png](https://i-blog.csdnimg.cn/blog_migrate/96743d63b3fb015f5578e7e39dca6fe2.jpeg)
导出项目jar
![d368e9b41e7163322625b36390eb6cd4.png](https://i-blog.csdnimg.cn/blog_migrate/d828a9867d8f9c862c8a0e1e70a31ea8.jpeg)
![71cc1e3f2b9ef7974db2bad41b57a347.png](https://i-blog.csdnimg.cn/blog_migrate/73ee36bd4c58d17374f9bf79fa3c6c6f.jpeg)
![1fb736191a967e08304c31ff27408b32.png](https://i-blog.csdnimg.cn/blog_migrate/3085f2f64f820aa46a2645fc2229b7d7.jpeg)
![99d73be0488a24eedcc3385bc07fe369.png](https://i-blog.csdnimg.cn/blog_migrate/a6fded66193f86063fafeaa3178363de.jpeg)
我们启动Hadoop
![72fa3d1a937e7ea8f546af2183509610.png](https://i-blog.csdnimg.cn/blog_migrate/5e011c02692936c44b9e52aad5741356.jpeg)
我们上传数据和jar包
![f6afd72d0457fa85d6a871670c037c86.png](https://i-blog.csdnimg.cn/blog_migrate/208fefb4fdaf5dffe4b6e272c2692f31.jpeg)
将数据上传到hdfs上
![f8bb243cc4b6d7e4112aefd3a780907b.png](https://i-blog.csdnimg.cn/blog_migrate/ec8cd33fe25536fd3d38bd75ec324624.jpeg)
执行下面语句
bin/yarn jar /data/wordCount/wordCount.jar com.xlglvc.xx.mapredece.wordcount_client.WordCountDriver /data.txt /outputwordcount
![d070021644d4a42aa4266f0399cadcc4.png](https://i-blog.csdnimg.cn/blog_migrate/de83a5d68e4b2eeef5df6d01e3e0ebb8.jpeg)
出了点问题,时间不同步
![688a0dfbd0412b87866107c3a218e2ed.png](https://i-blog.csdnimg.cn/blog_migrate/4b7596bae4a936147bb0eea15e5bf319.jpeg)
安装ntpdate工具
yum -y install ntp ntpdate
设置系统时间与网络时间同步
ntpdate cn.pool.ntp.org
![e26084f4fb986ae094d1c6e0715dece5.png](https://i-blog.csdnimg.cn/blog_migrate/ed1747286e71ce9e6631283091b346f5.jpeg)
然后重新执行,此时我们新选择个目录
bin/yarn jar /data/wordCount/wordCount.jar com.xlglvc.xx.mapredece.wordcount_client.WordCountDriver /data.txt /outputwordcount1
![cdfbb43f95a292b77e94ac54f4f74241.png](https://i-blog.csdnimg.cn/blog_migrate/3d2c9e91b8f46279e23cb813e2b40c61.jpeg)
我们去浏览器查询
![d05747a1d175b17c8367458d284a6804.png](https://i-blog.csdnimg.cn/blog_migrate/1cd4480c463076f41bbfadedb11c96f1.jpeg)
我们查看最终结果
bin/hdfs dfs -text /outputwordcount1/part-r-00000
![e8be0e9e9b4d2a81125a1186410a55e1.png](https://i-blog.csdnimg.cn/blog_migrate/606e7226dae9f70ec8d0f02a0828935b.jpeg)
出现我们想要的结果,统计完成