海量小文件处理方式——EXtended HDFS
上一篇我们说了Improve HAR机制在读方面还是存在性能问题,这篇我们就来聊聊这个问题的解决方案之一——EXtended HDFS。
Extended HDFS,即EHDFS。也是基于索引的,解决索引文件中小文件数量过大、引起更新索引困难的问题。为了改善HDFS读性能,EHDFS采用了预取方式。下面我们来看看“预取”方式是什么。
EHDFS有4个技术点用于在HDFS处理小文件改善效率方面扮演重要角色。4个技术点分别是:
- 文件合并;
- 文件mapping;
- 文件预取;
- 文件提取;
具体的四部分图如下:
文件合并:在小文件合并时,NameNode只维护合并后的文件,而不是所有小文件。每一个存储块开头的地方存储了索引表,之后是文件数据。表中包含了每个小文件实体,表存储在存储块中。每一个表的实体由(偏移量offset,长度length)对组成。合并后的存储块结构如下图所示:
扩展实体结构如下:
由(offset,length)组合的key,value对,和文件数据组成。
文件mapping:file mapping是这样一个程序,它将小文件mapping到一个大文件中,然后将大文件存入块中。一个包含小文件和合并文件名的请求被发送到
Namenode,用于获取所需小文件的位置。
NameNode为每个合并后的文件维护了一个叫做COnstituentFileMap的数据结构。用于映射小文件和合并后逻辑块的关系。下图是ConstituentFileMap结构体的结构:
预取:安装在NameNode中。文件合并并不能提升文件读性能。仅仅是减少了元数据占用NameNode节点的内存大小。NameNode依然制约着文件读的性能。所以我们采用预取方式来预取元数据来改善该性能瓶颈。
当读操作执行时,先从预取数据中读取,如果没有再从NameNode中获取。
文件提取:安装在DataNode中。即从块中提取文件的流程。当读一个文件时,客户端指定小文件名称和合并后文件名称,这两个信息用于获取下面的信息:
- 存储文件的块;
- 存储块的DataNode;
- NameNode中的索引实体数;
----------------------------------------------------------------------------------------------------------------------------------------------------------
好了,至此几种常见的HDFS处理海量小文件的方式就介绍完了。
- 点赞
- 收藏
- 关注作者
评论(0)