java hadoop merge mapreduce hdfs

java - Hadoop: ¿Cómo puedo combinar las salidas del reductor en un solo archivo?



merge mapreduce (2)

Esta pregunta ya tiene una respuesta aquí:

Sé que el comando "getmerge" en shell puede hacer este trabajo.

Pero, ¿qué debo hacer si quiero combinar estas salidas después del trabajo mediante la API de HDFS para Java?

Lo que realmente quiero es un solo archivo fusionado en HDFS.

Lo único en lo que puedo pensar es comenzar un trabajo adicional después de eso.

¡Gracias!


Pero, ¿qué debo hacer si quiero combinar estas salidas después del trabajo mediante la API de HDFS para Java?

Adivinando, porque no lo he intentado yo mismo, pero creo que el método que está buscando es FileUtil.copyMerge , que es el método que invoca FsShell cuando ejecuta el comando -getmerge . FileUtil.copyMerge toma dos objetos FileSystem como argumentos: FsShell usa FileSystem.getLocal para recuperar el FileSystem de destino, pero no veo ninguna razón por la que no pueda usar Path.getFileSystem en el destino para obtener un OutputStream

Dicho esto, no creo que te gane mucho: la fusión todavía está ocurriendo en la JVM local; así que en realidad no estás ahorrando mucho sobre -getmerge seguido de -put .


Usted obtiene un solo archivo de salida al establecer un solo Reductor en su código.

Job.setNumberOfReducer(1);

Trabajará para su requerimiento, pero costoso

O

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[])