HDFS文件观察器

时间:2015-04-30 06:05:25

标签: hadoop apache-spark hdfs file-watcher

我可以在 HDFS 上拥有文件观察程序吗?

情境: 这些文件不断登陆HDFS。我想在文件数量达到阈值后启动Spark作业(可以是文件数量或文件大小)。

是否可以在HDFS上实现文件观察器来实现此目的。如果是,那么任何人都可以建议这样做吗?有哪些不同的选择? Zookeeper或Oozie能做到吗?

任何帮助都将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:11)

Hadoop 2.6引入了DFSInotifyEventInputStream,您可以将其用于此目的。您可以从HdfsAdmin获取该实例,然后只需致电.take().poll()即可获取所有活动。事件类型包括删除,追加和创建,它们应涵盖您正在寻找的内容。

这是一个基本的例子。确保以hdfs用户身份运行它,因为管理界面需要HDFS root。

public static void main( String[] args ) throws IOException, InterruptedException, MissingEventsException
{
    HdfsAdmin admin = new HdfsAdmin( URI.create( args[0] ), new Configuration() );
    DFSInotifyEventInputStream eventStream = admin.getInotifyEventStream();
    while( true ) {
        EventBatch events = eventStream.take();
        for( Event event : events.getEvents() ) {
            System.out.println( "event type = " + event.getEventType() );
            switch( event.getEventType() ) {
                case CREATE:
                    CreateEvent createEvent = (CreateEvent) event;
                    System.out.println( "  path = " + createEvent.getPath() );
                    break;
                default:
                    break;
            }
        }
    }
}

这是一篇博文,更详细地介绍了它:

http://johnjianfang.blogspot.com/2015/03/hdfs-6634-inotify-in-hdfs.html?m=1

答案 1 :(得分:0)

Oozie协调员可以做到这一点。可以根据数据可用性触发Oozie协调器操作。编写数据触发协调器。协调器操作基于done-flag触发。 done-flag只是一个空文件。因此,当达到阈值时,将空文件写入目录。

答案 2 :(得分:0)

旧线程...如果有人想在Scala中这么做

import java.net.URI

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hdfs.client.HdfsAdmin
import org.apache.hadoop.hdfs.inotify.Event.{AppendEvent, CreateEvent, RenameEvent}


object HDFSTest extends App {
  val admin = new HdfsAdmin( URI.create( "hdfs://namenode:port" ), new Configuration() )
  val eventStream = admin.getInotifyEventStream()

  while( true ) {
    val events =  eventStream.poll(2l, java.util.concurrent.TimeUnit.SECONDS)
    events.getEvents.toList.foreach { event ⇒
      println(s"event type = ${event.getEventType}")
      event match {
        case create: CreateEvent ⇒
          println("CREATE: " + create.getPath)

        case rename: RenameEvent ⇒
          println("RENAME: " + rename.getSrcPath + " => " + rename.getDstPath)

        case append: AppendEvent ⇒
          println("APPEND: " + append.getPath)

        case other ⇒
          println("other: " + other)
      }
    }
  }
}

以防万一,如果要使用模拟用户...设置环境变量:HADOOP_USER_NAME=user-name

答案 3 :(得分:-1)

是的,您可以使用Inotification执行此操作。您只需要通过inotifyier获取HDFS事务的详细信息,以便更好地理解阅读此link