我遇到了一个有趣的情况,现在正在寻找如何做到这一点有意。在本地单节点设置中,我从终端屏幕同时运行了两个作业。我的两个作业使用相同的缩减器,它们只是在Map函数(聚合键-group by)上有区别,两个作业的输出都被写入第一个作业的输出(虽然第二个作业确实创建了自己的文件夹,但它是空的)。我正在研究的是提供跨不同级别的汇总聚合,这种行为对我来说很有趣,两个不同级别的聚合输出可以在一个文件中使用(也可以完全排序)。
我的问题是如何在真正的hadoop集群中实现相同的功能,在hadoop集群中,我们有多个数据节点,即以编程方式启动多个作业,所有作业都访问相同的输入文件,Map不同的数据,但使用相同的缩减器,并且输出在一个文件中可用,而不是在5个不同的输出文件中可用。
请告知。
在我决定提问之前,我正在查看reduce阶段之后的合并输出文件。
谢谢并致以亲切的问候,
莫伊兹·艾哈迈德。
2条答案
按热度按时间daolsyd01#
当不同的Map器使用相同的输入文件(换句话说,使用相同的数据结构)时,所有这些不同Map器的源代码可以放入单个Map器实现的不同方法中,并使用上下文中的参数来决定要调用哪些Map函数。在优点方面,您只需要开始一个map reduce作业。例如伪代码:
当然,它可以通过接口等更优雅地实现。
在作业设置中,只需添加:
正如praveen sripati所提到的,拥有一个输出文件会迫使您只拥有一个reducer,这可能对性能不利。当您从hdfs下载部件**文件时,可以始终将它们连接起来。例子:
2ekbmq322#
通常每个reducer任务在hdfs中生成一个单独的文件,以便reduce任务可以并行运行。如果要求reduce任务有一个o/p文件,那么将作业配置为有一个reducer任务。可以使用mapred.reduce.tasks属性(默认值为1)配置缩减器的数量。这种方法的缺点是只有一个减速机可能是完成工作的瓶颈。
另一种选择是使用其他输出格式,它允许多个reducer像dbouputformat一样同时写入同一个接收器。作业处理完成后,可以将数据库的结果导出到平面文件中。这种方法可以使多个reduce任务并行运行。
另一种选择是合并op中提到的o/p文件。因此,根据每种方法的优缺点和要处理的数据量,可以选择其中一种方法。