2015-04-30 16 views
7

Czy mogę obserwować plik na HDFS?Obserwator plików HDFS

Scenariusz: Pliki są lądowania na HDFS continuously.I chcą rozpocząć Spark Job gdy liczba plików osiągnęła próg (może to być liczba plików lub rozmiar plików).

Czy można zaimplementować śledzenie plików w HDFS, aby to osiągnąć. Jeśli tak, to czy ktoś może zaproponować sposób, aby to zrobić? Jakie są dostępne opcje? Czy Zookeeper lub Oozie mogą to zrobić?

Każda pomoc zostanie doceniona. Dzięki.

+0

Funkcja Spark Streaming ma podobną funkcję: w [FileInputDStream] (https://github.com/apache/spark/blob/master/streaming/src/main/scala/org/apaver/spark/streaming/dstream/FileInputDStream .scala # 172-172) –

+2

Prosta rzecz, jaką mogę sobie wyobrazić, możesz użyć polecenia unix w ten sposób: hadoop fs -ls | wc -l – user3484461

+0

@YijieShen Czy możesz go jeszcze bardziej rozwinąć? –

Odpowiedz

11

Hadoop 2.6 wprowadził DFSInotifyEventInputStream, którego można użyć do tego. Możesz pobrać jego instancję od HdfsAdmin, a następnie zadzwoń pod numer .take() lub .poll(), aby uzyskać wszystkie zdarzenia. Typy zdarzeń obejmują usuwanie, dołączanie i tworzenie, które powinny obejmować to, czego szukasz.

Oto podstawowy przykład. Upewnij się, że uruchamiasz go jako użytkownik hdfs, ponieważ interfejs administratora wymaga rootu HDFS.

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

Oto blogu, że obejmuje ją bardziej szczegółowo:

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

+1

zastrzeżenie: użytkownik musi być 'super-użytkownik portu, aby uzyskać dostęp do wydarzeń DFS .. – sureshsiva

0

Tak, można to zrobić z Inotification. Po prostu musisz uzyskać szczegóły transakcji HDFS poprzez inotifyier, aby uzyskać lepsze zrozumienie przeczytaj ten link.

+0

będę spróbować. –

+0

Dalej, daj mi znać, jeśli napotkasz problem. – Bector

+0

Ta odpowiedź byłaby lepsza, gdyby zawierała główne szczegóły, a nie tylko link do zewnętrznej strony (która obecnie wydaje się być wyłączona!) – DNA

0

Oozie koordynator może to zrobić. Działania koordynatora Oozie mogą być uruchamiane na podstawie dostępności danych. Napisz koordynatora z wyzwalaczem danych. Działania koordynatora są uruchamiane w oparciu o zakończoną flagę. done-flag to nic innego jak pusty plik. Kiedy osiągniesz próg, napisz pusty plik do katalogu.