0

我有大约 14000 个小的 .gz 文件(从 90kb 到 4mb),它们都加载到 HDFS 中的同一目录中。

因此,它们每个的大小都与 HDFS 的标准 64mb 或 128mb 块大小相距甚远,这在运行处理这些文件的 MR 作业时可能会导致严重的问题(“小文件问题”,请参阅 cloudera 的这篇博文) .

上述博客文章包含许多解决此问题的方法,主要涉及编写 MapReduce 作业或使用 Hadoop 存档 (HAR)。

但是,我想从源头解决问题并将小文件合并为 64mb 或 128mb .gz 文件,然后将其直接输入 HDFS。

最简单的方法是什么?

4

2 回答 2

1
cat small-*.gz > large.gz

应该足够了。假设您不需要从那里提取单独的文件,并且数据就足够了。

如果您想要单独的文件,只需将其 tar:

tar cf large.tar small-*.gz
于 2013-06-18T18:21:15.790 回答
1

在进一步试验之后,以下两个步骤可以满足我的要求:

zcat small-*.gz | split -d -l2000000 -a 3 - large_

这在我的情况下有效,因为一条线的长度几乎没有变化。2000000 行几乎正好对应 300Mb 文件。不幸的是,由于某种原因,gzip 不能像这样通过管道传输,所以我必须再做一步:

gzip *

这也将压缩生成的大文件。Gzip 将这些文件中的每一个压缩了约 5 倍,产生 60mb 的文件,从而满足了我接收 .gz 文件 < 64mb 的初始限制。

于 2013-06-20T06:52:27.297 回答