如何将hdfs上一个目录中的所有文件(我知道这些文件都已压缩)合并到一个压缩文件中,而不必通过本地计算机复制数据?例如,但不一定,使用pig?例如,我有一个文件夹/data/input,其中包含文件part-m-00000.gz和part-m-00001.gz。现在我想将它们合并到一个文件/data/output/foo.gz中
frebpwbc1#
如果将parallel设置为1-则将有一个输出文件。这可以通过两种方式实现:在你的Pig里加上 set default_parallel 20; 但请注意,这会影响你的Pig的一切改变并行为一个单一的操作,如 DISTINCT ID PARALLEL 1; 可以阅读更多关于并行功能的信息
set default_parallel 20;
DISTINCT ID PARALLEL 1;
8tntrjer2#
我知道有一个选项可以使用“hdfs-dfs-getmerge”命令合并到本地文件系统。也许您可以使用它合并到本地文件系统,然后使用“hdfs-dfs-copyfromlocal”命令将其复制回hdfs。
t98cgbkg3#
我建议你看看(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个文件的组合内容。包含许多小文件的目录将被转换为数量较少的较大文件,其中每个输出文件的大小大致相同。
3条答案
按热度按时间frebpwbc1#
如果将parallel设置为1-则将有一个输出文件。这可以通过两种方式实现:
在你的Pig里加上
set default_parallel 20;
但请注意,这会影响你的Pig的一切改变并行为一个单一的操作,如
DISTINCT ID PARALLEL 1;
可以阅读更多关于并行功能的信息8tntrjer2#
我知道有一个选项可以使用“hdfs-dfs-getmerge”命令合并到本地文件系统。也许您可以使用它合并到本地文件系统,然后使用“hdfs-dfs-copyfromlocal”命令将其复制回hdfs。
t98cgbkg3#
我建议你看看(https://github.com/edwardcapriolo/filecrush),一个使用mapreduce在hdfs上合并文件的工具。它完全符合您所描述的,并提供了几个选项来处理压缩和控制输出文件的数量。