我正在学习hadoop mapreduce,我正在使用Java API。我了解了TotalOrderPartitioner用于通过密钥在整个集群中“全局”排序输出,并且需要一个分区文件(使用InputSampler生成):
job.setPartitionerClass(TotalOrderPartitioner.class);
InputSampler.Sampler<Text, Text> sampler = new InputSampler.RandomSampler<Text, Text>(0.1, 200);
InputSampler.writePartitionFile(job, sampler);
我有几个疑问,我向社区寻求帮助:
“全球排序”这个词到底意味着什么?如何对输出进行排序,我们仍然有多个分布在群集中的输出部分文件?
如果我们不提供分区文件会怎样?是否有处理这种情况的默认方式?
答案 0 :(得分:6)
让我们用一个例子解释一下。我们假设您的分区文件如下所示:
H
T
V
当您的键范围从A到Z时,这将占用4个范围:
1 [A,H)
2 [H,T)
3 [T,V)
4 [V,Z]
当映射器现在向reducer发送记录时,分区器会查看输出的键。让我们说所有映射器的输出如下:
A,N,C,K,Z,S,U
现在,分区程序会检查您的分区文件并将记录发送到相应的reducer。假设您已定义了4个减速器,因此每个减速器将处理一个范围:
Reducer 1 handles A,C
Reducer 2 handles N,K,S
Reducer 3 handles U
Reducer 4 handles Z
这表明,与您使用的reducer数量相比,您的分区文件必须至少包含n-1
个元素。来自docs的另一个重要说明:
如果keytype是BinaryComparable和 total.order.partitioner.natural.order不是假的,一个特里的 first total.order.partitioner.max.trie.depth(2)+ 1个字节 建成。否则,将使用二进制搜索来定位密钥 使用为此作业定义的RawComparator分区键集。该 输入文件必须使用相同的比较器进行排序并包含 JobContextImpl.getNumReduceTasks() - 1个键。