Hadoop: Как я могу объединить выходы редуктора в один файл?
Я знаю, что команда "getmerge" в оболочке может выполнять эту работу.
Но что мне делать, если я хочу объединить эти выходы после задания с помощью API HDFS для java?
То, что я действительно хочу, это один объединенный файл на HDFS.
Единственное, что я могу придумать, это начать после этого дополнительную работу.
спасибо!
Ответы
Ответ 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[])