hdfs小文件问题
背景原因:
1)hdfs上每个文件都要在NN的上创建对应的元数据,每个文件对应的元数据大概150byte,这个元数据是要存储在NN的内存中。
2)目前2.X之后每个文件块默认128M,但是时间生产中,经常会产生大量小文件,就会出现,集群数据存储不大,但是元数据特别多,占用大量NN内存
影响:
1)大量占用NN内存
2)元数据文件过多,寻址索引速度变慢,甚至出现寻址时间大于数据读取时间
3)MR计算时会生成过多的切片,需要启动过多的MapTask,每个MapTask处理的数据量很小,会出现MapTask的处理时间小于启动时间,造成资源浪费
解决思路:
1)入库前:数据采集或标准入库之前,将小文件进行合并大文件再上传入库
2)存储:Hadoop Archive归档–>将多个小文件打包成一个HAR文件,减少对NN内存的使用
3)计算方面:CombineTextInputFormat用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片
4)UBer模式,实现JVM的复用----------------ps目前还不懂
关于Hadoop Archive归档
1)hdfs存档文件为HAR文件,文件归档后,将文件存入HDFS块,
2)在减少NN内存使用的同时,允许对文件进行透明的访问。
3)HDFS存档文件对内是一个一个文件,对NN而言是一个整体,从而减少NN内存的使用,
4)即将多个小文件存档为一个文件
实例:
1>把/input 目录里面的所有文件归档成一个叫 input.har 的归档文件,并把归档后文件存储到/output 路径下
hadoop archive -archiveName input.har -p /input /output
2>查看归档
hdfs dfs -ls /output/input.har
3>解归档
hadoop fs -cp har:///output/input.har/* /