我有一个 map-reduce 工作,我只使用映射器,因为每个映射器的输出肯定会有一个唯一的键。我的问题是,当这项工作运行时,我得到输出文件,例如 part-m-00000、part-m-00001 ......它们会按键的顺序排序吗?
或者我是否需要实现一个减速器,它什么都不做,只是将它们写入像 part-r-00000、part-r-000001 这样的文件。这些是否保证输出按键的顺序排序。
我有一个 map-reduce 工作,我只使用映射器,因为每个映射器的输出肯定会有一个唯一的键。我的问题是,当这项工作运行时,我得到输出文件,例如 part-m-00000、part-m-00001 ......它们会按键的顺序排序吗?
或者我是否需要实现一个减速器,它什么都不做,只是将它们写入像 part-r-00000、part-r-000001 这样的文件。这些是否保证输出按键的顺序排序。
如果你想保证排序,你可以简单地使用一个IdentityReducer
.
如果你想让它更可并行化,你可以指定更多的 reducer,但是默认情况下输出只会在文件内排序,而不是跨文件排序。即,每个文件都会被排序,但是part-r-00000 不一定会在part-r-00001 之前。如果您确实希望跨文件对其进行排序,则可以使用基于排序顺序进行分区的自定义分区器。IE,reducer 0 获取所有最低键,然后 reducer 1,...,reducer N 获取所有最高键。
如果要对文件内的键进行排序,并确保在 i 小于 j 时文件中的键小于文件 j 中的键,则不仅需要使用 reducer,还需要使用 partitioner。您可能需要考虑使用 Pig 之类的东西来执行此操作,因为这将是微不足道的。如果你想用 MR 来做,使用排序字段作为你的键并编写一个分区器以确保你的键最终在正确的 reducer 中。
当您的 map 函数输出键时,它会转到执行 sort 的分区函数。因此,默认情况下,键将按排序顺序排列,您可以使用身份归约器。