JobPlus知识库 IT 工业智能4.0 文章
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项目结构。 
    接下来,我们先分析一下什么是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<LongWritable, Text, Text, IntWritable>{

   @Override

    /* 

     * 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值的键值对进行合并,形成一个

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

    @Override

      /*

     * reduce方法提供给reduce task进程来调用

     *

       * reduce task会将shuffle阶段分发过来的大量kv数据对进行聚合,聚合的机制是相同key的kv对聚合为一组

     * 然后reduce task对每一组聚合kv调用一次我们自定义的reduce方法

     * 比如:<hello,1><hello,1><hello,1><tom,1><tom,1><tom,1> 

     *  hello组会调用一次reduce方法进行处理,tom组也会调用一次reduce方法进行处理

     *  调用时传递的参数:

     *

          key:一组kv中的key

     *

          values:一组kv中所有value的迭代器

     */ 

     protected void reduce(Text key, Iterable<IntWritable> 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类文件和几个必要的方法。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
467人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序