关于Hadoop和压缩输入文件的基本问题

时间:2010-01-16 20:42:18

标签: compression hadoop

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

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

4 个答案:

答案 0 :(得分:6)

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相媲美。

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:1)

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