【问题标题】:is the output of map phase of the mapreduce job always sorted?mapreduce作业的map阶段的输出是否总是排序的?
【发布时间】:2014-09-06 09:42:18
【问题描述】:

我对从 Mapper 获得的输出有点困惑。

例如,当我运行一个简单的字数统计程序时,输入文本如下:

hello world
Hadoop programming
mapreduce wordcount
lets see if this works
12345678
hello world
mapreduce wordcount

这是我得到的输出:

12345678    1
Hadoop  1
hello   1
hello   1
if  1
lets    1
mapreduce   1
mapreduce   1
programming 1
see 1
this    1
wordcount   1
wordcount   1
works   1
world   1
world   1

如您所见,mapper 的输出已经排序。我根本没有运行Reducer。 但是我在另一个项目中发现映射器的输出没有排序。 所以我很清楚这一点..

我的问题是:

  1. 映射器的输出是否总是排序的?
  2. sort 阶段是否已经集成到 mapper 阶段,所以 map 阶段的输出已经在中间数据中进行了排序?
  3. 有没有办法从sort and shuffle 阶段收集数据并在它进入Reducer 之前将其持久化?一个reducer 带有一个key 和一个iterables 列表。有没有办法,我可以持久化这些数据?

【问题讨论】:

    标签: hadoop mapreduce hadoop2


    【解决方案1】:

    映射器的输出是否总是排序的?

    没有。如果您不使用减速器,则不会对其进行排序。如果使用reducer,在mapper的输出写入磁盘之前有一个预排序过程。数据在 Reduce 阶段进行排序。这里发生的事情(只是猜测)是您没有指定 Reducer 类,在新 API 中,该类被转换为使用 Identity Reducer(请参阅this answer 和评论)。 Identity Reducer 只是输出它的输入。要验证这一点,请查看默认的 Reducer 计数器(应该有一些 reduce 任务、减少输入记录和组、减少输出记录...)

    排序阶段是否已经集成到mapper阶段,所以map阶段的输出已经在中间数据中排序了?

    正如我在上一个问题中所解释的,如果不使用 reducer,mapper 不会对数据进行排序。如果你使用 reducer,数据会从 map 阶段开始排序,然后在 reduce 阶段进行合并排序。

    有没有办法从排序和洗牌阶段收集数据,并在它进入 Reducer 之前将其持久化。一个reducer 带有一个key 和一个iterables 列表。有没有办法,我可以持久化这些数据?

    再一次,洗牌和排序是归约阶段的一部分。 Identity Reducer 会做你想做的事。如果您想为每个 reducer 输出一个键值对,其中值是可迭代的串联,只需将可迭代存储在内存中(例如,在 StringBuffer 中),然后将此串联作为值输出。如果您希望 map 输出直接进入程序的输出,而不经过 reduce 阶段,则在驱动程序类中将 reduce 任务的数量设置为零,如下所示:

    job.setNumReduceTasks(0);
    

    不过,这不会使您的输出排序。它将跳过映射器的预排序过程,并将输出直接写入 HDFS。

    【讨论】:

    • 所以下面的两个答案都具有误导性。如果数据在Reducer(或新API中的Identity Reducer)中排序,我怎样才能保留来自mapper的数据(不通过Identity Reducer..)
    • 通过在Driver类中将reduce任务的数量设置为0:job.setNumReduceTasks(0);这样,你的输出当然不会被排序。我更新了答案以包含此选项
    • 谢谢!再问一个问题:洗牌和分区是一样的吗?即来自 Mapper 的未排序键值输出对根据键的哈希码发送到其各自的减速器。并且reducer将在传递给reduce方法之前组合相同键的值..我们可以说排序和分组发生在Reducer中。但不是洗牌/分区?
    • 还有一个问题:我设置了job.setNumReduceTask(0)。但我也打开了job.setCombinerClass(Reducerclass)。我没有看到任何结合发生?有什么原因吗?
    • 这还没有完全解决。我读了 Hadoop 的书,它说输出在 Mapper 端排序。我正在考虑发布另一个问题。但我会在发布后接受这个。非常感谢
    【解决方案2】:

    第 1 点:mapper 的输出总是按 Key 排序的。 即,如果 Map 方法正在执行此操作:context.write(outKey, outValue);,则结果将根据 outKey 进行排序。

    【讨论】:

      【解决方案3】:

      以下是对您的问题的一些解释

      • Heading ##mapper 的输出是否总是排序的?

        @SurJanSR 已经回答了

      • Heading ##排序阶段是否已经与mapper阶段集成,使得map阶段的输出已经在中间数据中排序?

        如您所知,在 Mapreduce 作业中,Mapper 在单独的数据拆分上运行,并且跨数据持久化的节点运行。 Mapper 的结果在写入下一阶段之前临时写入。

      • 在reduce操作的情况下,临时存储的Mapper输出在移动到reduce操作之前根据partitioner的需要进行排序、shuffle

      • 在 Map Only Job 的情况下,就像您的情况一样,临时存储的 Mapper 输出根据键排序并写入最终输出文件夹(如您在作业的参数中指定的那样)。

      • Heading ##有没有办法从 sort 和 shuffle 阶段收集数据并在进入 Reducer 之前将其持久化。一个reducer 带有一个key 和一个iterables 列表。有没有办法,我可以持久化这些数据?

        不确定您的要求是什么。使用 IdentityReducer 只会保留输出。我不确定这是否能回答您的问题。

      【讨论】:

      • 我认为临时存储的映射输出文件已经排序(排序发生在内存中,如果超出内存,则会溢出到磁盘)
      【解决方案4】:

      我支持 veftym 的回答。 通常 Mapper 输出在本地存储到节点之前先进行排序。但是,当您在作业配置中明确将 numReduceTasks 设置为 0 时,映射器 o/p 将不会被排序并直接写入 HDFS。 所以我们不能说 Mapper 的输出是总是排序的!

      【讨论】:

        【解决方案5】:

        1.映射器的输出是否总是排序的?

        2.sort阶段是否已经集成到mapper阶段,所以map阶段的输出已经在中间数据中排序了?

        来自阿帕奇MapReduceTutorial

        (在Mapper部分下)

        与给定输出键关联的所有中间值随后由框架分组,并传递给 Reducer 以确定最终输出。

        Mapper 输出经过排序,然后按 Reducer 进行分区。分区总数与作业的reduce任务数相同

        (在Reducer部分下)

        减速器无

        如果不需要减少,将减少任务的数量设置为零是合法的。

        在这种情况下,映射任务的输出直接进入文件系统,进入由 FileOutputFormat.setOutputPath(Job, Path) 设置的输出路径。 框架在将映射输出写入文件系统之前不会对其进行排序。

        3.有没有办法从排序和洗牌阶段收集数据并在进入Reducer之前将其持久化?一个reducer 带有一个key 和一个iterables 列表。有没有办法,我可以持久化这些数据?

        我不这么认为。来自 Apache 对Reducer的谴责:

        Reducer 有 3 个主要阶段:

        随机播放:

        Reducer 使用 HTTP 跨网络复制每个 Mapper 的排序输出。

        排序: 框架通过键对 Reducer 输入进行合并排序(因为不同的 Mapper 可能输出相同的键)。

        shuffle 和 sort 阶段同时发生,即在获取输出时它们被合并。

        减少:

        reduce 任务的输出通常通过TaskInputOutputContext.write(Object, Object) 写入RecordWriter

        Reducer 的输出没有重新排序。

        根据文档,shuffle 和 sort 阶段由框架驱动

        如果要持久化数据,请将 reducer 的数量设置为零,这会导致 Map 输出持久化到 HDFS 中,但不会对数据进行排序。

        查看相关的 SE 问题:

        hadoop: difference between 0 reducer and identity reducer?

        我在 Hadoop 2.x 版本中没有找到 IdentityReducer:

        identityreducer in the new Hadoop API


        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-08
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多