二,MapReduce基本编程规范

  (TOC)

  

一、MapReduce编程基本组成

  

编写MapReduce的程序有至少三个必不可少的部分:映射器,减速机,驱动程序。可选的有分割者,合路器
而且映射器的输入输出,减速机的输入输出都是键值型的,所以要求我们在编写mapper和减速器时,必须实现明确这4个键值对中8种的数据类型,而且必须还是hadoop的可序列化类型,同时还需要注意的是,地图的输出其实就是减少的输入,所以包括的数据类型是一样的。

  

1,地图阶段

  

编写基本流程
1)自定义映射类,需要继承Mapper这个类
2)继承Mapper的时候,需要指定输入和输出的键值对中的类型
3)必须重写继承自父类的映射()方法
4)上面重写的地图()方法是每个地图任务对每一个输入到映射中的键值对都会调用处理一次。

  

基本编写实例如下:

  
 <=坝镅詊ava代码类>/*
  指定Mapper<键入,我们,KEYOUT VALUEOUT>这4个类型分别为:
  LongWritable、文本、文本IntWritable,相当于普通类型:
  长字符串,字符串,整数
  */公开课TestMapper延伸Mapper{
  公共空间映射(LongWritable关键文本值,上下文语境)抛出IOException, InterruptedException {
  这里是地图方法处理逻辑
  }
  } 
  

2,减少阶段

  

基本编写流程
1)自定义减少类,需要继承减速器这个类
2)继承减速器的时候,需要指定输入和输出的键值对中的类型
3)必须重写继承自父类的减少()方法
4)上面重写的减少()方法是每个降低任务对每一个输入到减速器中的键值对都会调用处理一次。

  

基本编写实例如下:

  
 <=坝镅詊ava代码类>/*
  指定Reducer<键入,我们,KEYOUT VALUEOUT>这4个类型分别为:
  文本、IntWritable文本、IntWritable相当于普通类型:
  字符串、整数、字符串、整数
  */公共类TestReducer Reducer<延伸;文本,IntWritable,文本,IntWritable>{
  保护孔隙减少(文本关键,
  Iterable值,
  上下文语境)抛出IOException InterruptedException {
  这里是减少方法处理逻辑
  }
  } 
  

3,司机阶段

  

这个部分是用于配置工作对象的各种必须配置信息,配置完成后,将工作提交给纱执行
具体配置啥下面直接上例子看好了。主要起到调度map和reduce任务执行的作用

  

4,瓜分者阶段

  

这个阶段主要是对地图阶段的输出进行分区,而地图的分区数直接决定减少任务的数量(一般来说是一对一),编写流程如下:
1)自定义分区类,继承Partitioner<关键,value>
2)继承瓜分者的时候,处理的输入的键值对类型
3)必须重写继承自父类的getPartition()方法
4)上面重写的getPartition()()方法是每个maptask对每一个输入的键值对都会调用处理一次。
5)根据分区规则,返回0 ~ n,表示分区格式为0 ~ n

  

编写案例如下:

  
 <代码类="语言java ">公共类WordCountPartitioner Partitioner<延伸;文本,IntWritable>{
  @Override
  公共int getPartition(文本文字,IntWritable IntWritable, int i) {
  判断条件1:
  返回0;
  判断条件2:
  返回1;
  ……
  返回n;
  }
  } 
  

5,合路器

  

组合器不是一个独立的阶段,它其实是包含在地图阶段中的. map本身输出的键值对中,每个键值对的值都是1,就算是一样的关键,也是独立一个键值对。如果重复的键值对越多,那么将地图输出传递到减少的过程中,就会占用很多带宽资源。优化的方法就是每个地图输出时,先在当前地图任务下进行局部合并汇总,减少重复可以的出现。即

  
 <代码> & lt;王,1比;,& lt的在王,1比;这种一样的关键的,就会合并成& lt;王,2比;
  这样就会减少传输的数据量 
  

所以其实由此可以知道,其实合路器的操作和减少的操作是一样的,只不过一个是局部,一个是全局。简单的做法就是,直接将减速器作为组合器类传入工作,如:

  
 <代码> job.setCombinerClass (WordCountReducer.class);  
  

我们可以看看这个方法的源码:

  
 <代码>公共空setCombinerClass (Class<?Reducer>延伸;cls)抛出IllegalStateException {
  this.ensureState (Job.JobState.DEFINE);//看到没,那个Reducer.class
  this.conf.setClass (“mapreduce.job.combine.class”, cls Reducer.class);
  } 
  

可以清楚看到设置结合类时,可以看到多态的类型设置就是减速机类型的,从这里也可以更加确定合路器的操作和减速器的就是一样的。

二,MapReduce基本编程规范