前言
前段时间笔者一直在折腾HDFS大目录删除的性能问题,也尝试了很多不同的方案来降低大目录删除所带来的性能影响,包括改INodeDirectly内部child list结构,或者是在Snapshot层面做改进优化等等(详见此文章:HDFS大目录文件删除方案的实践思考)。不过后续笔者在对比HDFS的删除操作和新一代存储Ozone系统内部的删除操作时,发现二者还是存在不少区别的,后者在设计上有着不小的改进之处。本文笔者来聊聊关于HDFS和Ozone的删除行为操作的对比,以及后面对HDFS现有删除操作的一些brainstorm的一些想法。
现有HDFS删除操作的性能问题
重新再回到这个老生常谈的问题–HDFS删除操作性能问题,用简单两个词简单概括:第一操作重,第二影响大。
这个过程简单来说如下:
- 1)递归遍历目录树结构,收集里面需要被清除的INode实例(包括INode目录和INode文件),以及INodeFile下面所属的block块,即待删除的块。
- 2)然后执行block的批量删除操作,每一批处理完毕,中间释放一下锁,然后再拿锁进行处理。
鉴于上述过程涉及到NameNode元数据的改动,因此都是在持有FSN全局锁的情况下执行的,因此这个过程就变得很重了。
下图是HDFS内部数据删除过程的一个简要示意图: