使用hadoop流媒体解压文件
我有很多HDFS文件,它们都是一个zip文件,里面有一个CSV文件。 我正在尝试解压这些文件,以便在它们上运行流媒体作业 我试过:使用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
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存档,它可以有多个压缩成员。