部分排序
MapReduce 根据输入记录的键对数据集排序。保证在结果文件中,每个文件内的数据有序,但是全局文件无序。
MapReduce中正常执行的代码都是部分排序。
全排序
对于所有结果文件,不仅每个文件内部有序,同时全局有序。
实现方式:
-
按照逻辑有顺序的自定义分区规则
-
把reduce数量设置为1(处理大型文件时效率极低)
如果数据中某部分数据特别集中,分区的标准很难确定,就会造成reduce端计算数据倾斜问题,导致计算时间过程。解决方法 3
-
通过随机抽样的方式获取自定义分区的临界点
随机抽样执行步骤
-
设置reduceTask的数量
job.setNumReduceTasks(n)
-
设置分区类
job.setPartitionerClass(TotalOrderPartitioner.class)
-
使用随机抽样获取临界点
InputSampler.Sampler sampler = new InputSampler.RandomSampler(freq,numSample,spilt);
-
freq:每个key被抽取到的概率
-
numSample: 抽取样本的数量
-
split:分区数,一般与reduce数量保持一致
-
-
把临界点文件设置进去
InputSampler.writePartitionFile(job,sampler);
-
如果有已知的临界点序列化文件,可以直接使用,取消3,4两个步骤
TotalOrderPartitioner.setPartitionFile(job.getConfiguration(), new Path());
注意:
-
输入路径一定要放在执行随机抽样之前设置
原因:有文件才可以抽样
-
原文件必须是序列化类型,且必须设置输入文件类
job.setInputFormatClass(SeqenceFileInputFormat.class)
-
可以通过 hdfs.cmd dfs -text xxx.seq 验证序列化文件数据
序列化文件:
hadoop使用的文件类型,每行数据都有两个字段,分别为key和value
读取数据的时候,可以按照key和value的真实类型进行读取
二次排序
在一个排序条件无法满足需求的时候,可以选择两个及以上的条件同时排序。
-
默认类型只能自定义排序规则进行二次排序
-
自定义类型默认和自定义排序规则都可以二次排序
尽量在默认排序规则的时候把所有字段考虑完整
-
不管默认排序条件和自定义排序条件谁多谁少,一切按照自定义排序
倒排索引
通过具体的内容,反向查找出这个内容的所在位置,这种业务关系叫倒排索引
举例:
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