Hadoop NameNode and DataNode plug-ins



我目前对Hadoop生态系统和HDFS架构有一些初级的理解。

然而,我想了解HDFS的以下一些更深层次的方面:

  • 有没有一种方法可以挂接到NameNode执行中,以识别从HDFS中添加/修改/删除的文件——类似于Windows中的文件系统事件
  • 我是否可以编写插件,通过在NameNode和DataNode中执行自定义处理来扩展功能
  • 数据节点通常会发回已在其上复制的所有块的块报告。是否有方法扩展此数据块报告以添加自定义字段或属性

任何关于上述问题的建议都是非常好的。

提前感谢的帮助

有没有一种方法可以挂接到NameNode执行中,以识别从HDFS中添加/修改/删除的文件-类似于Windows中的文件系统事件?

是的!HDFS的最新版本包括一个类似于Linux inotify的功能,它允许HDFS客户端侦听NameNode发布的各种文件系统事件。不幸的是,我们目前在ApacheHadoop网站上没有关于该功能的明确文档。如果您想了解有关该功能的更多信息,那么我建议您查看ApacheJIRAHDFS-6634,这是跟踪该功能开发的主要问题。附带的设计文档和补丁会让你了解它的工作原理。此外,如果你在网上搜索"HDFSinotify",我希望你会找到一些有用的演示和例子。

或者,如果您只需要客户端对HDFS执行的所有操作的记录,那么解析HDFS审核日志就足够了。这是一个与普通HDFS日志保存在同一目录中的文件,记录了对NameNode执行的大多数操作的一行。Hadoop代码库中的log4j.properties示例显示了如何启用它。典型的商业发行版默认启用它。

我可以编写插件吗?这些插件可以通过在NameNode和DataNode中执行自定义处理来扩展功能。

不,没有通用的插件机制。这是一个有意的设计选择,以避免将可能较慢的自定义代码注入关键的HDFS守护进程的风险,这些守护进程有望很好地扩展。有一些特定的点可以通过实现特定的Java类来定制,例如权限检查,但它并不是一种通用的插件机制,用于挂接任何可能的事件。

上面提到的inotify功能包括客户端连接到NameNode并接收事件,然后客户端可以根据自己的意愿对这些事件做出响应。但是,这并不涉及在NameNode进程中执行的自定义客户端代码。

数据节点通常会发回已在其上复制的所有块的块报告。是否有方法扩展此数据块报告以添加自定义字段或属性?

实现这一点的唯一方法是更改HDFS的代码,并自己构建和部署它,本质上是创建自己的fork。这将有可能创建一个不兼容的版本,无法与Hadoop生态系统中的其他应用程序一起使用。HadoopRPC使用Protobuf来定义消息格式,如果使用得当,它可以实现前向和后向兼容性,但您的更改可能与Apache上游的开发有所不同。

如果您认为您为块报告准备了一个功能,该功能通常对所有HDFS用户都有用,那么您可以考虑提交Apache JIRA,将其作为一个功能提出,并将其纳入Apache Hadoop代码库。

最新更新