我正在学习,我正在使用Java。我了解了用于在集群中按键对输出进行“全局”排序的TotalOrderPartitioner,并且它需要一个分区文件(使用InputSampler生成):
job.setPartitionerClass(TotalOrderPartitioner.class);
InputSampler.Sampler<Text, Text> sampler = new InputSampler.RandomSampler<Text, Text>(0.1, 200);
InputSampler.writePartitionFile(job, sampler);我有几点疑虑,我寻求社会人士的帮助:
发布于 2016-02-08 10:37:35
让我们用一个例子来解释它。假设您的分区文件如下所示:
H
T
V当您的键范围从A到Z时,这将弥补4个范围:
1 [A,H)
2 [H,T)
3 [T,V)
4 [V,Z]当映射器现在向还原器发送记录时,分区器可以查看输出的键。假设所有映射器的输出如下:
A,N,C,K,Z,S,U现在,分区程序检查分区文件,并将记录发送给相应的还原程序。让我们假设您已经定义了4个减速机,因此每个减速机将处理一个范围:
Reducer 1 handles A,C
Reducer 2 handles N,K,S
Reducer 3 handles U
Reducer 4 handles Z这使您的分区文件与您使用的减缩器的数量相比,必须至少保存n-1元素。文档的另一个重要注意事项
如果键类型为BinaryComparable,而total.order.partitioner.natural.order不是false,则将生成第一个total.order.partitioner.max.trie.depth(2) +1字节的trie。否则,将使用为此作业定义的RawComparator对分区密钥集进行二进制搜索来定位键。输入文件必须使用相同的比较器进行排序,并包含JobContextImpl.getNumReduceTasks() -1键。
https://stackoverflow.com/questions/35265529
复制相似问题