hadoop策略与大gzip文件

时间:2013-03-27 17:56:18

标签: hadoop gzip hdfs

我将在hadoop中复制许多压缩为gzip的大型weblogs文件。 我需要在这些文件上运行许多map / reduce。

据我了解,文件只能运行一个Map / Reduce。 就我而言,这是不可接受的,因为我们需要尽快完成这些工作。

通常的做法是将gzip文件拆分为较小的块(在hadoop或之后复制它们之前) 能够运行尽可能多的map / reduce吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

你可以使用lzop生成文件的lzo压缩副本 - 虽然压缩率低于gzip,但lzo解压缩得非常快。

等等;

gunzip --stdout file.gz | lzop -ofile.lzo

应该有用。

将lzo文件复制到hdfs然后安装hadoop-lzo并使用它来生成lzo文件的索引;

hadoop jar(hadoop-lzo jar的路径)com.hadoop.compression.lzo.LzoIndexer file.lzo

(如果您愿意,也可以使用com.hadoop.compression.lzo.DistributedLzoIndexer)

这将为lzo文件创建一个索引。

然后,在为MapReduce作业生成拆分以将.lzo压缩文件分发给多个映射器/缩减器时,Hadoop将使用(使用正确的输入格式)索引。

此处有更详细的信息;

https://github.com/twitter/hadoop-lzo

这个回购的分支解决了一些问题;

https://github.com/kevinweil/hadoop-lzo

答案 1 :(得分:1)

我仍然不清楚你的问题,所以我会回答这个问题,你可以告诉我,如果我关闭的话:

如何使用map / reduce范例解压缩大型gzip文件?

除非为此专门准备了gzip文件,否则无法映射解压缩作业。减压必须连续进行。即使bzip2压缩数据已经在单独的可解压缩块中,你也不能找到这些块,而不是已经按顺序解压缩整个块,指向它们,这可能会破坏目的。

你提到LZO的“容器”格式,如果我理解正确的话,对gzip和bzip2也会有效。

对于这些格式中的任何一种,您都可以通过压缩来准备用于并行解压缩的gzip流。例如。每个部分一兆字节或几兆字节,以便不会显着降低压缩,并保持压缩时构造的那些部分的索引,并与压缩数据文件一起传输或存储。

gzip流的串联本身就是一个有效的gzip流,它会解压缩到各个流的解压缩级联。 bzip2格式也是如此。对于bzip2,碎片应该是900K的倍数,以便没有部分块,压缩比效率较低。

然后,您可以构建这样的gzip或bzip2文件,并保留每个gzip或bzip2流的开头的文件偏移列表。然后你可以绘制出那些碎片,其中reduce步骤只是以正确的顺序连接未压缩的结果。