这听起来像是一项简单的工作,但对于MapReduce来说,它似乎并不那么简单。
我有N文件,其中每个文件只有一行文本。我希望Mapper输出键值对,如<Filename,>,其中'score'是一个从文本行计算出来的整数。作为旁注,我使用下面的代码片段来这样做(希望它是正确的)。
FileSplit fileSplit = (FileSplit)reporter.getInputSplit();
String fileName = fileSplit.getPath().getName();
假设映射器工作正确,它应该输出N键值对。现在的问题是我应该如何编程的减速器输出一个键值对与最大的'得分'?
据我所知,Reducer只适用于共享相同键的键值对。由于这个场景中的输出都有不同的键,我猜在Reduce步骤之前应该做一些事情。或者也许应该完全省略Reduce步骤?
让我们假设
File1有10,123,23,233
File2有1,3,56,1234
File3有6,1,3435,678
下面是从所有输入文件中找到最大数目的方法。
-
让我们先做一些随机抽样(比如每N条记录)。从File1 123和10,从File2 56和1,从File3 1和678
-
选择随机抽样的最大值为678
-
将随机抽样的最大数字传递给映射器,忽略输入数字小于随机抽样中发现的最大数字,并在映射器中发射其他数字。映射器将忽略小于678的任何值,并发出678、1234和3435。
-
配置作业使用1个reducer并查找发送到reducer的所有数字的最大值。在这个场景中,reducer将接收到678、1234和3435。并将计算出最大数量为3435。
对上述方法的一些观察
-
数据必须传递两次
-
在映射器和还原器之间传输的数据减少。
-
减速器处理的数据也在减少。
-
输入采样越好,Job完成越快。
-
与Reducer功能相似的Combiner将进一步改善Job时间。
可以使用setup()和cleanup()方法(旧API中的configure()和close()方法)。在reduce类中声明一个全局变量,它决定最高分数。对于每个要减少的调用,您将把输入值(分数)与全局变量进行比较。
Setup()在同一个reduce任务中的所有reduce调用之前被调用一次。Cleanup()在同一个reduce任务的最后一次reduce调用之后调用。因此,如果您有多个reducer, Setup()和cleanup()方法将在每个reduce任务上分别调用。
您可以返回文件名和分数作为值,并从映射器返回任何常量作为键
参考幻灯片32 &33 of http://www.slideshare.net/josem.alvarez/map-reduceintro
我用同样的方法得到了结果。唯一需要注意的是,当您有多个字段时,您需要分别创建fieldnamemin和fieldnamemax。
省略Reducer !!使用Configuration将全局变量设置为score和key,然后在映射器中访问它,通过使用全局变量作为max score和key的内存来进行简单的max score选择它应该很简单。我猜。