我在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
)
我也试过在一个文件上运行,同样的错误。
有什么建议吗?
答案 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文件。