MapReduce作业输出排序顺序

时间:2013-01-14 16:24:04

标签: hadoop mapreduce

我可以在mapreduce作业中看到,reducer部分的输出按键排序..

所以如果我将reducer的数量设置为10,那么输出目录将包含10个文件,并且每个输出文件都有一个已排序的数据。

我把它放在这里的原因是即使所有文件都有排序数据但这些文件本身没有排序.. 例如:有些情况下,部分000 *文件从0开始并在zzzz结束,假设我使用Text作为键。

我假设文件应该在文件中排序,即文件1应该有a和最后一个文件部分 - 00009应该有zzzz或atleaset的条目>

假设我拥有所有字母均匀分布的密钥。

可能有人为这样的行为提出了一些启示

4 个答案:

答案 0 :(得分:11)

您可以使用以下方法实现全局排序的文件(这是您基本上想要的):

  1. 在mapreduce中只使用一个reducer(糟糕的想法!!这会在一台机器上放置太多工作)
  2. 编写自定义分区程序。 Partioner是在mapreduce中划分密钥空间的类。默认分区(Hashpartioner)将密钥空间均分为reducers数。查看编写自定义分区的this示例。

  3. 使用Hadoop Pig / Hive进行排序。

答案 1 :(得分:1)

总排序

特定Key的所有键值对都将到达特定的reducer。这将通过Mapper级别的分区进行。 Mapper级别的组合器将充当Semi reducer并将特定键的值发送到Reducer。 HashPartitioner 是决定缩减器数量的最佳分区器。

reducer输出将是一个文件,其所有输出都根据键进行排序。

二级排序

用于定义地图输出键的排序方式。它适用于Mapper级别。在这种情况下,我们将能够控制值的顺序以及键。即可以对两个或多个字段值进行排序。

查看Total order sorting& Secondary sorting

答案 2 :(得分:0)

Q :all the files have sorted data but these files itself are not sorted..

Ans:自定义Hashpartitioner 默认用于对中间输出进行分区(来自mapper)。

前:

If the intermediate values are 3,4,5,6,7,8,9,10,11
Then the data will be partitioned into (lets say) Reducer: 
R1{7,4,10}
R2{5,11,8}
R3{9,6,3}

所以现在平面文件将有

Part-00000 {4,,7,11}
Part-00001 {5,8,11}
Part-00002 {3,6,9}

如果您正在寻找按值排序:Here是ans

答案 3 :(得分:0)

Hive顺序使用单个reducer,所以你可以使用distribute by sort by然后从sorted表中你可以插入覆盖本地表 - 将数据写入文件