当前位置: 首页 > 知识库问答 >
问题:

在Hadoop MapReduce中,有可能有多个不同映射器的多个输入吗?

张姚石
2023-03-14

在Hadoop MapReduce中是否有可能使用多个不同的映射器有多个输入?每个映射器类都在一组不同的输入上工作,但它们都会发出由同一个减速器使用的键值对。请注意,我不是在这里谈论链接映射器,我是在谈论并行运行不同的映射器,而不是顺序运行。

共有2个答案

澹台俊材
2023-03-14

我将用一个问题、两个答案和一个反建议来回答你的问题。

问题是:与串行运行异构映射作业相比,并行运行异构映射任务有什么好处,可以输出可以适当混洗的同质结果?这样做是为了避免两次传递相同的记录,一次使用身份图?

第一个答案是同时安排两个仅映射器作业,每个作业位于队列的一半上(或任何与输入数据大小最匹配的比率),输出同构结果,然后执行联接的仅化简器作业。

第二个答案是创建一个自定义InputFormat,它能够识别和转换异构输入的两种风格。这非常丑陋,但它将允许您避免第一个建议的不必要的身份映射。

反建议是不要使用Chris答案中已弃用的Hadoop API。Hadoop非常年轻,但API正在围绕“新”风格稳定下来。您最终将达到版本锁定。

闽高峯
2023-03-14

这称为连接。

您想在mapred.*中使用映射器和还原器软件包(较旧,但仍受支持)。较新的包(mapreduce.*)只允许一个映射器输入。使用mapred软件包,您可以使用MultipleInputs类来定义连接:

MultipleInputs.addInputPath(jobConf, 
                     new Path(countsSource),       
                     SequenceFileInputFormat.class, 
                     CountMapper.class);
MultipleInputs.addInputPath(jobConf, 
                     new Path(dictionarySource), 
                     SomeOtherInputFormat.class, 
                     TranslateMapper.class);

jobConf.setJarByClass(ReportJob.class);
jobConf.setReducerClass(WriteTextReducer.class);

jobConf.setMapOutputKeyClass(Text.class);
jobConf.setMapOutputValueClass(WordInfo.class);

jobConf.setOutputKeyClass(Text.class);
jobConf.setOutputValueClass(Text.class);
 类似资料:
  • reducer可以接受多个输入吗?两个映射器的键相同,但值类型不同。第一个是输出(text,floatwritable)的MapReduce程序,其中floatwritable是值类型,text是键。第二个是一个输出(文本,歌曲)的映射器,其中歌曲是实现可写的自定义数据类型。我想要一个缩减器,在运行计算的同时,获取早期map reduce和第二个mapper的输出。我认为第一个MapReduce程

  • 在java中,我会使用: 多输入.add输入路径(conf, path, inputFormatClass, 映射器类) 以添加多个输入,并为每个输入使用不同的映射器。 现在我正在使用python在hadoop中编写一个流作业,可以做类似的工作吗?

  • 我试图在我的Spring应用程序中实现API版本控制。 所以我想做这样的事情api_url/{版本}/{参数} 假设我已经更改了一个endpoint函数,那么我可以将新函数映射到新版本的新url。但是我希望其他未更改的函数映射到两个版本的url,比如API _ URL/{旧版本}/{旧参数}和API _ URL/{新版本}/{旧参数} 因此,如果我能够实现这样的东西,它将帮助我避免在Java类中重

  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • Tasklet类是在以下三个方法中定义的: 面临的问题:该文件包含150,000条记录,因此,在doExecute()方法之后,它将150,000条数据记录存储在列表中。在doAfterStep()方法中,它试图将列表中的所有150,000条记录保存到数据库中,从而导致事务超时错误。 解决办法: 在这个阶段,我们如何在这里发送2个实体,Entity2和entity3?

  • 问题内容: 我可以使用ajax调用将数据发送到多个页面吗?我不想为此使用另一个ajax调用。 样例代码: 问题答案: 您无法在多个页面中对1个请求使用相同的代码。 但是您可以发送2个请求。它可以通过复制粘贴您的ajax代码或构建一个获取URL并使用此URL发送请求的函数来完成