Наличие нескольких задач сокращения собирает один файл HDFS в качестве вывода - PullRequest
0 голосов
/ 11 февраля 2019

Существует ли какой-либо API низкого уровня в Hadoop, позволяющий нескольким задачам сокращения, выполняющимся на разных машинах, собирать одну HDFS в качестве результата их вычислений?

Примерно так: в начале задания создается файл-заглушка HDFS, затем каждый редуктор создает в качестве вывода переменное количество блоков данных и назначает их этому файлу в соответствии с определенным порядком

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Ответ - нет, это было бы ненужным осложнением для редкого варианта использования.

Что вы должны сделать

опция 1 - добавить код в конец вашей команды hadoop

int result = job.waitForCompletion(true) ? 0 : 1;

if (result == 0) { // status code OK
    // ls job output directory, collect part-r-XXXXX file names
    // create HDFS readers for files
    // merge them in a single file in whatever way you want
}

Все необходимые методыприсутствует в hadoop FileSystem api.

option 2 - добавить задание для объединения файлов

Вы можете создать общее задание hadoop, которое будет принимать имя каталога в качестве ввода и передавать все как-на единственном редукторе, который объединит результаты в один выходной файл.Вызовите эту работу в конвейере вместе с вашей основной работой.

Это будет работать быстрее при больших входах.

0 голосов
/ 11 февраля 2019

Если вы хотите объединить выходной файл в локальный файл, вы можете использовать команду getoopge из hadoop, чтобы объединить несколько файлов задач сокращения в один локальный выходной файл, ниже приведена команда для одного и того же.

hadoop fs -getmerge /output/dir/on/hdfs/ /desired/local/output/file.txt
...