Hadoop实战之MapReducer项目结构分析

一.MapReducer项目结构分析

1.前言

参考本例子前: 1.需要确保搭建好了hadoop集群环境。 2.安装了eclipse开发hadoop的环境。 3.这是关于MapReducer中的Mapper、Reduce、Job三个类的学习分析。

2.hadoop的MapReducer模型结构

(1)在eclipse中做hadoop开发: 在系统上打开eclipse,新建一个MapReducer 项目:
  1. 打开 eclipse,file->other->Map/Reducer Project->Next->Project name 创建名为WordCount 的项目名,然后创建名为cn.edu.gznc的包,接着在包里面创建三个类,分别是WordCountMapper、WordCountReduce、WordCountJob。
    图示:
    Hadoop实战之MapReducer项目结构分析_第1张图片
    Hadoop实战之MapReducer项目结构分析_第2张图片
    这里是在演示通常的hadoop实战时候建立的 MapReducer项目结构。
    接下来,我们先分析一下什么是MapReduce。

3.分析

总所周知,HDFS和MapReduce是Hadoop的两个重要核心,其中MapReduce是Hadoop的分布式计算模型。 而典型的MapReduce主要分为两步Map步和Reduce步,为了方便学习和理解,这里引用一个故事来解释:
现在派你统计一个图书馆里面有多少本书,为了完成这个任务,你可以指派小明去统计书架1,指派小红去统计书架2.....这个指派的过程就是Map步,最后,每个人统计完属于自己负责的书架后,再对每个人的结果进行累加统计,累计统计过程就是Reduce步。

这就是一个简单的理解,为了方便我们hadoop实战学习,如果想深入理解,自行百度即可。

接下来,我们分析一下MapReduce项目中三个必要的类。

  1. xxxMapper.java
    一般在 xxxmapper.java 类中需要写一个map方法。
    也就是上面说的Map步:
    首先,要实现Map步,实际上就是实现一个类,这个类继承了Mapper类并且重写其中的map方法。

重写这个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));  
        }  
    }  
  1. xxxReducer.java
    要实现Reduce步,就需要实现一个类,这个类继承了Reducer类并且重写其中的reduce方法。所以 xxxReducer.java里面写一个reduce方法。

提醒:
在Map步的输出结果为<单词,1>这样的形式,而且做了合并处理,将拥有相同key值的键值对进行合并,形成一个的形式,这个的键值对集合,又作为Reduce步的输入。
或者Iterable 的键值对集合,作为Reduce步的输入。

继续理解:
这个Reduce步就相当于在统计图书中那个汇总统计的人,负责对手下的工作结果进行汇总,Reduce步的输入和输出同样为。这部分代码参见图三中的第一个绿色框(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.
如果你有梦想的话,就要去捍卫它 。 ——《当幸福来敲门》

你可能感兴趣的:(hadoop集群,大数据实战系列)