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