Hadoop Reducer: как я могу выводить в несколько каталогов, используя умозрительное выполнение?
У меня есть редуктор, который должен выводить результаты в разные каталоги, чтобы впоследствии мы могли использовать выходные данные в качестве входных данных для Hive в качестве секционированной таблицы. (Hive создает разделы на основе имени папки). Чтобы писать в эти места, в настоящее время мы не используем какую-либо инфраструктуру Hadoop для этого, мы просто пишем в разные места, так сказать, за спиной Hadoop. Другими словами, мы не используем API hadoop для вывода этих файлов.
У нас были проблемы с mapred.reduce.tasks.speculative.execution
установлен в true
, Я понимаю, что это так, потому что несколько попыток для одной и той же задачи пишут в одно и то же место.
Есть ли способ правильно использовать API Hadoop для вывода в несколько разных папок из одного и того же редуктора, чтобы я также мог использовать mapred.reduce.tasks.speculative.execution=true
? (Я знаю о MultipleOutputs, который я не уверен, поддерживает спекулятивное выполнение.)
Если так, есть ли способ сделать это и вывести на S3?
2 ответа
Hadoop обычно работает с умозрительным исполнением, создавая выходную папку для каждой попытки выполнения задачи (во временной подпапке фактического выходного каталога HDFS).
OutputCommitter
для OutputFormat
затем просто перемещает содержимое папки временной задачи в фактическую выходную папку при успешном выполнении задачи и удаляет другие папки временной задачи для тех, которые не удалось / прерваны (это поведение по умолчанию для большинства FileOutputFormat
s)
Так что для вашего случая, если вы пишете в папку вне папки вывода задания, вам нужно расширить / реализовать свой собственный обработчик вывода. Я бы следовал тем же принципам при создании файлов - включал полный идентификатор задачи (включая идентификатор попытки), чтобы избежать конфликтов имен при умозрительном выполнении. Как вы отслеживаете файлы, созданные в вашей работе, и управляете удалением в сценариях прерывания / сбоя, зависит только от вас (может быть, какой-то глобальный перебор файлов для идентификаторов задач?)
Возможно, вам будет интересно: http://hadoop.apache.org/docs/r2.3.0/api/org/apache/hadoop/mapreduce/lib/output/MultipleOutputs.html