Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hadoop MapReduce:从映射器的输出中查找最大键值对_Java_Hadoop_Mapreduce - Fatal编程技术网

Java hadoop MapReduce:从映射器的输出中查找最大键值对

Java hadoop MapReduce:从映射器的输出中查找最大键值对,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,这听起来很简单,但使用MapReduce似乎并不那么简单 我有N个文件,其中每个文件只有一行文本。我希望映射器输出键值对,如,其中“score”是从文本行计算出来的整数。作为旁注,我使用下面的代码片段来实现这一点(希望它是正确的) 假设映射器正确执行其工作,它应该输出N个键值对。 现在的问题是如何编程Reducer以输出具有最大“分数”的一个键值对 据我所知,Reducer仅适用于共享同一密钥的键值对。由于这个场景中的输出都有不同的键,我猜在Reduce步骤之前应该做些什么。或者应该完全省略Re

这听起来很简单,但使用MapReduce似乎并不那么简单

我有N个文件,其中每个文件只有一行文本。我希望映射器输出键值对,如,其中“score”是从文本行计算出来的整数。作为旁注,我使用下面的代码片段来实现这一点(希望它是正确的)

假设映射器正确执行其工作,它应该输出N个键值对。 现在的问题是如何编程Reducer以输出具有最大“分数”的一个键值对

据我所知,Reducer仅适用于共享同一密钥的键值对。由于这个场景中的输出都有不同的键,我猜在Reduce步骤之前应该做些什么。或者应该完全省略Reduce步骤?

您可以使用setup()和cleanup()方法(旧API中的configure()和close()方法)。 在reduce类中声明一个全局变量,它决定了最大分数。对于每个reduce调用,您需要将输入值(score)与全局变量进行比较


Setup()在同一reduce任务中的所有reduce调用之前调用一次。Cleanup()在同一个reduce任务中的最后一次reduce调用后调用。因此,如果您有多个reducer,Setup()和cleanup()方法将在每个reduce任务上分别调用。

您可以返回文件名和分数作为值,只需从映射器返回任何常量作为键

文件1有10123,23233个

文件2有1,3,561234个

文件3有613435678个


以下是从所有输入文件中查找最大数量的方法

  • 让我们先做一些随机抽样(比如说每N条记录)。来自文件1 123和10,来自文件2 56和1,来自文件3 1和678

  • 从随机抽样中选择最大数量,即678

  • 将随机采样中的最大值传递给映射器,忽略输入值减去随机采样中的最大值,并在映射器中发出其他值。地图绘制者将忽略任何小于678的内容,并发出678、1234和3435

  • 将作业配置为使用1个减速机,并查找发送到减速机的所有数字的最大值。在这种情况下,reducer将接收6781234和3435。并将计算最大数量为3435


  • 对上述方法的一些看法

  • 数据必须传递两次

  • 映射器和还原器之间传输的数据减少

  • 减速器处理的数据也会减少

  • 输入采样越好,作业完成得越快

  • 与减速器具有类似功能的组合器将进一步缩短作业时间

  • 请参阅本手册的幻灯片32和33

    我用同样的方法得到了结果。唯一需要注意的是,当您有多个字段时,您需要分别创建fieldnamemin和fieldnamemax。

    省略减速机!! 使用配置将全局变量设置为score和key,然后在映射器中访问它,通过将全局变量用作max score和key的内存来简单选择max score
    它应该很简单。我想是吧

    在方法上不完整。如果有多个还原器,则每个还原器将在特定文件中发出最大值作为输出。同样,必须对其进行排序,并找出最大值。或者将减缩器的数量设置为1。我有一个问题:是否仍然应该有N个输出(因为每个减缩器都应该写出自己的结果)?即使Reducer的数量是1,我也不认为Reducer愿意接受所有的键值对。如果您只配置一个Reducer,这将非常有效。无需向下投票。@yongtw123如果只配置一个减速机,hashpartitioner可以将每个键/值对分配给这个减速机。因此,每个k/v对都将在那里可用。但Praveen是对的,它的可扩展性有限。但是对于两个文件来说,这是完全可以的。因为我需要处理的数据不是非常大,所以这个简单的解决方案对我来说是可行的。非常感谢。为了详细说明,您建议创建一个新的可写对象来存储filename和score,并在映射器和Reducer中使用它?我可以创建自定义可写类,但您能否提供一个示例,说明如何将此自定义可写对象与映射器和Reducer类一起使用?例如,在context.write()中我应该做什么?我发现这方面的资源非常模糊。您使用JobConf的setMapOutputValueClass。这里有一个很好的解释,或者使用OP中提到的方法将减速机的数量设置为1。但是,问题是只有一个减速机,这将是巨大数据的瓶颈。@PraveenSripati您可以使用组合器进行一些工作(为每个地图获取本地最大值)在减速机中最大限度地利用这些。这不是我的问题所在,但还是要感谢你的洞察力。有什么区别?我以为你想从所有输入文件中找出最大分数。这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦您有足够的评论,您就可以发表评论。好的。。。谢谢:-)(顺便说一句,笑脸是允许的还是不允许的?我是这个论坛的新手。)@DheerajVerma表情符号和笑脸是不鼓励的。此外,这不是一个论坛,而是一个有重点的问答网站。这一点很明显的一个主要方式是,每个帖子要么是一个问题,要么是一个直接的答案,要么是一条与该帖子相关的评论,要求澄清。与论坛不同的是,没有线性的帖子集,答案可以根据投票或活动重新排序。
     FileSplit fileSplit = (FileSplit)reporter.getInputSplit();
     String fileName = fileSplit.getPath().getName();