TotalOrderPartitioner和Partition文件

时间:2016-02-08 08:52:16

标签: java hadoop mapreduce hadoop-partitioning

我正在学习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);

我有几个疑问,我向社区寻求帮助:

  1. “全球排序”这个词到底意味着什么?如何对输出进行排序,我们仍然有多个分布在群集中的输出部分文件?

  2. 如果我们不提供分区文件会怎样?是否有处理这种情况的默认方式?

1 个答案:

答案 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个键。