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

时间:2016-10-20 22:53:45

标签: hadoop hadoop2

一个相当愚蠢的问题,但如何将文件夹中的多个文件合并到一个文件中而不将它们复制到本地机器?我不关心订单。 我以为hadoop fs -getmerge可以完成这项工作,但我发现它将数据复制到你的本地机器上。

我会在原始的spark应用程序中执行此操作,但添加coalesce会大大增加我的运行时间。 如果重要的话,我正在使用Hadoop 2.4。

1 个答案:

答案 0 :(得分:1)

  

如何将文件夹中的多个文件合并到一个文件中,而不将其复制到本地计算机?

您必须将文件复制到本地节点或其中一个计算节点。

HDFS是一个文件系统。它并不关心您的文件格式。如果您的文件是原始文本/二进制文件,则可以尝试连接 API,该API仅操作NameNode中的元数据而不复制数据。但是如果您的文件是parquet / gzip / lzo或者其他文件,这些文件不能简单地合并,您必须从HDFS下载它们,将它们合并为一个,然后上传合并的文件。 Spark的 coalesce(1)执行相同的操作,除非它在执行程序节点而不是本地节点中完成。

如果您有许多文件夹需要合并文件,那么spark / MR绝对是正确的选择。一个原因是并行性。另一个原因是,如果你的文件像gzip一样不支持 split ,那么一个巨大的gzip文件可能会减慢你的工作速度。通过一些数学计算,您可以将小文件合并为相对较大的文件。 (文件大小等于或略小于blocksize)。使用 coalesce(n) API非常容易。

我建议你合并小文件。但正如评论中提到的@ cricket_007,合并并不总能获益。