TotalOrderPartitioner和Partition文件

Ank*_*try 2 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);
Run Code Online (Sandbox Code Playgroud)

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

  1. "全球排序"这个词到底意味着什么?输出究竟是如何排序的,我们仍然有多个分布在整个群集中的输出部分文件?

  2. 如果我们不提供分区文件会发生什么?有没有一种默认的方法来处理这种情况?

Mat*_*cke 6

让我们用一个例子来解释它.假设您的分区文件如下所示:

H
T
V
Run Code Online (Sandbox Code Playgroud)

当您的键从A到Z时,这将占用4个范围:

1 [A,H)
2 [H,T)
3 [T,V)
4 [V,Z]
Run Code Online (Sandbox Code Playgroud)

当映射器现在将记录发送到reducer时,分区程序会查看输出的键.假设所有映射器的输出如下:

A,N,C,K,Z,S,U
Run Code Online (Sandbox Code Playgroud)

现在,分区程序检查您的分区文件并将记录发送到相应的reducer.我们假设您已定义了4个减速器,因此每个减速器将处理一个范围:

Reducer 1 handles A,C
Reducer 2 handles N,K,S
Reducer 3 handles U
Reducer 4 handles Z
Run Code Online (Sandbox Code Playgroud)

这样,您的分区文件必须至少n-1包含与您正在使用的reducer数相比的元素.来自文档的另一个重要说明:

如果keytype为BinaryComparable且total.order.partitioner.natural.order不为false,则将构建第一个total.order.partitioner.max.trie.depth(2)+ 1个字节的trie.否则,将使用为此作业定义的RawComparator使用分区键集的二进制搜索来定位键.输入文件必须使用相同的比较器进行排序,并包含JobContextImpl.getNumReduceTasks() - 1个键.