MapReduce排序专题

部分排序

MapReduce 根据输入记录的键对数据集排序。保证在结果文件中,每个文件内的数据有序,但是全局文件无序。

MapReduce中正常执行的代码都是部分排序。

全排序

对于所有结果文件,不仅每个文件内部有序,同时全局有序。

实现方式:

  1. 按照逻辑有顺序的自定义分区规则

  2. 把reduce数量设置为1(处理大型文件时效率极低)

    如果数据中某部分数据特别集中,分区的标准很难确定,就会造成reduce端计算数据倾斜问题,导致计算时间过程。解决方法 3

  3. 通过随机抽样的方式获取自定义分区的临界点

随机抽样执行步骤

  1. 设置reduceTask的数量

    job.setNumReduceTasks(n)

  2. 设置分区类

    job.setPartitionerClass(TotalOrderPartitioner.class)

  3. 使用随机抽样获取临界点

    InputSampler.Sampler sampler = new InputSampler.RandomSampler(freq,numSample,spilt);
    
    • freq:每个key被抽取到的概率

    • numSample: 抽取样本的数量

    • split:分区数,一般与reduce数量保持一致

  4. 把临界点文件设置进去

    InputSampler.writePartitionFile(job,sampler);
    
  5. 如果有已知的临界点序列化文件,可以直接使用,取消3,4两个步骤

    TotalOrderPartitioner.setPartitionFile(job.getConfiguration(), new Path());
    

注意:

  1. 输入路径一定要放在执行随机抽样之前设置

    原因:有文件才可以抽样

  2. 原文件必须是序列化类型,且必须设置输入文件类

    job.setInputFormatClass(SeqenceFileInputFormat.class)

  3. 可以通过 hdfs.cmd dfs -text xxx.seq 验证序列化文件数据

    序列化文件:

    hadoop使用的文件类型,每行数据都有两个字段,分别为key和value

    读取数据的时候,可以按照key和value的真实类型进行读取

二次排序

在一个排序条件无法满足需求的时候,可以选择两个及以上的条件同时排序。

  1. 默认类型只能自定义排序规则进行二次排序

  2. 自定义类型默认和自定义排序规则都可以二次排序

    尽量在默认排序规则的时候把所有字段考虑完整

  3. 不管默认排序条件和自定义排序条件谁多谁少,一切按照自定义排序

倒排索引

通过具体的内容,反向查找出这个内容的所在位置,这种业务关系叫倒排索引

举例:

TX 斗地主 qq飞车 和平精英 qq飞车 qq炫舞 斗地主

WEGAME 斗地主 qq飞车 CS CF DNF LOL CS CS

STEAM 斗地主 CSGO PUBG PUBG 扫雷 保卫萝卜

IPEC 贪吃蛇 CS DNF DNF 和平精英 DMJ

练习:

斗地主 TX:2,WEGAME:1,STEAM:1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值