10

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

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

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

我假设即使在文件中也应该对文件进行排序,即文件 1 应该有 a 并且最后一个文件部分--00009 应该有带有 zzzz 或 atleaset > a 的条目

假设我有所有字母均匀分布的键。

有人可以解释一下为什么会出现这种行为

4

4 回答 4

12

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

  1. 在 mapreduce 中只使用一个 reducer(坏主意!这在一台机器上投入了太多工作)
  2. 编写自定义分区程序。Partioner 是在 mapreduce 中划分键空间的类。默认的partioner(Hashpartioner)将key空间平均划分为reducer的个数。查看示例以编写自定义分区器。

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

于 2013-01-14T16:56:32.330 回答
1

总排序

来自特定 Key 的所有键值对都将到达特定的 reducer。这将通过 Mapper 级别的分区器发生。Mapper 级别的组合器将充当半减速器并将特定键的值发送到减速器。HashPartitioner是决定 reducer 数量的最佳分区器。

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

二次排序

用于定义映射输出键的排序方式。它在映射器级别工作。在这种情况下,我们将能够控制值与键的顺序。也就是说,可以对两个或多个字段值进行排序。

看看总订单排序二级排序

于 2015-11-03T15:25:31.080 回答
0
Q :all the files have sorted data but these files itself are not sorted..

Ans :默认使用自定义 Hashpartitioner对中间输出(来自映射器)进行分区。

前任:

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}

如果您正在寻找按值排序:是答案

于 2013-01-15T05:09:57.687 回答
0

Hive order by 使用单个reducer,因此您可以使用distribute by/ sort by,然后从排序表中您可以从表中插入覆盖本地 - 将数据写入文件

于 2014-07-21T21:47:37.067 回答