海量小文件处理方式——新增组件完成小文件识别、合并与预取
上周我们一起了解了下合并算法,这篇我们开始聊聊组件架构。
整体架构如下图所示:由原来的HDFS的NameNode、DataNode,与新增的组件中各个模块组成——Building TaskQueue(小文件队列)、File Merging Strategy(小文件合并)、Index File(索引文件)、Prefetching(预取)。
除了HDFS原来的Namenode和DataNode组件之外,我们来聊聊其他新增的组件模块。
Building TaskQueue(小文件队列)—— 用于判断客户端上传的文件是否为小文件,如果不是小文件则直接发给HDFS处理;如果是小文件则存入TaskQueue队列。主要用于合并小文件做准备。
File Merging Strategy(小文件合并)—— 用于小文件的合并(合并算法上一篇已经讲了)。主要作用是减少文件存储对于NameNode内存的消耗。
Index File(索引文件)—— 用于建立小文件和合并后文件之间的索引。主要用于提升小文件查询效率。
Prefetching(预取)—— 用于将用户常用小文件缓存起来,提升小文件查询性能。
文件存储流程:
- 客户端上传文件后,先判断是否为小文件,小文件则存入TaskQueue队列;非小文件则转给HDFS处理;
- 启动针对TaskQueue的监控,一旦发现TaskQueue存入文件,则开始合并;
- 依据特点算法合并小文件,并建立索引文件;
- 将合并后的文件存入NameNode和DataNode。
文件读取流程:
- 客户端查询文件时,先从预取空间获取,如果预取空间有,则直接返回,如果没有则从DataNode获取;
- 从DataNode获取小文件后,将小文件返回给客户端,同时将小文件缓存如预取空间。
注:预取空间采用最久未被使用原则替换。比如预取空间只能存入10个文件,假设预取空间已经缓存了10个文件。当用户查询下一个文件时,该文件在预取空间没有获取到,则从DataNode获取,同时将最新一次查询到的小文件存入预取空间,替换到预取空间里面最长时间没有被使用到的文件。
- 点赞
- 收藏
- 关注作者
评论(0)