ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MapReduce(二) MR的高级特性-序列化、排序、分区、合并

2019-02-27 18:53:44  阅读:301  来源: 互联网

标签:Mapper combiner 输出 分区 Reducer MapReduce key MR 序列化


一、序列化

   (*) 核心接口:Writable接口。如果有一个类实现了Writable接口,就可以作为Map/Reduce的key和value.

       举例:

      读取员工数据,生成员工对象,直接存储在HDFS

      序列化的顺序和反序列化 的顺序要保持相同。

      public void readFields(DataInput input) throws IOException{

      }

      pubic void write(DataOutput output) throws IOException{

       }

二、排序 

  排序规则:按照key2排序。key2可以是基本数据类型,也可以是对象(可序列化的对象)。

      基本数据类型:        

        ByteWritable:单字节数值
        IntWritable:整型数
        LongWritable:长整型数
        FloatWritable:浮点数
        DoubleWritable:双字节数值
        BooleanWritable:标准布尔型数值        
        Text:使用UTF8格式存储的文本
        NullWritable:当<key,value>中的key或value为空时使用

        常用的数据类型,排序规则的实现:

          (*)Int 数字:默认升序,可以改变默认的排序规则,通过创建自己的比较器。

                    创建一个类(比如叫做NewIntCompare)继承并重写 IntWritable.Comparator 类中的compare方法,

                    在main函数中,通过Job类对象配置比较器,在Map类设置语句的后面,添加job.setSortComparatorClass(NewIntCompare.class)

 

          (*)字符串:默认字典序,可以改变默认的排序规则,通过创建自己的比较器。                    

                    创建一个类(比如叫做NewTextCompare)继承并重写 Text.Comparator类中的compare方法,

                    在main函数中,通过Job类对象配置比较器,在Map类设置语句的后面,添加job.setSortComparatorClass(NewTextCompare.class)

                    

          (*)对象:实现WritableComparable接口

  

三、分区

  1、需求分析:把最终结果中,不同类型的数据,输出到不同的文件。比如,将相同城市的数据输出到一个文件中,或者把相同性别的数据输出的一个文件中。

     2、MR中分区的特点:

    (1)在MR中,一个reducer任务对应一个输出文件,分区的数量也是reducer任务的数量。

    (2)Reducer的输入数据来自于Mapper,分区工作由Mapper任务来完成。

    (3)Mapper任务划分数据的过程叫做Partition,MR中负责划分数据的类叫做Partitioner。

    (4)自定义分区规则,需要创建新的分区类(以MyPartitioner为自定义类的名字),继承Partitioner,并重写getPartition()方法,代码如下。

1 import org.apache.hadoop.mapreduce.Partitioner
2 
3 public void MyPartitioner extends Partitioner<K,V>{
4      @Override
5       // 默认使用key的hash值与Integer的做大值做“与运算”,避免出现溢出的情况    
6       public int getPartiton(K key ,V value , int numReduceTasks){
7              return (key.hashCode() &&  Integer.MAX_VALUE) % numReduceTasks;
8       }        
9 }    

    (5)MyPartitioner类是用于处理Mapper任务的输出的,getPartition方法的三个参数分别是,Mapper输出的key,value,和设置的Reducer任务数量(即,分区数量)。

    (6)getPartition方法的返回值为0~numReduceTasks-1 ,分别代表 numReduceTasks个分组;

    (7)分区数 numReduceTasks的设置,在主函数中完成,代码如下:

job.setPartitionerClass(Mypartitioner.class);
job.setNumReduceTasks(3); //比如,设置分区数量为3个

 

四、合并(combiner)

  1、hadoop中娥的combiner函数其实本质上也是Reduce,设计的初衷是为了降低Mapper和Reducer之间的 IO的数据量,将Mapper输出的数据在Mapper端进行合并。

  2、注意事项:

    (1)combiner并不是用于所有的业务场景,比如,求平均数的时候就不能使用。

    (2)combiner的输入是Mapper的输出,而输出是Reducer的输入,然后在MapReduce中,Mapper的输出数据类型与Reducer的输入数据类型是相同的。所以在设计Mapper/Reducer

      之前要充分考虑,防止因为combiner的出现,对Reducer最终的输出产生影响。

  3、在主函数中设置combiner,代码如下  

job.setCombinerClass(MyCombiner.class);

 

     

标签:Mapper,combiner,输出,分区,Reducer,MapReduce,key,MR,序列化
来源: https://www.cnblogs.com/wl413911/p/10428560.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有