У нас есть система, которая получает архивы в указанном каталоге и на регулярной основе запускает задание mapreduce, которое открывает архивы и обрабатывает файлы внутри них. Чтобы избежать повторной обработки одних и тех же архивов в следующий раз, мы подключаемся к методу close() нашего RecReader, чтобы удалить его после чтения последней записи.Как удалить входные файлы после успешного mapreduce
Проблема с этим подходом (мы считаем) заключается в том, что если конкретное сопоставление терпит неудачу, следующий картограф, делающий еще одну попытку, обнаруживает, что исходный файл был удален считывателем записей с первого, и он бомбит , Мы думаем, что путь должен состоять в том, чтобы удержаться, пока все сопоставление и сокращение не завершится, а затем удалите входные архивы.
Это лучший способ сделать это?
Если да, то как мы можем получить список всех входных файлов, найденных системой из основной программы? (Мы не можем просто вычистить весь входной реж, новые файлы могут присутствовать)
т.е.
. . .
job.waitForCompletion(true);
(we're done, delete input files, how?)
return 0;
}
Я думаю, вы должны определить, что такое входной файл. Существует несколько способов прохождения входного пути к Mapper. Более того, то, что является входным путем, часто определяется используемым InputFormat. Мы также можем читать файлы с помощью HDFS apis в Mapper. Это входной файл? – zsxwing
Мы оценили ряд предложений, упомянутых здесь, но тот, который, кажется, наиболее обещает, включает в себя создание исторического PathFilter, который записывает все пути, которые он принимает в файл. При следующем запуске он открывает предыдущий файл (ы) и проверяет новые кандидаты для включения в набор ... и затем записывает другой файл истории. Более эффективный, чем поиск временных меток, поскольку в FileSystem не поступают вызовы. – Brian