【发布时间】:2013-10-01 19:18:16
【问题描述】:
我们有一个系统,它接收指定目录中的档案,并定期启动一个 mapreduce 作业,该作业打开档案并处理其中的文件。为了避免下次重新处理相同的档案,我们在 RecordReader 上使用 close() 方法,以便在读取最后一个条目后将其删除。
这种方法的问题(我们认为)是,如果一个特定的映射失败,下一个对其进行再次尝试的映射器会发现原始文件已被记录读取器从第一个文件中删除,并且它会被炸毁。我们认为要走的路是等到所有映射和归约完成,然后删除输入档案。
这是最好的方法吗?
如果是这样,我们如何从主程序中获取系统找到的所有输入文件的列表? (我们不能只清理整个输入目录,可能会出现新文件)
即:
. . .
job.waitForCompletion(true);
(we're done, delete input files, how?)
return 0;
}
【问题讨论】:
-
我认为你应该定义什么是输入文件。有几种方法可以将输入路径传递给 Mapper。更重要的是,什么是输入路径通常由您使用的 InputFormat 决定。我们还可以在 Mapper 中通过 HDFS api 读取文件。是输入文件吗?
-
我们已经评估了这里提到的一些建议,但似乎最有希望的建议是创建一个历史 PathFilter,它将它接受的所有路径写出到文件中。下次运行时,它会打开以前的文件并检查新的候选文件是否包含在集合中……然后写出另一个历史文件。由于不调用文件系统,因此比时间戳查找更高效。
标签: hadoop delete-file recordreader