目前我们正在通过调用hadoop的FileSystem API中的org.apache.hadoop.fs.FileSystem.moveFromLocalFile()
方法将文件导入HDFS,由于导入的小文件太多,我们现在在名称节点中遇到了一些大的堆大小,我们希望减少它。有没有一种更简单的方法可以将文件作为HAR导入HDFS,而不必首先导入所有小文件?简而言之,我导入小文件,但在HDFS中有1个HAR文件包含我导入的文件。
无法将HAR(Hadoop ARchive)文件直接摄取到HDFS中。
更好的方法是,先将较小的文件复制到HDFS中,然后通过将所有这些较小的文件合并在一起来创建HAR文件。
您可以使用hadoop archive
(用法:hadoop archive-archiveName{name of the archive}-p{Input parent folder path}{Output folder path})命令创建一个HAR文件,创建HAR文件后,您可以删除原始文件。
如果有数百万个小文件,那么您可以将这些文件分块复制。
例如,假设您有100000个小文件。一种可能的方法:
- 将10000个文件复制到HDFS中的临时位置。例如。hdfs:///tmp/partition1/
- 从这10000个文件中创建一个HAR文件。例如。hdfs:///tmp/archive1/
- 创建存档后,从中删除文件hdfs:///tmp/partition1/
- 重复步骤1到3,直到您摄取了所有100000个文件