WordCount入门实例
1、处理过程
WordCount:统计文本中每类单词的出现次数。
1)将文件拆分成splits,由于测试用的文件较小,所以每个文件为一个split,并将文件按行分割形成<key,value>对。
- 这一步由MapReduce框架自动完成,其中偏移量(即key值)包括了回车所占的字符数(Windows和Linux环境会不同)。
- 偏移量:存储单元的实际地址与其所在段的段地址之间的距离
2)将分割好的<key,value>对交给用户定义的map方法进行处理,生成新的<key,value>对.
3)得到map方法输出的<key,value>对后,Mapper会将它们按照key值进行排序,并执行Combine合并过程,将key值相同的value值累加,得到Mapper的最终输出结果,并写入磁盘。
4)Reducer先对从Mapper接收的数据进行排序,并将 key 值相同的 value 值合并到一个 list 列表中,再交由用户自定义的reduce方法进行处理,得到新的<key,value>对,并作为WordCount的输出结果。
2、代码分析
一、import:架包
- io里边是文件读取所用到的,即input/output 输入输出,用来操作流。
- util代表工具类,包含一些日期转换、字符串处理、获取编译环境信息。
- mappper中存放查询时使用的sql。
- apache是个非盈利组织,起产品一般都用org开头。org说明这是一个开源的包,可以让任何人免费使用。
- GenericOptionsParser是hadoop框架中解析命令行参数的基本类。它能够辨别一些标准的命令行参数,能够使应用程序轻易地指定namenode,jobtracker,以及其他额外的配置资源。
①setInputFormat:设置map的输入格式,默认为TextInputFormat,key为LongWritable, value为Text
②setNumMapTasks:设置map任务的个数,此设置通常不起作用,map任务的个数取决于输入的数据所能分成的input split的个数
③setMapRunnerClass:设置MapRunner, map task是由MapRunner运行的,默认为MapRunnable,其功能为读取input split的一个个record,依次调用Mapper的map函数
④setMapOutputKeyClass和setMapOutputValueClass:设置Mapper的输出的key-value对的格式
⑤setOutputKeyClass和setOutputValueClass:设置Reducer的输出的key-value对的格式
⑥setPartitionerClass和setNumReduceTasks:设置Partitioner,默认为HashPartitioner,其根据key的hash值来决定进入哪个partition,每个partition被一个reduce task处理,所以partition的个数等于reduce task的个数
⑦setOutputFormat:设置任务的输出格式,默认为TextOutputFormat
1)Map过程
public class Main{//Main是类名,要用public class进行修饰,java程序由类(class)组成,一个源文件可以包含多个类
/* Mapper 静态内部类
Mapper类:实现了Map功能基类
建立Mapper类TokenizerMapper继承自泛型类Mapper
*/
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>
/LongWritable,Text,IntWritable用于封装Java数据类型的类/
{
/Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
行偏移量 输入值 输出key 输出值/
public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException{
Text keyout;//定义整数1,每个单词计数一次
IntWritable valueOut = new IntWritable (1);
/*构造一个用来解析输入value值的 StringTokenizer对象
Java默认的分隔符是"空格""制表符(’\t’)"“换行符(’\n’)”"回车符(’\r’)"