因此,HDFS基于block块存储、3副本机制等设计的特点在面对低延时、数据量小且文件多的场景下小文
件问题会变得格外突出。
题外话:
如果超出2亿文件规模,HDFS需要分federation隔离,大幅增加运维管理成本。
星环TDFS可以高效管理还聊小文件存储,支持10亿+文件,相较于开源提升5倍,服务启动时间降
低93%,元数据QPS性能提升70%,兼容Hadoop接口,可支持S3接口,感兴趣可查看: TDFS产
品页
小文件的出现
小文件通常是指文件size远小于HDFS上block块大小的文件。小文件数量过多,会给hadoop的扩展性和
性能带来严重问题。
任何block块、文件或者目录在内存中均以对象的形式存储,如果小文件的数据量非常多,则
NameNode需要更多存储元数据的空间,将逐渐出现内存受限的问题,并且很多存储小文件时被隐藏的
问题被暴露出来,比如启动时间变长(NameNode的启动过程通常分为几个阶段,包括fsimage本地数
据加载、读取JournalNode上比fsimage新的editlog、在本地进行editlog replay、DataNode的
BlockReport)。这样NameNode内存容量严重制约了集群的扩展。
并且,有关元数据的管理处理等操作基本都是基于NameNode来进行,那么当内存被大量占用时,对于
元数据的增删改查的操作性能会出现下降的趋势,相对于更复杂的操作处理,比如RPC (Remote
Procedure Call) 请求的性能下降趋势将会更加明显。
HDFS最初是为流式访问大文件开发的,访问大量小文件,block块在不同的节点上,则需要不断的从一
个DataNode跳到另一个DataNode,严重影响性能。
即使NameNode能够存储大量的小文件信息,对于hive,spark计算时,小文件同时也意味着需要更多
的task和资源,处理大量小文件的速度远远大于处理同等大小的大文件的速度。这是因为每一个小文件
要占用一个slot,而task启动将耗费大量时间甚至大部分时间都耗费在启动task和释放task上,同样也会
导致节点异常。
原因分析及危害
因此,总的来说,导致出现小文件的原因主要有以下几类:
① 用户在进行小批量、频繁的数据写入和更新操作的时候,会产生大量的小文件;
② torc表compact多次合并失败后进入黑名单,导致小文件不再继续合并;
③ 采用不规范的sql语句,导致单次事务产生的都是小文件;
④ 往动态分区插入数据可能会产生大量的小文件,从而导致Map数量剧增。这是因为假设动态分区有n
个分区,数据插入动态分区阶段产生了m个Map任务,则会产生n*m个文件,从而带来很多小文件。对
于多级动态分区,n值往往会变得很大;对于大的数据量,m值往往会变得很大;
⑤ 表设计不合理:
范围分区表,分区跨度小,导致单分区内的数据量小,小文件过多,单值分区设置不合理也会导致
这个情况;
使用动态分区表来做数据的存储入库时,在设计分区分桶的时候不合理导致底层有大量的小文件;
再或者说非分区表的分桶设置过大,数据平均分布,导致底层文件利用率低,每个桶文件大小几
KB,从而产生小文件,或者分桶字段设置不合理,导致数据倾斜,从而产生小文件;
不同的表类型,如:textfile表,csvfile表,orc/TORC表,hyperbase表,search表,holodesk表
等等,不同表类型适用与不同业务场景,使用不当也极有可能会造成小文件问题产生。
评论