合并HDFS上的压缩文件

时间:2015-05-06 13:56:51

标签: hadoop compression apache-pig hdfs

如何将HDFS目录中的所有文件(我知道都是压缩的)合并到一个压缩文件中,没有通过本地计算机复制数据?例如,但不一定,使用Pig?

例如,我有一个文件夹/数据/输入,其中包含文件part-m-00000.gz和part-m-00001.gz。现在我想将它们合并到一个文件/data/output/foo.gz

3 个答案:

答案 0 :(得分:4)

我建议查看FileCrush(https://github.com/edwardcapriolo/filecrush),这是一个使用MapReduce在HDFS上合并文件的工具。它完全按照您的描述执行,并提供了几个选项来处理压缩和控制输出文件的数量。

  Crush --max-file-blocks XXX /data/input /data/output

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

  

使用默认值8,80个小文件,每个文件是dfs的十分之一   由于8 * 1/10 = 8,因此块将被分组为单个输出文件   dfs块。如果有81个小文件,每个文件是dfs的十分之一   块,将创建两个输出文件。一个输出文件包含   合并41个文件的内容,第二个将包含组合   其他的内容40.许多小文件的目录   转换为每个输出文件所在的较大数量的较大文件   大致相同的大小。

答案 1 :(得分:1)

如果将Parallel设置为1 - 那么您将拥有单个输出文件。 这可以通过两种方式完成:

  1. 在你的猪中添加set default_parallel 20;,但请注意,这会影响猪的一切
  2. 更改单个操作的并行 - 例如DISTINCT ID PARALLEL 1;
  3. 可以阅读有关Parallel Features

    的更多信息

答案 2 :(得分:0)

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