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

Lui*_*mon 19 compression hadoop

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

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

Car*_*das 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相媲美.

  • LZ4不能在Hadoop中拆分.4mc是使用LZ4的文件格式,很像LZ4有自己的Frame格式,4mc文件格式是可拆分的.它的重要的是使这种区别:实际.lz4文件未在Hadoop的可分裂:https://issues.apache.org/jira/browse/HADOOP-12990. (3认同)

小智 5

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

Cloudera 介绍了它.对于MapReduce,LZO在压缩比和压缩/解压缩速度之间取得了良好的平衡.

  • LZO不是单独拆分的.您必须运行单独的进程来索引LZO文件,以便压缩块与输入拆分正确对齐.看看页面最后一行的小宝贝:https://github.com/kevinweil/hadoop-lzo (3认同)
  • @Luis但请记住,LZO已获得GPL许可,因此适用常规条款和条件.另一种选择是使用谷歌的Snappy压缩.[Google Snappy](http://code.google.com/p/snappy/)它默认打包与Hadoop(我使用0.20.x)和其他生态系统框架,如Apache Flume等,默认情况下也很好理解. (3认同)

jsp*_*cal 3

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

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

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