Генерация отдельных выходных файлов в Hadoop Streaming
Вопрос
Используя только маппер (скрипт Python) и без редуктора, как вывести отдельный файл с ключом в качестве имени файла для каждой строки вывода вместо длинных файлов вывода?
Решение
Вы можете либо записать текстовый файл в локальной файловой системе, используя файловые функции python, либо, если вы хотите использовать HDFS, использовать Thrift API .
Другие советы
Классы input и outputformat можно заменить с помощью параметров командной строки -inputformat и -outputformat.
Один пример того, как это сделать, можно найти в dumbo проекте , который представляет собой Python. рамки для написания потоковых заданий. Он имеет функцию записи в несколько файлов и внутренне заменяет выходной формат классом из своего родственного проекта, перья - fm.last.feathers.output.MultipleTextFiles.
Затем редуктор должен испускать кортеж в качестве ключа, причем первым компонентом кортежа является путь к каталогу, в который должны быть записаны файлы с парами ключ / значение. Там может быть несколько файлов, это зависит от количества редукторов и приложения.
Я рекомендую заглянуть в dumbo, он имеет много функций, которые облегчают написание программ Map / Reduce на Hadoop на python.
Можно ли заменить outputFormatClass при использовании потоковой передачи? В нативной реализации Java вы должны расширить класс MultipleTextOutputFormat и изменить метод, который называет выходной файл. Затем определите вашу реализацию как новый выходной формат с помощью метода setOutputFormat JobConf
Вы должны проверить, возможно ли это и в потоковой передаче. Я не знаю: - /