2015-04-30 17 views
7

Kann ich haben Dateibeobachter auf HDFS?HDFS Dateibeobachter

Szenario: Die Dateien landen auf HDFS continuously.I einen Funken Job gestartet werden soll, sobald die Anzahl der Dateien einen Schwellenwert erreicht (es kann Anzahl von Dateien oder Größe der Dateien sein).

Ist es möglich, File Watcher auf HDFS zu implementieren, um dies zu erreichen. Wenn ja, kann mir jemand den Weg vorschlagen? Welche Möglichkeiten gibt es? Kann der Zookeeper oder der Oozie das machen?

Jede Hilfe wird geschätzt. Danke.

+0

Spark-Streaming hat eine ähnliche Funktion: in [FileInputDStream] (https://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apache/spark/streaming/dstream/FileInputDStream .scala # 172-172) –

+2

Einfache Sache, ich kann denken, dass Sie Unix-Befehl so verwenden können: hadoop fs -ls | wc -l – user3484461

+0

@YijieShen Können Sie es bitte mehr ausarbeiten? –

Antwort

11

Hadoop 2.6 eingeführt DFSInotifyEventInputStream, die Sie dafür verwenden können. Sie können eine Instanz davon von HdfsAdmin abrufen und dann einfach .take() oder .poll() anrufen, um alle Ereignisse zu erhalten. Zu den Ereignistypen gehören Löschen, Anhängen und Erstellen, die das abdecken sollten, wonach Sie suchen.

Hier ist ein einfaches Beispiel. Stellen Sie sicher, dass Sie es als Benutzer hdfs ausführen, da die Administratorschnittstelle HDFS-Stamm erfordert.

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; 
      } 
     } 
    } 
} 

Hier ist eine Blog-Post, die es im Detail behandelt:

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

+1

Vorbehalt: der Benutzer muss ein 'Super-Benutzer' sein, um auf die DFS-Ereignisse zuzugreifen. – sureshsiva

0

Ja, Sie können mit Inotification dies tun. Sie müssen nur die Details der HDFS-Transaktion durch Inotifyier erhalten, um ein besseres Verständnis zu erhalten, lesen Sie diese link.

+0

Ich werde es versuchen. –

+0

Gehen Sie weiter, lassen Sie mich wissen, wenn Sie irgendein Problem haben. – Bector

+0

Diese Antwort wäre besser, wenn sie die Hauptdetails enthält, anstatt nur auf eine externe Seite zu verlinken (die momentan nicht erreichbar ist!) – DNA

0

Oozie Koordinator kann dies tun. Oozie-Koordinatoraktionen können basierend auf Datenverfügbarkeit ausgelöst werden. Schreiben Sie einen datengesteuerten Koordinator. Die Koordinatoraktionen werden basierend auf dem Done-Flag ausgelöst. done-flag ist nichts als eine leere Datei. Wenn der Schwellenwert erreicht ist, schreiben Sie eine leere Datei in das Verzeichnis.