【问题标题】:MapReduce job Output sort orderMapReduce 作业输出排序顺序
【发布时间】:2013-01-14 16:24:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

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

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

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

    【讨论】:

    • 在方法 3 中,您的意思是在 Hive 中使用“ORDER BY”吗?不也是一个reducer实现的吗?(根据this link),和方法一基本一样。
    【解决方案2】:

    总排序

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

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

    二次排序

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

    看看Total order sorting & Secondary sorting

    【讨论】:

      【解决方案3】:
      Q :all the files have sorted data but these files itself are not sorted..
      

      Ans : Custom 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}
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2014-09-06
          • 1970-01-01
          • 2018-04-08
          • 1970-01-01
          • 2019-12-04
          • 2020-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多