2010-12-13 12 views
6

Estoy recopilando registros con Flume para el HDFS. Para el caso de prueba, tengo archivos pequeños (~ 300kB) porque el proceso de recopilación de registros fue escalado para el uso real.¿Cuál es la forma más fácil de combinar bloques HDFS pequeños?

¿Hay alguna manera fácil de combinar estos archivos pequeños en archivos más grandes que están más cerca del tamaño de bloque HDFS (64 MB)?

+0

¿Desea combinar archivos para el almacenamiento, o para la asignación de trabajo mapreduce? – wlk

+0

¿Hay alguna manera de combinarlos desde la perspectiva de los cartógrafos? –

+0

Me gustaría combinarlos para el almacenamiento –

Respuesta

5

El GNU coreutils dividir podría hacer el trabajo.

Si los datos de origen son líneas - en mi caso son - y una línea es de alrededor de 84 bytes, a continuación, un HDFS bloquear 64MB podría contener alrededor de 800000 líneas:

hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 

o con --line-bytes opción:

hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 
+0

por cierto Pude imaginar un comando hadoop para hacer lo mismo, por lo que si alguien está interesado, la pregunta sigue abierta. –

3

Mi solución actual es escribir un trabajo de MapReduce que efectivamente no haga nada, mientras tenga un número limitado de reductores. Cada reductor genera un archivo, por lo que los gatos juntos. Puede agregar el nombre del archivo original en cada línea para ayudar a mostrar de dónde vino.

Todavía estoy interesado en saber si existe una forma estándar o probada de hacer esto de la que no tengo conocimiento.

+1

+1. Esa es también la solución que usé en el pasado. –

+0

mía también, esa es la mejor operación –

+0

Esto es lo que he hecho. Uso addInputPath en la clase SequenceFileInputFormat para agregar todos los archivos que deseo 'aplastar' y luego ejecutar el trabajo. – PhillipAMann

3

Deberías echar un vistazo a File Crusher abierto por media6degrees. Puede que esté un poco desactualizado, pero puede descargar la fuente y hacer los cambios y/o contribuir. El JAR y el origen están en: http://www.jointhegrid.com/hadoop_filecrush/index.jsp

Esto es esencialmente una técnica de reducción de mapa para fusionar archivos pequeños.

Cuestiones relacionadas