首页 > 解决方案 > 在 hdfs 目录中创建文件时如何获得通知

问题描述

我有一个 hdfs 目录,其中将定期创建文件。当在其子目录中创建文件时,我需要得到通知,以便我可以开始从该 hdfs 位置读取文件并将内容发送到 kafka 主题。我发现这可以使用 HDFS iNotify 来完成。但也有一些缺点,比如它不是 hdfs 目录,而是在 hdfs 中的任何位置创建文件时发出通知。它捕获在 hdfs 中发生的所有事件。

public class HdfsINotifyExample {

public static void main(String[] args) throws IOException, InterruptedException, MissingEventsException {

    long lastReadTxid = 0;

    if (args.length > 1) {
        lastReadTxid = Long.parseLong(args[1]);
    }

    System.out.println("lastReadTxid = " + lastReadTxid);

    HdfsAdmin admin = new HdfsAdmin(URI.create(args[0]), new Configuration());

    DFSInotifyEventInputStream eventStream = admin.getInotifyEventStream(lastReadTxid);

    while (true) {
        EventBatch batch = eventStream.take();
        System.out.println("TxId = " + batch.getTxid());

        for (Event event : batch.getEvents()) {
            System.out.println("event type = " + event.getEventType());
            switch (event.getEventType()) {
            case CREATE:
                CreateEvent createEvent = (CreateEvent) event;
                System.out.println("  path = " + createEvent.getPath());
                System.out.println("  owner = " + createEvent.getOwnerName());
                System.out.println("  ctime = " + createEvent.getCtime());
                break;
            default:
                break;
            }
          }
       }
      }
     }

除了监视所有事件类型之外,有没有更好的方法来仅在特定的 hdfs 目录中查找创建文件事件。

标签: javahadoophdfs

解决方案


您可以使用 HSFAdmin API 并监视 Event.create (hdfs.inotify.event.type) 以及要观看的 HDFS 路径 (hdfs.inotify.event.path)

https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-hadoop-nar/1.5.0/org.apache.nifi.processors.hadoop.inotify.GetHDFSEvents/


推荐阅读