[Hadoop] fusionar archivos de salida después de la fase de reducción


Answers

No, estos archivos no están fusionados por Hadoop. La cantidad de archivos que obtiene es la misma que la cantidad de tareas de reducción.

Si necesita eso como entrada para un próximo trabajo, entonces no se preocupe por tener archivos separados. Simplemente especifique todo el directorio como entrada para el próximo trabajo.

Si necesita los datos fuera del clúster, generalmente los fusiono en el extremo receptor cuando extraigo los datos del clúster.

Es decir algo como esto:

hadoop fs -cat /some/where/on/hdfs/job-output/part-r-* > TheCombinedResultOfTheJob.txt
Question

En mapreduce, cada tarea de reducción escribe su salida en un archivo llamado part-r-nnnnn donde nnnnn es una ID de partición asociada a la tarea de reducción. ¿ Asigna / reduce la fusión de estos archivos? Si es así, ¿cómo?




Los archivos part-r-nnnnn se generan después de la fase de reducción designada por 'r' en el medio. Ahora, el hecho es que si tiene un reductor en ejecución, tendrá un archivo de salida como part-r-00000. Si la cantidad de reductores es 2, entonces tendrá la parte-r-00000 y la parte-r-00001, y así sucesivamente. Mire, si el archivo de salida es demasiado grande para caber en la memoria de la máquina ya que ha sido diseñado para ejecutarse en Máquinas de productos , entonces el archivo se divide. Según el MRv1, tiene un límite de 20 reductores para trabajar en su lógica. Puede tener más, pero lo mismo debe personalizarse en los archivos de configuración mapred-site.xml . Hablando de tu pregunta; puede usar getmerge o puede establecer el número de reductores en 1 insertando la siguiente declaración en el código del controlador

job.setNumReduceTasks(1);

Espero que esto responda a su pregunta.




¿Por qué no utilizar un script de cerdo como este para fusionar archivos de partición?

stuff = load "/path/to/dir/*"

store stuff into "/path/to/mergedir"



Para archivos de texto solamente y HDFS como fuente y destino, use el siguiente comando:

hadoop fs -cat /input_hdfs_dir/* | hadoop fs -put - /output_hdfs_file

Esto concatenará todos los archivos en input_hdfs_dir y escribirá la salida en HDFS en output_hdfs_file . Tenga en cuenta que todos los datos serán devueltos al sistema local y luego nuevamente cargados en hdfs, aunque no se crean archivos temporales y esto sucede sobre la marcha utilizando UNIX pe.

Además, esto no funcionará con archivos que no sean de texto, como Avro, ORC, etc.

Para archivos binarios, puede hacer algo como esto (si tiene tablas Hive asignadas en los directorios):

insert overwrite table tbl select * from tbl

Dependiendo de su configuración, esto también podría crear más que archivos. Para crear un único archivo, establezca el número de reductores en 1 explícitamente usando mapreduce.job.reduces=1 o establezca la propiedad de la sección como hive.merge.mapredfiles=true .




. ¿Asigna / reduce la fusión de estos archivos?

No. No se fusiona.

Puede usar IdentityReducer para lograr su objetivo.

No realiza ninguna reducción y escribe todos los valores de entrada directamente en la salida.

public void reduce(K key,
                   Iterator<V> values,
                   OutputCollector<K,V> output,
                   Reporter reporter)
            throws IOException

Escribe todas las claves y valores directamente en la salida.

Eche un vistazo a las publicaciones relacionadas de SE:

hadoop: diferencia entre 0 reductor y reductor de identidad?