【灵光一现】MR辅助排序深入理解&MR重点盘点

辅助排序:发生在map输出的数据进入reduce之前,可根据键值的一部分对整个键值对进行排序


常用于提取一组数据中不同id下每个id对应的价值的最大值或最小值
实际案例可参见mr文档的辅助排序案例

原理:

重新建立一个mr的分组器 继承自 WritableComparator类并重写其比较方法

此外,需注意。必须写一个无参构造并传递一个true值给父类,不然数据会全被定位空
源码如下:

布尔参数createInstances即为必须传true的原因

重写其比较方法:

使对于一个键值只根据其一部分来进行排序
如此一来,进入reduce阶段时,原本是不同的键值对会变成相同的键值对,再加上value为空的话,则会只传入第一个(即为排序好的最大或者最小的键值对)
举个例子:
map阶段出来的键值对如下所示:
a.<(1,20):null> b.<(1,18):null> c.<(2,34):null>
原本a与b是不相同的键值对,排序上a>b但是,经过辅助排序后 只根据id进行排序
再加上value同为空那reduce阶段就会认为a=b,只输出第一个,即为a 就可得到id为a的最大值为20

MR学习总结

1.要去关注job提交源码和切片提交源码

切片源码maps中有三个参数,一个最小值1,一个最大值longwritable
还有一个块大小,集群中块大小默认128m,本地是32m。
如果存一个129m文件,只切一片

2.shuffle重中之重

分区,排序,合并 需要全掌握

combiner是mapreduce的优化手段,适用于汇总不适用均值

3.outputformat,reduce join , map join

数仓岗位很重要

4.etl很重要 需要加深练习

5.inputformat

默认实现类:TextInputFormat,默认按照块大小去切片,k是偏移量,v是行内容

KeyValueTextInputFormat:每一行均为一条记录,被分割符分割为key,value,默认分隔符是\t,分隔符之前为key,之后为value

NlineInputFormat:按照指定的行数N来划分切片

CombineTextInputFormat:可以把多个小文件合并成一个切片处理,提高处理效率,改变了KV,K是文件路径加名称,V是文件内容

用户还可以自定义InputFormat

6.逻辑处理接口:Mapper

用户根据业务需求实现其中三个方法
map():实现业务逻辑

setup():初始化

cleanup():关闭资源收尾

7.Partitioner分区

有默认实现HashPartitioner,逻辑是根据key的哈希值和numReduces来返回一个分区号;公式为:key.hashCode()&Integer.MAXVALUE % numReduces
若有特定业务需求,可自定义分区,需注意分区是有顺序的必须从0开始

8.Comparable排序

当我们用自定义的对象key来输出时,就必须实现WritableComparable接口重写他的compareto()方法
部分排序:对最终的输出的每一个文件进行内部排序

全排序:对所有数据进行排序,通常只有一个reduce

二次排序:排序的条件有两个,同理可知三次排序

9.combiner合并

combiner合并可以提高程序执行效率,减少io传输,但是使用时必须不能影响原有业务的处理结果

10.reduce端分组:GroupingComparator

在reduce端对key进行分组,应用于:在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到同一个reduce方法时,可以采用分组排序。

11.逻辑处理接口:reducer

用户根据业务需求实现其中三个方法:reduce() setup() cleanup()

12.OutputFormat

默认实现类时TextOutputFormat,功能逻辑是:将每一个KV对向目标文本文件输出一行。

将SequenceFileOutputFormat输出作为后续MapReduce任务的输入,这便是一种好的输出格式,因为他格式紧凑,很容易被压缩

用户可自定义OutputFormat

×

纯属好玩

扫码支持
谢谢你

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 辅助排序:发生在map输出的数据进入reduce之前,可根据键值的一部分对整个键值对进行排序
    1. 1.1. 原理:
    2. 1.2. 重写其比较方法:
  2. 2. MR学习总结
    1. 2.0.1. 1.要去关注job提交源码和切片提交源码
    2. 2.0.2. 2.shuffle重中之重
    3. 2.0.3. 3.outputformat,reduce join , map join
    4. 2.0.4. 4.etl很重要 需要加深练习
    5. 2.0.5. 5.inputformat
    6. 2.0.6. 6.逻辑处理接口:Mapper
    7. 2.0.7. 7.Partitioner分区
    8. 2.0.8. 8.Comparable排序
    9. 2.0.9. 9.combiner合并
    10. 2.0.10. 10.reduce端分组:GroupingComparator
    11. 2.0.11. 11.逻辑处理接口:reducer
    12. 2.0.12. 12.OutputFormat
,