java - TotalOrderPartitioner 和分区文件

标签 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. 如果我们不提供分区文件会怎样?有没有默认的方法来处理这种情况?

最佳答案

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

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

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

Reducer 1 handles A,C
Reducer 2 handles N,K,S
Reducer 3 handles U
Reducer 4 handles Z

这表明,与您使用的 reducer 数量相比,您的分区文件必须至少包含 n-1 个元素。 docs 的另一个重要说明:

If the keytype is BinaryComparable and total.order.partitioner.natural.order is not false, a trie of the first total.order.partitioner.max.trie.depth(2) + 1 bytes will be built. Otherwise, keys will be located using a binary search of the partition keyset using the RawComparator defined for this job. The input file must be sorted with the same comparator and contain JobContextImpl.getNumReduceTasks() - 1 keys.

关于java - TotalOrderPartitioner 和分区文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35265529/

相关文章:

java - 制作基于文本的 RPG 时遇到麻烦(与文本区域/字段相关)

java - 为什么这个静态java方法不是线程安全的?

java - 寻找 java.util.Map 的替代品

javascript - MongoDB 汇总子文档上的每个键

scala - scala 上的 hadoop 有哪些选项

java - Liquibase插入BIT列,MySQL,列数据太长

java - 使用oracle、SQLServer2000还是MySQl哪个数据库

hadoop - 我可以使用 Kerberos 在 Yarn 上运行 DCE(Docker 容器执行器)吗?

hadoop - 使用 FileInputFormat 获取 map 方法中的行号

hadoop - 在 Map reduce 中每次修改代码都需要创建一个 jar 文件