hadoop MapReduce:从mapper的输出中找到最大的键值对



这听起来像是一项简单的工作,但对于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


下面是从所有输入文件中找到最大数目的方法。

  1. 让我们先做一些随机抽样(比如每N条记录)。从File1 123和10,从File2 56和1,从File3 1和678

  2. 选择随机抽样的最大值为678

  3. 将随机抽样的最大数字传递给映射器,忽略输入数字小于随机抽样中发现的最大数字,并在映射器中发射其他数字。映射器将忽略小于678的任何值,并发出678、1234和3435。

  4. 配置作业使用1个reducer并查找发送到reducer的所有数字的最大值。在这个场景中,reducer将接收到678、1234和3435。并将计算出最大数量为3435。


对上述方法的一些观察

  1. 数据必须传递两次

  2. 在映射器和还原器之间传输的数据减少。

  3. 减速器处理的数据也在减少。

  4. 输入采样越好,Job完成越快。

  5. 与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选择它应该很简单。我猜。

相关内容

  • 没有找到相关文章

最新更新