使用hadoop流媒体解压文件

使用hadoop流媒体解压文件,hadoop,zip,hadoop-streaming,Hadoop,Zip,Hadoop Streaming,我有很多HDFS文件,它们都是一个zip文件,里面有一个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/o

我有很多HDFS文件,它们都是一个zip文件,里面有一个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
) 我也试着在一个文件上运行,同样的错误


有什么建议吗?

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

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

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

问题的根本原因是:在接收数据之前,您从hadoop获得了许多(文本)信息

e、 g.hdfs dfs-cathdfs://hdm1.gphd.local:8020/hive/gphd/warehouse/my.db/my/part-m-00000.gz | zcat | wc-l也将不起作用-出现“gzip:stdin:NOT in gzip格式”错误消息

因此,您应该跳过这个“不必要的”信息。就我而言,我必须跳过86行

因此,我的单行命令如下(用于计算记录): hdfs dfs-cathdfs://hdm1.gphd.local:8020/hive/gphd/warehouse/my.db/my/part-m-00000.gz|tail-n+86|zcat|wc-l


注意:这是一个变通方法(不是真正的解决方案),非常难看-因为“86”-但它工作得很好:)

在尝试之后,我发现如果您对hadoop streaming进行此修改,您将在一个新目录中解压所有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

这是不相关的-映射器任务解码Zip文件,Hadoop不需要知道任何关于其格式的信息。这是针对Gzip压缩的单个文件,而不是Zip存档,它可以有多个压缩成员。