【问题标题】:Very basic question about Hadoop and compressed input files关于 Hadoop 和压缩输入文件的非常基本的问题
【发布时间】:2014-09-18 17:18:51
【问题描述】:

我已经开始研究 Hadoop。如果我的理解是正确的,我可以处理一个非常大的文件,它会被分割到不同的节点上,但是如果文件被压缩,那么文件就不能被分割并且需要由单个节点处理(有效地破坏了在并行机器集群上运行 mapreduce)。

我的问题是,假设上述是正确的,是否可以将大文件手动拆分为固定大小的块或每日块,压缩它们,然后传递压缩输入文件的列表以执行 mapreduce?

【问题讨论】:

    标签: compression hadoop


    【解决方案1】:

    BZIP2 在 hadoop 中是可拆分的 - 它提供了非常好的压缩比,但从 CPU 时间和性能来看并不能提供最佳结果,因为压缩非常消耗 CPU。

    LZO 在 hadoop 中是可拆分的 - 利用 hadoop-lzo 您可以拆分压缩的 LZO 文件。您需要有外部 .lzo.index 文件才能并行处理。该库提供了以本地或分布式方式生成这些索引的所有方法。

    LZ4 在 hadoop 中是可拆分的 - 利用 hadoop-4mc 您可以拆分压缩的 4mc 文件。您不需要任何外部索引,您可以使用提供的命令行工具或通过 Java/C 代码在 hadoop 内部/外部生成档案。 4mc 可以在任何级别的速度/压缩比下在 hadoop LZ4 上使用:从达到 500 MB/s 压缩速度的快速模式到提供更高压缩比的高/超模式,几乎可以与 GZIP 相媲美。

    【讨论】:

    • LZ4 在 Hadoop 中不可拆分。 4mc是使用LZ4的文件格式,很像LZ4有自己的Frame格式,4mc文件格式是可拆分的。做出这种区分很重要:实际的 .lz4 文件在 Hadoop 中不可拆分:issues.apache.org/jira/browse/HADOOP-12990.
    【解决方案2】:

    考虑使用 LZO 压缩。是可拆分的。这意味着许多映射器可以处理一个大的 .lzo 文件。 Bzip2 可以做到这一点,但速度很慢。

    Cloudera 有一个关于它的introduction。对于 MapReduce,LZO 听起来在压缩率和压缩/解压缩速度之间取得了很好的平衡。

    【讨论】:

    • LZO 不能单独拆分。您必须运行单独的进程来索引 LZO 文件,以便压缩块与输入拆分正确对齐。看到页面最后一行的小宝贝:github.com/kevinweil/hadoop-lzo
    • @Luis 但请记住,LZO 已获得 GPL 许可,因此适用常规条款和条件。另一种选择是使用 Google 的 Snappy 压缩。 Google Snappy 默认打包在 Hadoop 中(我用的是 0.20.x),其他生态框架如 Apache Flume 等也默认很好理解。
    【解决方案3】:

    是的,你可以有一个大的压缩文件,或者多个压缩文件(多个文件用 -files 或 api 指定)。

    TextInputFormat 和后代应该自动处理 .gz 压缩文件。您还可以实现自己的InputFormat(它将输入文件分成块进行处理)和RecordReader(从块中一次提取一条记录)

    通用压缩的另一种替代方法可能是使用压缩文件系统(例如带有压缩补丁的 ext3、zfs、compFUSEd 或 FuseCompress...)

    【讨论】:

      【解决方案4】:

      您可以使用 bz2 作为您的压缩编解码器,这种格式也可以拆分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 2013-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多