Java TotalOrderPartitioner和分区文件

Java TotalOrderPartitioner和分区文件,java,hadoop,mapreduce,hadoop-partitioning,Java,Hadoop,Mapreduce,Hadoop Partitioning,我正在学习hadoop mapreduce,并且正在使用JavaAPI。我了解到TotalOrderPartitioner用于在集群中按键对输出进行“全局”排序,它需要一个分区文件(使用InputSampler生成): job.setPartitionerClass(TotalOrderPartitioner.class); InputSampler.Sampler Sampler=新的InputSampler.RandomSampler(0.1200); InputSampler.writeP

我正在学习hadoop mapreduce,并且正在使用JavaAPI。我了解到TotalOrderPartitioner用于在集群中按键对输出进行“全局”排序,它需要一个分区文件(使用InputSampler生成):

job.setPartitionerClass(TotalOrderPartitioner.class);
InputSampler.Sampler Sampler=新的InputSampler.RandomSampler(0.1200);
InputSampler.writePartitionFile(作业,采样器);
我有一些疑问,我向社区寻求帮助:

  • “全球排序”一词在这里的确切含义是什么?输出是如何排序的,我们仍然有多个分布在集群中的输出部件文件

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


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

    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
    
    现在,分区程序检查您的分区文件,并将记录发送到相应的缩减器。假设您定义了4个减速器,因此每个减速器将处理一个范围:

    Reducer 1 handles A,C
    Reducer 2 handles N,K,S
    Reducer 3 handles U
    Reducer 4 handles Z
    
    这就使得分区文件必须至少包含
    n-1
    个元素,与您正在使用的减缩器的数量相比。委员会的另一个重要说明是:

    如果键类型为BinaryCompariable,则 total.order.partitioner.natural.order不是false,是 第一个总计.order.partitioner.max.trie.depth(2)+1字节将为 建造。否则,将使用 使用为此作业定义的RawComparator对键集进行分区。这个 输入文件必须使用相同的比较器排序并包含 JobContextImpl.getNumReduceTasks()-1个键


    谢谢所以“全局”意味着第0个减缩器将处理第一组排序键,第1个减缩器将获得下一组排序键,依此类推,我得到。没有分区文件的情况是如何处理的,单个reducer获得所有的密钥吗?或者密钥在默认情况下是平均排序和分布的吗?我不确定,但我认为您必须设置一个分区文件。文档中的另一个重要注释:“如果keytype为BinaryComparable且total.order.partitioner.natural.order不为false,则第一个total.order.partitioner.max.trie.depth的trie(2)将生成+1个字节。否则,将使用为此作业定义的RawComparator对分区键集进行二进制搜索来定位键。输入文件必须使用相同的comparator进行排序,并包含JobContextImpl.getNumReduceTasks()-1个键。“如果只想有一个reducer,只需将reduce任务数设置为1。显然,没有分区是必要的。
    Reducer 1 handles A,C
    Reducer 2 handles N,K,S
    Reducer 3 handles U
    Reducer 4 handles Z