我将在hadoop中复制许多压缩为gzip的大型weblogs文件。 我需要在这些文件上运行许多map / reduce。
据我了解,文件只能运行一个Map / Reduce。 就我而言,这是不可接受的,因为我们需要尽快完成这些工作。
通常的做法是将gzip文件拆分为较小的块(在hadoop或之后复制它们之前) 能够运行尽可能多的map / reduce吗?
感谢您的帮助。
答案 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
这个回购的分支解决了一些问题;
答案 1 :(得分:1)
我仍然不清楚你的问题,所以我会回答这个问题,你可以告诉我,如果我关闭的话:
如何使用map / reduce范例解压缩大型gzip文件?
除非为此专门准备了gzip文件,否则无法映射解压缩作业。减压必须连续进行。即使bzip2压缩数据已经在单独的可解压缩块中,你也不能找到这些块,而不是已经按顺序解压缩整个块,指向它们,这可能会破坏目的。
你提到LZO的“容器”格式,如果我理解正确的话,对gzip和bzip2也会有效。
对于这些格式中的任何一种,您都可以通过压缩来准备用于并行解压缩的gzip流。例如。每个部分一兆字节或几兆字节,以便不会显着降低压缩,并保持压缩时构造的那些部分的索引,并与压缩数据文件一起传输或存储。
gzip流的串联本身就是一个有效的gzip流,它会解压缩到各个流的解压缩级联。 bzip2格式也是如此。对于bzip2,碎片应该是900K的倍数,以便没有部分块,压缩比效率较低。
然后,您可以构建这样的gzip或bzip2文件,并保留每个gzip或bzip2流的开头的文件偏移列表。然后你可以绘制出那些碎片,其中reduce步骤只是以正确的顺序连接未压缩的结果。