解决Hadoop小文件问题
1 Hadoop小文件弊端 HDFS上每个文件都要在NameNode上创建对应的元数据,这个元数据的大小约为150byte,这样当小文件比较多的时候,就会产生很多的元数据文件,一方面会大量占用NameNode的内存空间,另一方面就是元数据文件过多,使得寻址索引速度变慢。 小文件过多,在进行MR计算时,会生成过多切片,需要启动过多的MapTask。每个MapTask处理的数据量小,导致MapTask的处理时间比启动时间还小,白白消耗资源。 2 Hadoop小文件解决方案 2.1 数据源头控制小文件出现 在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS 对flume的HDFS Sink 进行配置【调整滚动块大小、调整滚动时间、将event设为0】 #Sink a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = hdfs://hadoop101:8020/flume/%Y%m%d/%H #上传文件的前缀 a1.sinks.k1.hdfs.filePrefix = logs- #是否按照时间滚动文件夹 a1.sinks.k1.hdfs.round = true #多少时间单位创建一个新的文件夹 a1.sinks.k1.hdfs.roundValue = 1 #重新定义时间单位 a1.sinks.k1.hdfs.roundUnit = hour #是否使用本地时间戳 a1.sinks.k1.hdfs.useLocalTimeStamp = true #积攒多少个Event才flush到HDFS一次 a1.sinks.k1.hdfs.batchSize = 100 #设置文件类型,可支持压缩 a1.sinks.k1.hdfs.fileType = DataStream #多久生成一个新的文件 a1.sinks.k1.hdfs.rollInterval = 60 #设置每个文件的滚动大小【256M】 a1.sinks.k1.hdfs.rollSize = 268435456 #文件的滚动与Event数量无关 a1.sinks.k1.hdfs.rollCount = 0 2.2 在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。 (1)Hadoop Archive(har归档) 是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件,从而达到减少NameNode的内存使用
具体操作 (2)归档文件 把/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/output路径下。 [root@hadoop102 hadoop-3.1.3]$ hadoop archive -archiveName input.har -p /input /output (3)查看归档 [root@hadoop102 hadoop-3.1.3]$ hadoop fs -ls /output/input.har [root@hadoop102 hadoop-3.1.3]$ hadoop fs -ls har:///output/input.har (4)解归档文件 [root@hadoop102 hadoop-3.1.3]$ hadoop fs -cp har:///output/input.har/* /
2.3在MapReduce处理时,可采用CombineTextInputFormat提高效率 CombineTextInputFormat用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片。
在hadoop框架的Driver驱动类的提交job前加下面的代码: // 设定的最大的切片大小 CombineTextInputFormat.setMaxInputSplitSize(job, 18874368); // 18M 第二个参数是最大的小文件所占空间大小,根据实际情况进行调整 // 指定切片的具体实现类 job.setInputFormatClass(CombineTextInputFormat.class);
2.4开启uber模式,实现jvm重用 【慎用】 开启uber模式,实现jvm重用。默认情况下,每个Task任务都需要启动一个jvm来运行,如果Task任务计算的数据量很小,我们可以让同一个Job的多个Task运行在一个Jvm中,不必为每个Task都开启一个Jvm. 开启uber模式,在mapred-site.xml中添加如下配置
mapreduce.job.ubertask.enable true
mapreduce.job.ubertask.maxmaps 9
mapreduce.job.ubertask.maxreduces 1
mapreduce.job.ubertask.maxbytes
|