如何在HDFS上将一个目录中所有已压缩的文件合并成一个单独的压缩文件,而不需要通过本地机器复制数据?例如,但不限于使用Pig?
例如,我有一个名为/data/input的文件夹,其中包含文件part-m-00000.gz和part-m-00001.gz。现在我想将它们合并成一个单独的文件/data/output/foo.gz。
如何在HDFS上将一个目录中所有已压缩的文件合并成一个单独的压缩文件,而不需要通过本地机器复制数据?例如,但不限于使用Pig?
例如,我有一个名为/data/input的文件夹,其中包含文件part-m-00000.gz和part-m-00001.gz。现在我想将它们合并成一个单独的文件/data/output/foo.gz。
Crush --max-file-blocks XXX /data/input /data/output
max-file-blocks
代表每个输出文件的最大dfs块数。例如,根据文档:
默认值为8,80个小文件,每个文件占1/10的dfs块大小将被组合成单个输出文件,因为8 * 1/10 = 8 dfs块。如果有81个小文件,每个文件占1/10的dfs块大小,则会创建两个输出文件。一个输出文件包含41个文件的内容,另一个包含其余40个文件的内容。大量小文件的目录将转换为少量更大的文件,其中每个输出文件的大小大致相同。
set default_parallel 20;
,但请注意这会影响pig中的所有内容。DISTINCT ID PARALLEL 1;
我知道有一种选项可以使用"hdfs dfs -getMerge"命令将文件合并到本地文件系统。也许您可以使用它来合并到本地文件系统,然后使用'hdfs dfs -copyFromLocal"命令将其复制回hdfs。