19

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

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

4

4 回答 4

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

于 2014-09-18T09:18:51.243 回答
5

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

Cloudera对此进行了介绍。对于 MapReduce,LZO 听起来在压缩比和压缩/解压缩速度之间取得了很好的平衡。

于 2010-01-30T09:42:09.303 回答
3

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

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

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

于 2010-01-16T20:58:12.007 回答
1

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

于 2010-01-22T09:15:33.670 回答