大gzip文件的hadoop策略

fivyi3re  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(374)

我将在hadoop中复制大量压缩为gzip的大型weblog文件。我需要在这些文件上运行许多map/reduce。
据我所知,只有一个map/reduce将按文件运行。在我的情况下,这是不可接受的,因为我们需要这些工作尽快完成。
通常的做法是将gzip文件分割成更小的块(在hadoop中复制之前或之后),以便能够运行尽可能多的map/reduce吗?
谢谢你的帮助。

p1tboqfb

p1tboqfb1#

您可以使用lzop生成文件的lzo压缩副本—虽然压缩比低于gzip,但lzo的解压速度非常快。
有点像;
gunzip--标准输出文件.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文件创建索引。
hadoop在为mapreduce作业生成拆分时将使用索引(使用正确的输入格式),将.lzo压缩文件分发给多个mapper/reducer。
这里有更详细的信息;
https://github.com/twitter/hadoop-lzo
回购的一个分支解决了一些问题;
https://github.com/kevinweil/hadoop-lzo

syqv5f0l

syqv5f0l2#

我还不清楚你的问题,所以我会回答这个问题,你可以让我知道如果我接近:
如何使用map/reduce范例来解压缩一个大的gzip文件?
除非gzip文件为此专门准备,否则不可能Map出解压作业。解压必须连续进行。即使bzip2压缩数据已经在单独的可解压块中,如果没有对整个数据进行解压,就无法找到块,串行地指向它们,这可能会破坏目的。
您提到了lzo的“容器”格式,如果我理解正确的话,它也适用于gzip和bzip2。
对于这些格式中的任何一种,您都可以通过分段压缩来为并行解压缩准备gzip流。e、 g.为每个片段提供一兆字节或几兆字节,以便不会显著降低压缩性能,并保持在压缩时构造并与压缩数据文件一起传输或存储的片段的索引。
gzip流的串联本身就是一个有效的gzip流,它解压缩为各个流的解压缩的串联。bzip2格式也是如此。对于bzip2,片段应该是900k的倍数,这样就不会有压缩比效率较低的部分块。
然后,您可以构造这样一个gzip或bzip2文件,并在其中保留每个gzip或bzip2流的开始位置的文件偏移量列表。然后您可以Map出这些片段,其中reduce步骤将简单地按照正确的顺序连接未压缩的结果。

相关问题