【问题标题】:Hadoop map/reduce sortHadoop map/reduce 排序
【发布时间】:2012-11-15 08:10:11
【问题描述】:

我有一个 map-reduce 工作,我只使用映射器,因为每个映射器的输出肯定会有一个唯一的键。我的问题是,当这项工作运行时,我会得到输出文件,例如 part-m-00000、part-m-00001 ... 它们会按键的顺序排序吗?

或者我是否需要实现一个reducer,它什么都不做,只是将它们写入part-r-00000、part-r-000001等文件。并且这些是否保证输出按键的顺序排序。

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    如果要对文件内的key进行排序,并确保在i小于j时文件中的key小于文件j中的key,那么不仅需要使用reducer,还需要使用partitioner .您可能需要考虑使用 Pig 之类的东西来执行此操作,因为这将是微不足道的。如果你想用 MR 做这件事,使用排序字段作为你的键并编写一个分区器以确保你的键最终在正确的 reducer 中。

    【讨论】:

    【解决方案2】:

    当您的地图函数输出键时,它会转到partition function which does a sort。因此,默认情况下,键将按排序顺序排列,您可以使用身份归约器。

    【讨论】:

    • 我知道在reducer函数之前,map的所有输出都是排序的。我的问题是,如果我们有 n 个生成 n 个文件的 reducer,那么这 n 个文件会根据键排序吗?
    • 基于这个 map reduce book,reducers 按排序顺序获取文件lintool.github.com/MapReduceAlgorithms/MapReduce-book-final.pdf(第 27 页)
    • 是的,这是正确的。但是 reducer 是否按排序顺序产生输出?
    • 我找不到任何可以确认的信息,但您始终可以将 Reducer 的结果发送到 IdentityMapper 和 IdentityReducer。本质上是创造第二份工作。由于可以有多个 map/reduce 迭代器,因此某些结果可能已排序,但如果最终 reduce 更改了输入 和 reducer 输出 的顺序,我相信顺序并不能保证。
    【解决方案3】:

    如果你想保证排序,你可以简单地使用一个IdentityReducer

    如果你想让它更可并行化,你可以指定更多的 reducer,但是默认情况下输出只会在文件内排序,而不是跨文件排序。即,每个文件都会被排序,但 part-r-00000 不一定在 part-r-00001 之前。如果您确实希望跨文件对其进行排序,则可以使用基于排序顺序进行分区的自定义分区器。即,reducer 0 获取所有最低键,然后 reducer 1,...,reducer N 获取所有最高键。

    【讨论】:

    • 当您说 part-r-00000 不一定会出现在 part-r-00001 之前。这是否意味着 part-r-00000 中的键总是小于 part-r-00001 中的键
    • 对,例如,如果您不指定自定义排序分区器,则 part-r-00000 可能包含“1, 5, 6, 8, 10”,part-r-00001 可能包含“2、4、7、11”。
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多