Descomprime archivos usando la transmisión hadoop
zip hadoop-streaming (4)
Hadoop puede leer archivos comprimidos en formato gzip, pero eso es diferente del formato zip. Hadoop no puede leer archivos zip AFAIK.
Tengo muchos archivos en HDFS, todos ellos en un archivo zip con un archivo CSV dentro. Intento descomprimir los archivos para poder ejecutar un trabajo de transmisión en ellos.
Lo intenté:
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar /
-D mapred.reduce.tasks=0 /
-mapper /bin/zcat -reducer /bin/cat /
-input /path/to/files/ /
-output /path/to/output
Sin embargo, recibo un error (el subprocess failed with code 1
). También intenté ejecutarlo en un solo archivo, el mismo error.
¿Algún consejo?
La causa principal del problema es: obtienes muchas (texto) informaciones de hadoop (antes de que puedas recibir los datos).
por ejemplo, hdfs dfs -cat hdfs: //hdm1.gphd.local: 8020 / hive / gphd / warehouse / my.db / my / part-m-00000.gz | zcat | wc -l NO funcionará tampoco - con el mensaje de error "gzip: stdin: not in gzip format".
Por lo tanto, debe omitir esta información "innecesaria". En mi caso, tengo que omitir 86 líneas
Por lo tanto, mi comando de una línea será este (para contar los registros): hdfs dfs -cat hdfs: //hdm1.gphd.local: 8020 / hive / gphd / warehouse / my.db / my / part-m-00000.gz | tail -n + 86 | zcat | wc -l
Nota: esta es una solución alternativa (no es una solución real) y muy fea, debido a "86", pero funciona bien :)
Después de experimentar, descubrí que si realiza esta modificación en la transmisión de hadoop, obtendrá todos sus archivos comprimidos descomprimidos en un nuevo directorio. Los nombres de archivo están todos perdidos (renombrado como el nombre típico de parte XXXX), pero esto funcionó para mí.
Supongo que esto funciona porque hadoop descomprime automáticamente los archivos comprimidos bajo el capó, y cat solo hace eco de esa salida descomprimida
hadoop jar /usr/iop/4.2.0.0/hadoop-mapreduce/hadoop-streaming.jar /
-D mapred.reduce.tasks=0 /
-mapper /bin/cat /
-input /path-to-gzip-files-directory /
-output /your-gunzipped-directory
Una forma simple de descomprimir / descomprimir un archivo dentro de HDFS por cualquier razón
hadoop fs -text /hdfs-path-to-zipped-file.gz | hadoop fs -put - /hdfs-path-to-unzipped-file.txt