合并 HDFS 上的压缩文件

Posted

技术标签:

【中文标题】合并 HDFS 上的压缩文件【英文标题】:Merging compressed files on HDFS 【发布时间】:2015-05-06 13:56:50 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

默认值8,80个小文件,每个是dfs的1/10 由于 8 * 1/10 = 8,块将被分组到单个输出文件中 dfs 块。如果有 81 个小文件,每个是 dfs 的 1/10 块,将创建两个输出文件。一个输出文件包含 41个文件的组合内容,第二个将包含组合的 其他 40 个的内容。一个包含许多小文件的目录将是 转换为更少数量的较大文件,其中每个输出文件 大小差不多。

【讨论】:

【参考方案2】:

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

    在你的猪中添加 set default_parallel 20; 但请注意,这会影响你猪中的一切 为单个操作更改并行 - 如DISTINCT ID PARALLEL 1;

可以阅读更多关于Parallel Features的信息

【讨论】:

【参考方案3】:

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

【讨论】:

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

以上是关于合并 HDFS 上的压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

hadoop mapreduce开发实践之HDFS压缩文件(-cacheArchive)

HDFS文件压缩

hbase优化之region合并和压缩

合并和压缩 Azure Blob 存储中的多个大文件

面试高级技巧之HDFS压缩方式

使用 MapReduce API 通过 Gzip 压缩复制 HDFS 内的文件