2013-10-04 26 views
2

我已经意识到,当使用Python代码运行Hadoop时,无论是mapper还是reducer(不知道是哪个)在打印出reducer.py之前对输出进行排序。目前它似乎按照字母数字排序。我想知道是否有一种方法可以完全禁用此功能。我希望程序的输出基于从mapper.py打印的顺序。我在Java中找到了答案,但是没有找到Python的答案。我是否需要修改mapper.py或者命令行参数?Hadoop和Python:禁用排序

+0

如果您需要输出与由mapper打印的输出方式相同,那么您为什么需要减速器? –

回答

1

您应该阅读关于基本MapReduce概念的更多内容。尽管在某些情况下排序可能是不必要的,但“排序”阶段的混洗部分是MapReduce模型的固有部分。 MapReduce框架(Hadoop)需要对映射器的输出进行分组,以便将所有的键集中在一起,以便Reducer实际上可以“减少”数据。在使用流式传输时,键值对在默认情况下由制表符值分隔。从其他SO问题中的示例代码中,我可以看出您没有提供生成“关键,值”元组,而只是生成单个文本行。

编辑:增加了以下问题的答案“如何使它在数字上排序(例如,10之前9)?”

备选方案1:在您的密钥前加零,以使它们具有相同的大小。 “09”在“10”之前。

备选2:使用KeyFieldBasedComparator,如this SO question中所示。

+0

感谢您的输入。然而,我正在编写的程序不会生成关键值元组。你知道如何禁用自动排序吗? – Objc55

+0

不,但我的观点是,即使您可以禁用排序,您也无法摆脱通过键(您的线被框架解释为键)的混洗,因此输出无论如何都会混杂在一起。也许你需要一个不同于MapReduce的模型。 – cabad

+0

有没有办法改变排序,所以9会出现在10之前? – Objc55

1

没有,如前所述here

如果您减少任务数不为0,Hadoop框架将你的结果进行排序。没有其他办法了。

+1

当链接死亡时,“否”以标题回答问题。 (@gsamaras,你有类似的链接,还活着?) –

+0

@MarkGerolimatos我一眼就找不到一个,如果你有一个,请分享。好东西,我将基本信息复制到答案中,因为这些天没有链接是不死的=) – gsamaras