MapReduce特性(二) 排序

MapReduce的核心在于排序,通过设置map任务而取消reduce任务,可以观察到部分排序的效果。全排序则需要通过特定的分区策略实现全局有序。Hadoop提供了InputSampler接口和TotalOrderPartitioner等工具来实现数据采样和分区,如SplitSampler、IntervalSampler和RandomSampler等。为了实现二次排序,可以使用组合键,结合setPartitionerClass、setSortComparatorClass和setGroupingComparatorClass进行设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapReduce的核心技术是排序,用来组织数据

准备

将一个MR作业设置成只有map函数,并通过job.setNumReduceTasks(0)不执行默认的reduce,所以输出不会按键排序


部分排序

> 使用默认的MR设置,最终结果产生按键排序

> 如果输出文件有多个,那多个分别按键排序,且文件串联非有序,则不是全体有序,可以使用MapFile发现键的所属分区,在分区查找记录


全排序

> 大文件实现全排序,如果只用一个Partitioner则无法体现并行的优势

> 创建排序文件,且分区使这些文件串联有序,串联后得到全局有序,这里关键是如何分区

    根据数据分布均匀划分记录,遍历整个DataSet效率并不高,需要采样,采样的核心思想是只查看一小部分键,获得键的近似分布,由此构成分区

    Hadoop内置了采样器InputSampler类实现接口Sampler

    > Sampler接口 getSampler(InputFormat, Job),一般不由客户端调用,由静态方法InputSampler.writePartitionerFile()

    创建一个顺序文件存储定义分区的键,可以指定采样率

    > TotalOrderPartitioner使用顺序文件为排序作业创建分区

public interface Sampler<K, V>{
  k[] getSample(InputFormat<K, V> inf, Job job) throws IOException, InterruptedException;
}
public static <K, V> void writePartitionFile(Job job, Sample<K, V> sampler) throws IOException, ClassNotFoundException, InterruptedException

    > SplitSampler 只采样分片中的前n条记录

    > IntervalSampler 一定的间隔定期从分片中选择键

    > RandomSampler 优秀的通用采样器

    > 自定义采样器


辅助排序 二次排序

1 思想

    > 自然键和自然值组成新的键,叫组合键

    > 分区和分组时只考虑键

    > 对组合键中的键值排序,先对键排序,再对值排序

2 setPartitionerClass + setSortComparatorClass + setGroupingComparatorClass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值