使用hadoop流解压缩文件

时间:2013-03-06 19:58:18

标签: hadoop zip hadoop-streaming

我在HDFS中有很多文件,所有这些文件都是一个包含一个CSV文件的zip文件。 我正在尝试解压缩文件,以便我可以在它们上运行流媒体作业。

我试过了:

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

然而我收到错误(subprocess failed with code 1) 我也试过在一个文件上运行,同样的错误。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

问题的根本原因是:你从hadoop获得了很多(文本)信息(在你收到数据之前)。

e.g。 hdfs dfs -cat hdfs://hdm1.gphd.local:8020 / hive / gphd / warehouse / my.db / my / part-m-00000.gz | zcat | wc -l也不会工作 - 使用" gzip:stdin:不是gzip格式"错误信息。

因此你应该跳过这个"不必要的"相关信息。在我的情况下,我必须跳过86行

因此我的一行命令就是这个(用于计算记录): hdfs dfs -cat hdfs://hdm1.gphd.local:8020 / hive / gphd / warehouse / my.db / my / part-m-00000.gz | tail -n + 86 | zcat | wc -l <​​/ p>

注意:这是一种解决方法(不是真正的解决方案)而且非常难看 - 因为&#34; 86&#34; - 但它工作正常:))

答案 1 :(得分:0)

出于某种原因在HDFS中解压缩/解压缩文件的简单方法

hadoop fs -text /hdfs-path-to-zipped-file.gz | hadoop fs -put - /hdfs-path-to-unzipped-file.txt

答案 2 :(得分:0)

经过实验,我发现如果对hadoop流进行此修改,您将在新目录中解压缩所有gzip压缩文件。文件名全部丢失(重命名为典型的部分-XXXX名称),但这对我有用。

我推测这是有效的,因为hadoop自动解压缩引擎盖下的gzip压缩文件,而cat只是回应那个解压缩的输出

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

答案 3 :(得分:-2)

Hadoop可以读取以gzip格式压缩的文件,但这与zip格式不同。 Hadoop无法读取AFAIK的zip文件。