我对Page 112 of the Book Map Reduce Design模式
上给出的这个注释感到有些困惑请注意,中间分区中的范围数需要 等于订单步骤中的减速器数量。如果你决定 更改reducer的数量,你一直在重用同一个文件, 你需要重建它
对于初学者我不完全确定“中间分区”这个术语在这个上下文中意味着什么,有人可以用一个例子来解释它。
这本书也没有继续解释这是必要的原因,我猜的原因是
将每个中间分区传递给reducer将能够并行处理所有分区,从而最有效...
但是为了论证,如果我对效率低下可以,我可以将任意数字作为减速器的数量?它会以任何方式影响最终输出(性能除外)
您一直在重复使用同一个文件, 你需要重建它**
以上两行是什么意思?
答案 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个范围。