totalOrderPartitioner中的拆分数

时间:2014-02-22 16:33:30

标签: hadoop mapreduce

我对Page 112 of the Book Map Reduce Design模式

上给出的这个注释感到有些困惑
  

请注意,中间分区中的范围数需要   等于订单步骤中的减速器数量。如果你决定   更改reducer的数量,你一直在重用同一个文件,   你需要重建它

对于初学者我不完全确定“中间分区”这个术语在这个上下文中意味着什么,有人可以用一个例子来解释它。

这本书也没有继续解释这是必要的原因,我猜的原因是

将每个中间分区传递给reducer将能够并行处理所有分区,从而最有效...

但是为了论证,如果我对效率低下可以,我可以将任意数字作为减速器的数量?它会以任何方式影响最终输出(性能除外)

您一直在重复使用同一个文件,  你需要重建它**

以上两行是什么意思?

2 个答案:

答案 0 :(得分:4)

这里TotalOrderPartitioner如何工作:首先运行一个Sampler(例如RandomSampler)(在客户端上)并创建数据样本。数据是否会被排序 - 这些样本有望将其潜入大致相同的块中。其次,排序MapReduce将使用TotalOrderPartitioner和这些样本在reducer之间分配数据。每个Reducer都会对其块数据进行排序,并将其输出。由于根据样本将数据分配给reducer,当我们连接Reducers的输出时 - 我们将整个输入数据排序。

可以将其视为具有一级递归的快速排序

在声明中,你问过:

  

请注意,中间分区中的范围数需要   等于订单步骤中的减速器数量。如果你决定   更改reducer的数量,你一直在重用同一个文件,   你需要重建它

中间分区是由带有samples(分区文件)的文件表示的分区。

这些“中间分区”的数量应该等于减速器的数量。这是一项要求。来自javadoc:

  

public static void setPartitionFile(Configuration conf,                                       路径p)

     

//设置存储已排序分区键集的SequenceFile的路径。   必须是这样的情况,对于R减少,SequenceFile中有R-1个键。

InputSampler 创建多个“中间分区”,它们等于MapReduce作业中的Reducers数量,满足此要求。

如果重新运行排序 - 如果数据稍有变化并且样本仍然可以很好地表示它 - 您可以将现有分区文件与样本一起使用,因为它在客户端上的创建是昂贵的。 但您必须使用相同数量的Reducers,就像您在InputSample创建分区文件的作业中使用的那样。

答案 1 :(得分:0)

我认为“中间分区”是指您在分析阶段构建的中间分区文件。此文件确定每个reducer的范围分区。如果您希望范围大小相同,则首先分析数据样本,然后相应地构建范围。您还可以指定范围数。

由于订单阶段中的每个reducer接收一个分区,reducers的数量需要等于该分区文件中的范围数量。如果您的文件中有5个分区但只使用4个reducer,则hadoop将不知道将第五个分区发送到何处。在这种情况下,您需要重建分区文件,使其仅包含4个范围。