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)
我有几个疑问,我寻求社区的帮助:
"全球排序"这个词到底意味着什么?输出究竟是如何排序的,我们仍然有多个分布在整个群集中的输出部分文件?
如果我们不提供分区文件会发生什么?有没有一种默认的方法来处理这种情况?
让我们用一个例子来解释它.假设您的分区文件如下所示:
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个键.