提问者:小点点

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


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


共1个答案

匿名用户

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

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

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

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

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

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

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

然后,在映射器或简化器set()中,您可以从月份日期文件中加载数据,类似于:

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();
}

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

对于您正在尝试做的事情来说,这显然相当复杂,并且是为什么Apache Hive、Apache Pig和Apache Crunch等MapReduce抽象在以更少的代码实现作业时很受欢迎的一个很好的例子。