WordCount单词统计分析


 最近在网上看了hadoop相关资料以及单词计数的一个实例,结合网上的资料和自己的看法简要分析一下执行过程。


MyMapper.java

package com.mpred;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.LongWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Mapper;

public class MyMapper extends Mapper<LongWritable, Text, Text,IntWritable> {

@Override

protected voidmap(LongWritable key, Text value, Context context)

throws IOException, InterruptedException {

String val=value.toString();

String str[]=val.split(" ");

for(String s:str){

context.write(new Text(s),new IntWritable(1));

}

}

}

MyReducer.java

package com.mpred;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

importorg.apache.hadoop.mapreduce.Reducer;

public class MyReducer extends Reducer<Text, IntWritable, Text,IntWritable> {

/* (non-Javadoc)

* @seeorg.apache.hadoop.mapreduce.Reducer#reduce(java.lang.Object,java.lang.Iterable, org.apache.hadoop.mapreduce.Reducer.Context)

*/

@Override

protected voidreduce(Text key, Iterable<IntWritable> values,

Context context)

throws IOException, InterruptedException {

int sum=0;

for(IntWritable val:values){

sum+=val.get();

}

context.write(key,new IntWritable(sum));

}

}

WordCount.java

package com.mpred;

import java.io.IOException;

importorg.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IntWritable;

import org.apache.hadoop.io.Text;

import org.apache.hadoop.mapreduce.Job;

import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;

importorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

public staticvoidmain(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

Configuration conf=new Configuration();//加载配置文件

Job job=new Job(conf);//创建一个job,供JobTracker使用

job.setJarByClass(WordCount.class);

job.setMapperClass(MyMapper.class);

job.setReducerClass(MyReducer.class);

FileInputFormat.addInputPath(job,newPath("hdfs://192.168.0.9:9000/hello.txt"));

FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.0.9:9000/wordcount"));

job.setMapOutputKeyClass(Text.class);

job.setMapOutputValueClass(IntWritable.class);

System.exit(job.waitForCompletion(true)?0:1);

}

}

输入文件

hello you

hello me

follow me

followyou

执行流程简要分析:

1.        map任务处理

a)        读取文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一个map函数。

b)        在map函数中可以编写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。

c)        对输出的key、value进行分区。

d)        对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。

2.        reduce任务处理

a)        对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。

b)        对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、reduce处理,转换成新的key、value输出。

c)        把reduce的输出保存到文件中。

分析以上示例代码:

输入文件的分析:

helloyou           //key是0,value是hello you

hello me            //key是10,value是hello me

注:map函数的key表示字节偏移量,value表示一行文本内容。

map函数分析:

protected void map(LongWritable key, Text value, Contextcontext)

throws IOException, InterruptedException {

String val=value.toString();

String str[]=val.split(" ");

for(String s:str){

context.write(new Text(s),new IntWritable(1));

}

}

key为偏移量,value为每一行的数据;通过split方法(按空格)分离出每一个单词;然后通过循环输出每一组单词(<hello,1>,<you,1>,<hello,1>,<me,1>)

排序后的结果:<hello,1>,<hello,1>,<me,1>,<you,1>

分组后的结果:<hello,{1,1}>,<me,{1}>,<you,{1}>

reduce函数分析

protected void reduce(Text key, Iterable<IntWritable>values,

Context context)

throws IOException, InterruptedException {

int sum=0;

for(IntWritable val:values){

sum+=val.get();

}

context.write(key,new IntWritable(sum));

}

key为单词,value为单词数的集合;可以看出reduce函数将会被调用3次,每一次调用都会计算values集合的和,然后输出每一组数据

reduce输出后的数据为<hello,2>,<you,1>,<me,1>

至此map和reduce函数执行完毕,将数据写入文件。

hadoop实例分析之WordCount单词统计分析相关推荐

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

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

  2. Hadoop伪分布式配置和搭建,hadoop单机安装,wordcount实例测试,hadoop安装java目录怎么找,问题及问题解决方法

    Hadoop伪分布式配置和搭建,hadoop单机安装,wordcount实例测试,hadoop安装java目录怎么找,问题及问题解决方法 环境说明 系统:ubuntu18.04 主机名:test1 用 ...

  3. Hadoop源代码分析

    http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...

  4. RPC-原理及RPC实例分析

    还有就是:RPC支持的BIO,NIO的理解 (1)BIO: Blocking IO;同步阻塞: (2)NIO:Non-Blocking IO, 同步非阻塞; 参考:IO多路复用,同步,异步,阻塞和非阻 ...

  5. 怎么看调用的接口_Hadoop RPC调用实例分析

    以ClientProtocol接口中的rename RPC调用进行一次实例分析. rename方法在ClientProtocol接口中定义,它的两个参数是String类型的,不能直接通过网络传输. 我 ...

  6. 实现 | 朴素贝叶斯模型算法研究与实例分析

    实现 | 朴素贝叶斯模型算法研究与实例分析 (白宁超  2018年9月4日10:28:49) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受 ...

  7. 工控系统的全球安全现状:全球漏洞实例分析

    工控系统的全球安全现状:全球漏洞实例分析 一.摘要 ​ 运营技术(OT).网络和设备,即工业环境中使用的所有组件,在设计时并未考虑到安全性.效率和易用性是最重要的设计特征,然而,由于工业的数字化,越来 ...

  8. Hadoop源代码分析(完整图文版) part 1

    在网上看到了很多此文章的装载,但是都是纯文字,这篇文章在没有图片的情况下阅读起来意义不大了.花了点时间上传了100多张图片,希望对大家学习hadoop有帮助. Hadoop源代码分析(一) 关键字:  ...

  9. WordCount单词统计笔记

    1.在本机的/root目录下,依次创建文件夹data,文本文件word.txt. mkdir -p /root/data vim /root/data/word.txt 键入i,进入编辑模式,输入如下 ...

最新文章

  1. deny后加to do还是doing_动词后加to do 和 doing 的 记忆口诀
  2. java 抽象工厂模式简单实例
  3. Sitemap Celebration(使用嵌套列表的树形导航)
  4. 解决js动态改变dom元素属性后页面及时渲染问题
  5. 可以搜python题答案的app-可以搜Python题答案的APP有哪些?
  6. android rxbus github,RxBus
  7. 日常工作记录---在虚拟机中进行slam建图
  8. 计算机网络——FTP网络服务器
  9. 未成年人勿进 谨以献给1980~1990出生的人(一)
  10. openssl-1.0.0 的新增功能与欠缺(一)
  11. 照度/感光度(Lux)
  12. STM32F407定时器输入捕获
  13. Salesforce Apex 中常用技能总结(持续更新)
  14. 【学术期刊】2023CCF推荐的A,B,C类英文科技期刊目录最新发布
  15. wps表格怎么去掉数字最后的两位
  16. try except与try finally不同之处
  17. 软件学院研究方向,对研究方向迷茫的同学一定要看(据说是一位北大软院前辈写的)
  18. 内丘计算机学校,内丘学校食堂打卡机
  19. TRIZ创新方法——现代TRIZ理论
  20. python中如何输入多行文字_python中怎么输入多行字符串 | 学会python

热门文章

  1. mysql 崩溃恢复_超详细的MySQL数据库InnoDB崩溃恢复机制总结
  2. Spark2.4.0 SparkEnv 源码分析
  3. 微服务监控zipkin、skywalking以及日志ELK监控系列
  4. yum更换本地源、yum下载和源码包安装
  5. Nhibernate+SQLite 入门实例指南二 类的继承、多态关系
  6. platform总线的probe函数调用
  7. Repeater在无数据记录时显示“无相关记录...”
  8. Lync server 2010 发布拓扑错误0x80070005
  9. 关系代数——附加的关系运算(1)
  10. 一起谈.NET技术,C#序列化与反序列化(Serializable and Deserialize)