这就是一个简单的理解,为了方便我们hadoop实战学习,如果想深入理解,自行百度即可。
接下来,我们分析一下MapReduce项目中三个必要的类。
重写这个map方法有什么意义呢?
继续拿统计图书的例子来说,当小明被指派到书架1统计图书的时候,小明可以偷懒,对于那些他不想统计的书,他可以不统计;小明也可以很尽责,统计的结果达到百分百准确。
总而言之,小明只要拿出统计结果给负责汇总的人就可以了,至于他是怎么处理的,负责汇总的人管不着。
而重写这个map方法,就对应于实现这个处理的过程,负责将输入的
比如:
public class WordCountMapper extends Mapper{
/*
* map方法是提供给map task进程来调用的,map task进程是每读取一行文本来调用一次我们自定义的map方法
* map task在调用map方法时,传递的参数:
* 一行的起始偏移量LongWritable作为key
* 一行的文本内容Text作为value
*/
@Override
protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {
//拿到一行文本内容,转换成String 类型
String line = value.toString();
//将这行文本切分成单词
String[] words=line.split(" ");
//输出<单词,1>
for(String word:words){
context.write(new Text(word), new IntWritable(1));
}
}
提醒:
在Map步的输出结果为<单词,1>这样的形式,而且做了合并处理,将拥有相同key值的键值对进行合并,形成一个
继续理解:
这个Reduce步就相当于在统计图书中那个汇总统计的人,负责对手下的工作结果进行汇总,Reduce步的输入和输出同样为
context应该是用来传递数据以及其他运行状态信息,map中的key、value写入context,让它传递给下一层。
代码如下:
public class WordCountReducer extends Reducer{
@Override
/*
* reduce方法提供给reduce task进程来调用
*
* reduce task会将shuffle阶段分发过来的大量kv数据对进行聚合,聚合的机制是相同key的kv对聚合为一组
* 然后reduce task对每一组聚合kv调用一次我们自定义的reduce方法
* 比如:
* hello组会调用一次reduce方法进行处理,tom组也会调用一次reduce方法进行处理
* 调用时传递的参数:
* key:一组kv中的key
* values:一组kv中所有value的迭代器
*/
protected void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException {
//定义一个计数器
int count = 0;
//通过value这个迭代器,遍历这一组kv中所有的value,进行累加
for(IntWritable value:values){
count+=value.get();
}
//输出这个单词的统计结果
context.write(key, new IntWritable(count));
}
3.xxxJob.java
这一步,一般是提供主函数入口,加载job下的jar包,mapper,reducer文件,将任务提交给hadoop集群等工作。
在Hadoop中,每个MapReduce任务被当做一个Job(作业),在执行任务之前,首先要对任务进行一些配置。
xxxJob.java 中一般需要设置如下东西:
• 设置处理该作业的类,setJarByClass()
• 设置这个作业的名字,setJobName()
• 设置这个作业输入数据所在的路径
• 设置这个作业输出结果保存的路径
• 设置实现了Map步的类,setMapperClass()
• 设置实现了Reduce步的类,setReducerClass()
• 设置输出结果key的类型,setOutputKeyClass()
• 设置输出结果value的类型,setOuputValueClass()
• 执行作业(提交给hadoop集群)
因为我们编码完成以后了,一般不再eclipse中运行,而是编码好了以后,打包为jar包,导出到hadoop下面去运行。
上诉的分析就是整个MapReducer项目结构简要 分析,主要是帮助自身理解为什么做一个hadoop分析数据,需要这么三个java类文件和几个必要的方法。
下一篇,开始记录hadoop实战之WordCount统计单词数目。
Hadoop实战之WordCount统计单词数目
You got a dream, you gotta protect it.
如果你有梦想的话,就要去捍卫它 。 ——《当幸福来敲门》