【发布时间】:2015-05-06 13:56:50
【问题描述】:
我如何将 HDFS 上一个目录中的所有文件(我知道全部压缩)合并到一个压缩文件中,不通过本地计算机复制数据?例如,但不一定,使用 Pig?
例如,我有一个文件夹 /data/input,其中包含文件 part-m-00000.gz 和 part-m-00001.gz。现在我想将它们合并到一个文件/data/output/foo.gz
【问题讨论】:
标签: hadoop compression apache-pig hdfs
我如何将 HDFS 上一个目录中的所有文件(我知道全部压缩)合并到一个压缩文件中,不通过本地计算机复制数据?例如,但不一定,使用 Pig?
例如,我有一个文件夹 /data/input,其中包含文件 part-m-00000.gz 和 part-m-00001.gz。现在我想将它们合并到一个文件/data/output/foo.gz
【问题讨论】:
标签: hadoop compression apache-pig hdfs
我建议查看 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 个的内容。一个包含许多小文件的目录将是 转换为更少数量的较大文件,其中每个输出文件 大小差不多。
【讨论】:
如果您将 Parallel 设置为 1 - 那么您将拥有单个输出文件。 这可以通过两种方式完成:
set default_parallel 20; 但请注意,这会影响你猪中的一切DISTINCT ID PARALLEL 1;
可以阅读更多关于Parallel Features的信息
【讨论】:
我知道有一个选项可以使用“hdfs dfs -getMerge”命令合并到本地文件系统。也许您可以使用它来合并到本地文件系统,然后使用“hdfs dfs -copyFromLocal”命令将其复制回 hdfs。
【讨论】: