【问题标题】:Hadoop gzip compressed filesHadoop gzip 压缩文件
【发布时间】:2011-04-12 04:00:17
【问题描述】:

我是 hadoop 新手,正在尝试处理*转储。这是一个 6.7 GB gzip 压缩的 xml 文件。我读到 hadoop 支持 gzip 压缩文件,但只能由映射器在单个作业上处理,因为只有一个映射器可以解压缩它。这似乎对处理施加了限制。有替代方案吗?比如将 xml 文件解压并拆分成多个块,然后用 gzip 重新压缩它们。

我从http://researchcomputing.blogspot.com/2008/04/hadoop-and-compressed-files.html读到了有关hadoop gzip的信息

感谢您的帮助。

【问题讨论】:

    标签: java algorithm data-structures hadoop mapreduce


    【解决方案1】:

    由于该编解码器的工作方式,使用 GZIP 编解码器压缩的文件无法拆分。 Hadoop中的单个SPLIT只能由单个mapper处理;所以单个 GZIP 文件只能由单个 Mapper 处理。

    至少有三种方法可以绕过这个限制:

    1. 作为预处理步骤:解压缩文件并使用可拆分编解码器 (LZO) 重新压缩
    2. 作为预处理步骤:解压缩文件,分成较小的集合并重新压缩。 (See this)
    3. 将此补丁用于 Hadoop(我编写的),它允许解决此问题:Splittable Gzip

    HTH

    【讨论】:

    • 我们不是也需要维护每个拆分的xml文件的完整性吗?
    • 是的,这就是使用的 RecordReader 实例的任务。
    • 全文件 gzipping 确实如此,但 Hadoop 可以使用块 gzipping 来解决这个问题。请参阅 Ted 的回答。
    • @jhclark:最初的问题是关于一个 gzip 压缩的 XML 文件。 Gzipping 块仅在使用组合多个(gzipped)块的不同文件格式时是一种选择。这不是 Hadoop 的特性,而是文件格式的特性。
    【解决方案2】:

    这是对 HDFS 最大的误解之一。

    是的,压缩为 gzip 文件的文件不能被 MapReduce 拆分,但这并不意味着 GZip 作为编解码器在 HDFS 中没有价值并且不能拆分。

    GZip 作为编解码器可用于 RCFiles、Sequence Files、Arvo Files 和更多文件格式。当在这些可拆分格式中使用 Gzip 编解码器时,您可以从 Gzip 和可拆分组件中获得出色的压缩和相当好的速度。

    【讨论】:

      【解决方案3】:

      由于编解码器的限制,GZIP 文件不能以任何方式进行分区。 6.7GB 真的不算大,所以只需在单机上解压(不到一个小时),然后将 XML 复制到 HDFS 上。然后您可以在 Hadoop 中处理 Wikipedia XML。

      Cloud9 包含一个 WikipediaPageInputFormat 类,您可以使用它来读取 Hadoop 中的 XML。

      【讨论】:

        【解决方案4】:

        【讨论】: