Hadoop: Как я могу объединить выходы редуктора в один файл? - программирование
Подтвердить что ты не робот

Hadoop: Как я могу объединить выходы редуктора в один файл?

Я знаю, что команда "getmerge" в оболочке может выполнять эту работу.

Но что мне делать, если я хочу объединить эти выходы после задания с помощью API HDFS для java?

То, что я действительно хочу, это один объединенный файл на HDFS.

Единственное, что я могу придумать, это начать после этого дополнительную работу.

спасибо!

4b9b3361

Ответ 1

Но что мне делать, если я хочу объединить эти выходы после задания с помощью API HDFS для java?

Угадай, потому что я не пробовал это сам, но я думаю, что метод, который вы ищете, FileUtil.copyMerge, который метод, который вызывает FsShell при запуске команды -getmerge. FileUtil.copyMerge принимает два объекта FileSystem в качестве аргументов - FsShell использует FileSystem.getLocal для извлечения целевой файловой системы, но я не вижу причин, по которым вы не могли бы использовать Path.getFileSystem для адресата для получения OutputStream

Тем не менее, я не думаю, что это сильно вас побеждает - слияние все еще происходит в локальной JVM; поэтому вы действительно не очень много сохраняете над -getmerge, а затем -put.

Ответ 2

Вы получаете один файл Out-put, устанавливая в своем коде один редуктор.

Job.setNumberOfReducer(1);

Будет работать для вашего требования, но дорогостоящий


ИЛИ


Static method to execute a shell command. 
Covers most of the simple cases without requiring the user to implement the Shell interface.

Parameters:
env the map of environment key=value
cmd shell command to execute.
Returns:
the output of the executed command.

org.apache.hadoop.util.Shell.execCommand(String[])