前言
在文件系统的使用中,在某些场合我们往往会有这样一个需求点:我们想对某个文件/目录进行事件监听,监听的事件包括在目标目录下新增文件了,又或者说是删除了什么文件等等.这其实是对目标文件目录数据的一个比较实时的监控.我们比较传统的方案是去做定期的全盘扫描,然后算出增量值与最新统计值.这种方式的优点是实现简单,但是缺点也很明显,就是太低效了.那么在目前现有的Linux操作系统中,是否有这样的一套event事件通知机制呢?答案是有的,这套机制叫做inotify.对Linux比较有研究的同学,应该不会陌生,但是本文所要叙述的主题是HDFS inotify.换句话说,就是Linux inotify机制在HDFS中的实现.HDFS作为一套分布式文件系统,同样也有这样的需求和相应的使用场景.本人在看完HDFS inotify机制的设计与实现之后,感觉还是非常棒的.相信本文会对大家有帮助.
Linux inotify机制
了解Linux inotify机制是学习HDFS inotify的一个前提.Linux inotify机制的原理用简单的一句话概况如下:
它是一个内核用于通知用户空间程序文件系统变化的机制.
上面这句话的意思表明了它是从内核态到用户态的一套消息通知机制,它能将系统层面的变化通知到用户.本文所指的系统层面指的是文件系统层面,当然了Linux还有针对系统其他层面的类似的通知机制,比如热插拔设备的一些事件通知等.
Linux inotify的使用
基于本人并不是Linux内核专家,所以这里不会大篇幅讨论Linux inotify的底层实现过程,下面简单聊聊它的使用,借此来看看它的具体使用步骤,同时可以拿来与后面将要阐述的HDFS inotify做对比.
下面是具体的使用步骤:
步骤一:首先初始化一个inotify实例对象,得到一个fd文件描述符.
int fd = inotify_init ();
步骤二:在目标需要监听的文件/目录上添加watch监听器(这里的path参数就是目标文件/目录的全路径).
int wd = inotify_add_watch (fd, path, mask);
步骤三:通过调用read方法读取event通知事件.
size_t len = read (fd, buf, BUF_LEN);
通过定期循环的调用read方法,就可以做到对目标文件/目录变化的实时感知了.总的来看,linux的inotify的使用并不是特别复杂.从上面的步骤中,我们还能提取出一个关键信息:Linux inotify的调用模式看起来更像是Pull模式.通过客户端程序定时的去”拉”,而不是服务端直接push的方式.
OK,linux inotify机制就简单介绍到这里,更细节的内容可以点击文章末尾的链接地址进行进一步的学习.
HDFS inotify
正如前言中所提到的,HDFS作为一套文件系统,它同样有这样的需求,社区在HDFS-6634(inotify in HDFS)中,对此进行了实现,发布版本2.6.0.想使用此功能特性的同学可以使用Hadoop 2.6以及往后的版本.
HDFS inotify背景
在HDFS inotify机制实现之前,使用者们一般会通过什么方式来获取文件的事件变更呢?答案是editlog.因为HDFS上的每个事务变化记录都会持久化到editlog中.所以分析editlog是比较常见的做法.但是这种方式有几个弊端:
- 第一, Editlog是存放在JournalNode上的,这就要求解析程序要指定地址去读取文件,但是如果遇到JournalN