如何将HDFS目录中的所有文件(我知道都是压缩的)合并到一个压缩文件中,没有通过本地计算机复制数据?例如,但不一定,使用Pig?
例如,我有一个文件夹/数据/输入,其中包含文件part-m-00000.gz和part-m-00001.gz。现在我想将它们合并到一个文件/data/output/foo.gz
中答案 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 - 那么您将拥有单个输出文件。 这可以通过两种方式完成:
set default_parallel 20;
,但请注意,这会影响猪的一切DISTINCT ID PARALLEL 1;
可以阅读有关Parallel Features
的更多信息答案 2 :(得分:0)
我知道可以选择使用“hdfs dfs -getMerge”命令合并到本地文件系统。也许您可以使用它来合并到本地文件系统,然后使用'hdfs dfs -copyFromLocal'命令将其复制回hdfs。