如何将 Hadoop 目录压缩为单个 gzip 文件?

Posted

技术标签:

【中文标题】如何将 Hadoop 目录压缩为单个 gzip 文件?【英文标题】:How to compress Hadoop directory to single gzip file? 【发布时间】:2017-05-29 14:00:17 【问题描述】:

我有一个目录,其中包含许多我想从 hdfs 压缩和导出到 fs 的文件和子目录。

我遇到了这个问题 - Hadoop: compress file in HDFS? ,但它似乎只与文件相关,并且使用 hadoop-streaming 和 GzipCodec 没有让我在目录方面取得成功。

为什么将 HDFS 文件夹压缩为单个 gzip 文件最有效的方法是什么? 提前致谢。

【问题讨论】:

即使在 Unix 的 FS 上,你也不能 gzip 一个目录。您需要先将其转换为tar/har 或类似的名称,然后执行压缩。 @philantrovert 当然可以,但是您对如何操作有什么建议吗? 我建议使用 apache commons Api 编写一个 Java 程序。它有像TarArchiveOutputStream 这样的类,你可以查看它们。 【参考方案1】:

您将需要一个库或滚动您自己的代码来将目录结构中的文件制作成 tar 流。您可以使用 zlib 压缩 tar 流以制作标准的 .tar.gz 文件。

如果您想合并多个此类任务的结果,我可以在此处提供的两个花絮是:1)您可以连接 gzip 流以生成有效的 gzip 流,以及 2)您可以连接 tar 流以生成有效的 tar 流如果您从非最终 tar 流中删除最后的 1024 个零字节。

【讨论】:

【参考方案2】:

对于那些不想使用 hadoop-streaming 或任何 MapReduce 作业的人来说,对于一个快速而肮脏的解决方案,我使用了FUSE,然后将其作为传统文件系统执行操作。 请注意,您可能不想将其用作永久解决方案,只是为了快速获胜:) 延伸阅读: * https://hadoop.apache.org/docs/r1.2.1/streaming.html * http://www.javased.com/index.php?api=org.apache.hadoop.io.compress.GzipCodec

【讨论】:

以上是关于如何将 Hadoop 目录压缩为单个 gzip 文件?的主要内容,如果未能解决你的问题,请参考以下文章

linux文将于目录的压缩和解压缩命令:gzip压缩文件

为啥 hadoop 不能拆分一个大文本文件,然后使用 gzip 压缩拆分?

如何连接两个或多个 gzip 文件/流

Linux笔记之压缩解压命令

1. gzip, bzip2 能否直接压缩目录呢?

如何在不使用 map reduce 的情况下使用 lzo 压缩写入 hadoop hdfs