在hadoop上将多个文件合并为一个文件

p1tboqfb  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(510)

这是一个相当愚蠢的问题,但我如何将文件夹中的多个文件合并成一个文件而不将它们复制到本地计算机?我不关心顺序。我原以为hadoop fs-getmerge可以完成这项工作,但后来我发现它会将数据复制到本地机器上。
我会在我最初的spark应用程序中这样做,但是添加coalesce会大大增加我的运行时间。如果这很重要的话,我会使用hadoop2.4。

s8vozzvw

s8vozzvw1#

如何将文件夹中的多个文件合并为一个文件而不将它们复制到本地计算机上?
您必须将文件复制到本地节点或其中一个计算节点。
hdfs是一个文件系统。它不关心你的文件格式。如果您的文件是原始文本/二进制文件,则可以尝试连接api,该api只操作namenode中的元数据,而不复制数据。但是如果您的文件是parquet/gzip/lzo或其他文件,这些文件不能简单地合并,您必须从hdfs下载它们,将它们合并成一个文件,然后上载合并的文件。spark的coalesce(1)除了在executor节点(而不是本地节点)中执行之外,它做同样的事情。
如果有许多文件夹需要合并,spark/mr绝对是正确的选择。一个原因是平行性。另一个原因是,如果您的文件类似于gzip不支持split,那么一个巨大的gzip文件可能会减慢您的工作速度。通过一些数学计算,你可以把小文件合并成相对大的文件文件大小等于或略小于块大小)。使用coalesce(n)api非常容易。
我建议你合并一些小文件。但正如@cricket\u007在评论中提到的那样,合并并不总能获得好处。

相关问题