在另一个映射器中使用reducer的输出

时间:2015-02-19 21:12:41

标签: hadoop mapreduce

我正在开发一个地图缩小应用程序,其中我必须得到月份开始和月份结束数据(不是必须在月份的第一个或最后一个日期,因为它们可以是假日或周六 - 周日)所以我将月份提取为键和相应的日期作为值,以便它按月聚合,我可以提取最大日期和最小日期。现在基于这个日期我需要使用该文件的其他属性。所以我想将一个reducer的输出指向另一个mapper。第二个映射器也将文件作为输入,因此我可以比较日期并相应地处理数据。有什么办法可以吗?

1 个答案:

答案 0 :(得分:1)

在高层次上,一种方法是实现两个一个接一个地运行的MapReduce作业:

作业1获取输入数据集,并使用单个reducer将每个月的开始日期和结束日期的键值对输出到单个文件。此输出文件将非常小。这可以类似于:

执行
 hadoop jar yourjob.jar YourFirstDriverClass /path/to/input /path/to/kvp/output

作业2采用相同的输入数据集,加上月份日期文件的路径,并输出处理结果。月份日期文件足够小,可以在每个映射器或缩减器的setup()调用中打开并加载到内存中。这可以类似于:

执行
hadoop jar yourjob.jar YourSecondDriverClass /path/to/input /path/to/kvp/output /path/to/final/output

在您的驱动程序main()中,您可以将对月份日期文件的引用传递给映射器和缩减器,类似于:

getConf().set('month.dates.file', args[1]);

在mapper或reducer setup()中,您可以加载月日期文件中的数据,类似于:

Configuration conf = context.getConfiguration();
Path path = new Path(conf.get('month.dates.file'));
FileSystem fs = FileSystem.get(conf);
BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path)));
String line = br.readLine();
while (line != null) {
    // Read your month dates from line into a data structure, e.g. a Map
    line = br.readLine();
}

将月份日期加载到mapper或reducer类的数据结构中,然后您可以为map()reduce()的每次调用访问它们,并相应地处理输入数据。

对于您要做的事情来说,这显然相当复杂,并且是为什么MapReduce抽象(例如Apache HiveApache PigApache Crunch)在实现工作中很受欢迎的一个很好的示例用更少的代码。