【发布时间】:2020-02-09 06:44:52
【问题描述】:
我有一个 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 目录中查找创建文件事件。
【问题讨论】:
-
你必须用 batch.getEvents()) 查看所有事件