在HDFS上合并压缩文件

4

如何在HDFS上将一个目录中所有已压缩的文件合并成一个单独的压缩文件,而不需要通过本地机器复制数据?例如,但不限于使用Pig?

例如,我有一个名为/data/input的文件夹,其中包含文件part-m-00000.gz和part-m-00001.gz。现在我想将它们合并成一个单独的文件/data/output/foo.gz。

3个回答

4
我建议您看一下FileCrush(https://github.com/edwardcapriolo/filecrush),这是一个使用MapReduce合并HDFS上文件的工具。它正是您所描述的,并且提供了多个选项来处理压缩和控制输出文件的数量。
  Crush --max-file-blocks XXX /data/input /data/output

max-file-blocks代表每个输出文件的最大dfs块数。例如,根据文档:

默认值为8,80个小文件,每个文件占1/10的dfs块大小将被组合成单个输出文件,因为8 * 1/10 = 8 dfs块。如果有81个小文件,每个文件占1/10的dfs块大小,则会创建两个输出文件。一个输出文件包含41个文件的内容,另一个包含其余40个文件的内容。大量小文件的目录将转换为少量更大的文件,其中每个输出文件的大小大致相同。


1
如果将Parallel设置为1,则只会有一个输出文件。 可以通过以下两种方式实现:
  1. 在pig中添加set default_parallel 20;,但请注意这会影响pig中的所有内容。
  2. 更改单个操作的Parallel,例如DISTINCT ID PARALLEL 1;
可以了解更多关于Parallel Features的信息。

0

我知道有一种选项可以使用"hdfs dfs -getMerge"命令将文件合并到本地文件系统。也许您可以使用它来合并到本地文件系统,然后使用'hdfs dfs -copyFromLocal"命令将其复制回hdfs。


1
但我想避免来回传输数据到本地文件系统。 - matthiash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接