Hadoop并不擅长对小型文件的储存,原因取决于Hadoop文件系统的文件管理机制,Hadoop的文件存储的单元为一个块(block),block的数据存放在集群中的datanode节点上,由namenode对所有datanode存储的block进行管理。namenode将所有block的元数据存放在内存中,以方便快速的响应客户端的请求。那么问题来了,不管一个文件有多小,Hadoop都把它视为一个block,大量的小文件,将会把namenode的内存耗尽。
那么如何对大量的小文件进行有效的处理呢?Hadoop的优秀工程师们其实已经为我们考虑好了,Hadoop提供了一个叫Archive归档工具,Archive可以把多个文件归档成为一个文件,换个角度来看,Archive实现了文件的元数据整理,但是,归档的文件大小其实没有变化,只是压缩了文件的元数据大小。
Archive的用法:
1、看一下,目录结构: hadoop fs -ls -R
2、归档gs目录:hadoop archive -archiveName gs.har -p /user/cb/gs har
-archiveName 指定归档文件名;
-p 指定要进行归档目录的父目录,支持同时归档多个子目录;
gs 归档目录
har 归档文件存放的目录
#具体的执行信息如下:是通过MapReduce来完成的,只有map,没有reduce的Job。(下面只是节选执行结果)
cb@Standalone14:~$ hadoop archive -archiveName gs.har -p /user/cb/gs har
16/02/15 08:32:59 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id
16/02/15 08:32:59 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId=
16/02/15 08:33:00 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
16/02/15 08:33:00 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized
16/02/15 08:33:01 INFO mapreduce.JobSubmitter: number of splits:1
16/02/15 08:33:01 INFO mapreduce.JobSubmitter: Submitting tokens for job:job_local1719015123_0001
16/02/15 08:33:01 INFO mapreduce.Job: The url to track the job: http://localhost:8080/
4、查看归档文件明细文件:hadoop fs -ls har/gs.har
归档文件中包括2个索引文件:_index,_masterindex;part是多个原文件的集合,根据index文件去找到原文件。
5、查看归档文件的原文件:hadoop fs -ls -R har:///user/cb/har/gs.har
6、另外,我们可以像其它文件系统一样,操作har文件的下级目录: hadoop fs -ls -R har:///user/cb/har/gs.har/gs
7、远程操作归档文件也是很方法的:hadoop fs -ls -R har://hdfs-localhost:9090/user/cb/har/gs.har/gs
8、删除归档文件:hadoop fs -rmr har/gs.har
不足的地方:
1、archive文件本占用与原文件相同的硬盘空间;
2、archive文件不支持压缩;
3、archive一旦创建就不能进行修改;
4、archive虽然解决了namenode的空间问题,但是,在执行mapreduce时,会把多个小文件交给同一个mapreduce去split,这会降低mapreduce的效率。
不足的地方:
1、archive文件本占用与原文件相同的硬盘空间;
2、archive文件不支持压缩;
3、archive一旦创建就不能进行修改;
4、archive虽然解决了namenode的空间问题,但是,在执行mapreduce时,会把多个小文件交给同一个mapreduce去split,这会降低mapreduce的效率。
版权声明:本文为Veechange原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。