2010-01-16 18 views
19

He empezado a buscar en Hadoop. Si mi entendimiento es correcto, podría procesar un archivo muy grande y se dividiría entre diferentes nodos; sin embargo, si el archivo está comprimido, entonces el archivo no se podría dividir y debería procesarse por un solo nodo (lo que efectivamente destruiría la ventaja de ejecutando un mapreduce ver un cluster de máquinas paralelas).Pregunta muy básica sobre Hadoop y archivos de entrada comprimidos

Mi pregunta es, suponiendo que lo anterior sea correcto, ¿es posible dividir un archivo grande manualmente en trozos de tamaño fijo o trozos diarios, comprimirlos y luego pasar una lista de archivos de entrada comprimidos para realizar un mapreduce?

Respuesta

3

sí, podría tener un archivo comprimido grande o varios archivos comprimidos (varios archivos especificados con -files o la API).

TextInputFormat y sus descendientes deberían manejar automáticamente los archivos comprimidos .gz. también se puede poner en práctica su propia (que dividir el archivo de entrada en trozos para su procesamiento) y RecordReader (que extraen un registro a la vez desde el trozo)

otra alternativa para copmression genérica podría ser el uso de un sistema de archivos comprimido InputFormat (como ext3 con el parche de compresión, zfs, compFUSEd o FuseCompress ...)

+0

Gracias que suena genial. –

1

Puede usar bz2 como su códec de compresión, y este formato también se puede dividir.

5

Considere el uso de compresión LZO. Es divisible. Eso significa que un gran archivo .lzo puede ser procesado por muchos mapeadores. Bzip2 puede hacer eso, pero es lento.

Cloudera tenía introduction al respecto. Para MapReduce, LZO suena un buen equilibrio entre la relación de compresión y la velocidad de compresión/descompresión.

+3

LZO no se puede dividir solo. Debe ejecutar un proceso separado para indexar los archivos LZO de modo que los bloques comprimidos se alineen correctamente con divisiones de entrada. Vea al pequeño bebé de una línea al final de la página: https://github.com/kevinweil/hadoop-lzo – jerluc

+3

@Luis Pero tenga en cuenta que LZO tiene licencia GPL, por lo que se aplican los términos y condiciones habituales. Otra alternativa será usar la compresión Snappy de Google. [Google Snappy] (http://code.google.com/p/snappy/) Se envasa de forma predeterminada con Hadoop (utilizo 0.20.x) y otros marcos de ecosistema como Apache Flume, etc. también lo entienden bien por defecto. – arcamax

6

BZIP2 es divisible en hadoop - que ofrece muy buena relación de compresión, sino de tiempo de CPU y actuaciones no está proporcionando resultados óptimos, ya que la compresión es muy consumidora de la CPU.

lzo es divisible en hadoop - aprovechando hadoop-lzo archivos LZO que haya divisible comprimido. Necesita tener archivos .lzo.index externos para poder procesar en paralelo. La biblioteca proporciona todos los medios para generar estos índices en forma local o distribuida.

LZ4 es divisible en hadoop - aprovechando hadoop-4mc archivos 4MC que haya divisible comprimido. No necesita ninguna indexación externa, y puede generar archivos con la herramienta de línea de comandos proporcionada o con el código Java/C, dentro/fuera de hadoop. 4mc está disponible en hadoop LZ4 en cualquier nivel de relación velocidad/compresión: desde el modo rápido que alcanza una velocidad de compresión de 500 MB/s hasta modos alto/ultra que proporciona una mayor relación de compresión, casi comparable con GZIP one.

+3

LZ4 NO se puede dividir en Hadoop. El 4mc es un formato de archivo que usa LZ4, al igual que LZ4 tiene su propio formato de Marco, y el formato de archivo de 4 mc es divisible. Es importante hacer esta distinción: un archivo real .lz4 no se puede dividir en Hadoop: https://issues.apache.org/jira/browse/HADOOP-12990. –

Cuestiones relacionadas