这听起来像一个简单的工作,但使用MapReduce似乎并不那么简单。
我有 N 个文件,其中每个文件只有一行文字。我希望Mapper输出关键值对,如< filename,score&gt ;,其中'score'是从文本行计算的整数。作为旁注,我使用下面的代码片段(希望它是正确的)。
FileSplit fileSplit = (FileSplit)reporter.getInputSplit();
String fileName = fileSplit.getPath().getName();
假设映射器正确地完成了它的工作,它应该输出 N 键值对。 现在问题是我应该如何编程Reducer以输出具有最大'得分'的一个键值对?
据我所知,Reducer仅适用于共享相同密钥的键值对。由于这个场景中的输出都有不同的键,我猜测应该在Reduce步骤之前完成一些事情。或者也许应该完全省略Reduce步骤?
答案 0 :(得分:3)
让我们假设
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。
将随机采样中的最大数字传递给映射器,忽略输入数字减去随机采样中找到的最大数量,并在映射器中发出其他数字。 Mappers将忽略少于678的任何内容并发出678,1234和3435。
将作业配置为使用1个reducer,并查找发送到reducer的所有数字的最大值。在这种情况下,reducer将收到678,1234和3435.并将计算最大数量为3435。
对上述方法的一些观察
数据必须传递两次。
映射器和缩减器之间传输的数据减少了。
Reducer处理的数据也会减少。
更好的输入采样,工作完成的速度更快。
具有与Reducer相似功能的组合器将进一步改善作业时间。
答案 1 :(得分:2)
您可以使用旧API中的setup()和cleanup()方法(configure()和close()方法)。 在reduce类中声明一个全局变量,它确定最大分数。对于每次调用reduce,您都会将输入值(score)与全局变量进行比较。
在同一reduce任务中的所有reduce调用之前调用Setup()一次。在同一个reduce任务中的最后一次reduce调用之后调用Cleanup()。因此,如果您有多个Reducer,则会在每个reduce任务上单独调用Setup()和cleanup()方法。
答案 2 :(得分:0)
您可以将文件名和分数作为值返回,只返回任何常量作为映射器中的键
答案 3 :(得分:0)
参考幻灯片32& http://www.slideshare.net/josem.alvarez/map-reduceintro
中的33个我使用了相同的方法并得到了结果。唯一需要关注的是,如果您有多个字段,则需要单独创建fieldnamemin和fieldnamemax。
答案 4 :(得分:0)
省略减速机!! 使用配置将全局变量设置为分数和键,然后在映射器中访问它,通过使用全局变量作为最大分数和键的内存来进行简单的最大分数选择 应该很简单。我猜。