使用Hadoop Streaming解压文件

4

我在HDFS中有很多文件,它们都是一个包含一个CSV文件的压缩文件。

我想要解压这些文件,以便可以对它们运行流作业。

我尝试了:

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

然而我遇到了一个错误(子进程代码1失败)。 我也尝试在单个文件上运行,同样出现了错误。 有什么建议吗?
4个回答

1
问题的根本原因是:在接收数据之前,您从hadoop(文本)中获取了许多信息。例如,使用“hdfs dfs -cat hdfs://hdm1.gphd.local:8020/hive/gphd/warehouse/my.db/my/part-m-00000.gz | zcat | wc -l”进行计数将不起作用,因为出现“gzip:stdin:not in gzip format”的错误消息。因此,您应该跳过这些“不必要”的信息。在我的情况下,我必须跳过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。注意:这是一个解决方法(而非真正的解决方案),非常丑陋,因为它有一个“86”,但它运行良好 :)

0
经过一番尝试,我发现如果对Hadoop Streaming进行这种修改,你就可以在一个新目录中得到所有未压缩的gzipped文件。虽然文件名都丢失了(被重命名为典型的part-XXXX名称),但这对我来说是有效的。
我猜测这是因为Hadoop在幕后自动解压缩gzipped文件,而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

0

在HDFS中解压缩/解压文件的简单方法,无论出于什么原因

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

这是针对一个经过gzip压缩的单个文件,而不是一个可以包含多个压缩成员的Zip归档文件。 - Ken Williams

-2
Hadoop可以读取以gzip格式压缩的文件,但这与zip格式不同。据我所知,Hadoop无法读取zip文件。

这是无关紧要的 - 映射器任务解码Zip文件,Hadoop不需要了解其格式。 - Ken Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接