Я пытаюсь уменьшить задержку задания mapreduce в своем потоке данных и хочу постоянно следить за выводом файла редуктора part-xxxx, используя hdfs-api, вместо того, чтобы читать его после завершения задания. но мне интересно, это безопасно для работы с хаупом?
Могу ли я прочитать вывод редуктора, когда редуктор все еще работает?
Ответы (1)
Когда вы используете форматы вывода на основе FileOutputFormat
(текст, файл последовательности и т. д.), они используют общий FileOutputCommitter
, который отвечает за фиксацию или отмену вывода редукторов, когда он завершается успешно / не удается и т. д.
За кулисами, когда ваш редьюсер записывает вывод, он записывается в подкаталог _temporary указанного вами выходного каталога HDFS.
Когда редюсер завершится, средство отслеживания заданий обозначит один конкретный экземпляр этой попытки редюсера (помните, что при спекулятивном выполнении попытка редюсера может выполняться 1 или более раз) как окончательный результат и подаст сигнал коммиттеру вывода зафиксировать эту версию выход редуктора (другие попытки будут прерваны).
Когда коммиттер вывода фиксирует вывод попытки, он просто перемещает файл part-r-xxxxx из временного каталога попытки в назначенный каталог вывода.
Имея это в виду, когда вы видите файлы part-r-* в выходном каталоге, они полностью записаны и их можно безопасно отслеживать. Таким образом, в этом смысле вы можете получить скачок при обработке вашего вывода редуктора (скажем, у вас есть 10 000 редукторов, работающих на кластере из 1000 слотов редуктора), но вы не можете запланировать другое задание map/reduce для обработки этого вывода, так как только вывод редуктора, который имеет Готово будет использоваться в следующем задании уменьшения карты (когда задание будет отправлено, оно будет рассматривать только те файлы, которые в настоящее время доступны в качестве входных данных, оно не будет постоянно сканировать новые файлы, которые появляются после отправки задания).
Вы также должны учитывать, что ваша работа может на самом деле завершиться ошибкой в последних нескольких редюсерах - в этом случае вы все еще хотите с нетерпением обработать выходные данные редуктора тех, которые были завершены до сбоя, или вы хотите обрабатывать только в том случае, если все задание завершится (что имеет смысл для большинства вакансий).