1.flume到hdfs小文件优化
项目的架构是使用flume直接从kafka读取数据Sink HDFS
1.1HDFS存入大量小文件的影响
元数据层面:每个小文件都有一份元数据,其中包括文件路径,文件名,所有者,所属组,权限,创建时间等,这些信息都保存在Namenode内存中。所以小文件过多,会占用Namenode服务器大量内存,影响Namenode性能和使用寿命
计算层面:默认情况下MR会对每个小文件启用一个Map任务计算,非常影响计算性能。同时也影响磁盘寻址时间。
1.2 小文件处理
image.png
官方默认的这三个参数配置写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
基于以上hdfs.rollInterval=3600,hdfs.rollSize=134217728,hdfs.rollCount =0几个参数综合作用,效果如下:
(1)文件在达到128M时会滚动生成新文件
(2)文件创建超3600秒时会滚动生成新文件
2. HDFS小文件优化
2.1 HDFS小文件弊端
HDFS上每个文件都要在NameNode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用NameNode的内存空间,另一方面就是索引文件过大使得索引速度变慢。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如,一个1MB的文件设置为128MB的块存储,实际使用是1MB的磁盘空间,而不是128M,但他的索引在NameNode中占用的内存是150byte。
2.2 HDFS小文件解决方案
小文件的优化无非以下几种方式:
在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。
在MapReduce处理时,可采用CombineTextInputFormat提高效率。
a. Hadoop Archive
是一个高效地将小文件放入HDFS块中的文件存档工具,它能够将多个小文件打包成一个HAR文件,这样讲减少了NameNode的内存使用。
(1)需要启动YARN进程
[root@node09 hadoop-3.1.3]# start-yarn.sh
(2)归档文件
把/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/output路径下。
[root@node09 hadoop-3.1.3]# bin/hadoop archive -archiveName input.har –p /input /output
(3)查看归档
[root@node09 hadoop-3.1.3]# hadoop fs -lsr /output/input.har
[root@node09 hadoop-3.1.3]# hadoop fs -lsr har:///output/input.har
(4)解归档文件
[root@node09 hadoop-3.1.3]# hadoop fs -cp har:///output/input.har/* /
b. Sequence File
由一系列的二进制key/value 组成,如果key为文件名,value为文件内容,则可以将大批小文件合并成一个大文件。
c. CombineFileInputFormat
是一种新的InputFormat,用于将多个文件合并成一个单独的Split,另外,它会考虑数据的存储位置
d. 开启JVM重用
对于大量小文件Job,可以开启JVM重用会减少45%运行时间。
JVM重用原理:一个Map运行一个JVM上,开启重用的话,该Map在JVM上运行完毕后,JVM继续运行其他Map
具体设置:mapreduce.job.jvm.numtasks值在10-20之间