Java hadoop MapReduce:从映射器的输出中查找最大键值对
这听起来很简单,但使用MapReduce似乎并不那么简单 我有N个文件,其中每个文件只有一行文本。我希望映射器输出键值对,如Java hadoop MapReduce:从映射器的输出中查找最大键值对,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,这听起来很简单,但使用MapReduce似乎并不那么简单 我有N个文件,其中每个文件只有一行文本。我希望映射器输出键值对,如,其中“score”是从文本行计算出来的整数。作为旁注,我使用下面的代码片段来实现这一点(希望它是正确的) 假设映射器正确执行其工作,它应该输出N个键值对。 现在的问题是如何编程Reducer以输出具有最大“分数”的一个键值对 据我所知,Reducer仅适用于共享同一密钥的键值对。由于这个场景中的输出都有不同的键,我猜在Reduce步骤之前应该做些什么。或者应该完全省略Re
Setup()在同一reduce任务中的所有reduce调用之前调用一次。Cleanup()在同一个reduce任务中的最后一次reduce调用后调用。因此,如果您有多个reducer,Setup()和cleanup()方法将在每个reduce任务上分别调用。您可以返回文件名和分数作为值,只需从映射器返回任何常量作为键 文件1有10123,23233个 文件2有1,3,561234个 文件3有613435678个
以下是从所有输入文件中查找最大数量的方法
对上述方法的一些看法
它应该很简单。我想是吧 在方法上不完整。如果有多个还原器,则每个还原器将在特定文件中发出最大值作为输出。同样,必须对其进行排序,并找出最大值。或者将减缩器的数量设置为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();