2012-04-10 5 views
6

In meinem Job muss ich viele historische Logsets analysieren. Einzelne Kunden (es gibt Tausende) möglicherweise Hunderte von Protokollunterverzeichnissen nach Datum ausgebrochen. Zum Beispiel:Pass Verzeichnisse nicht Dateien zu hadoop-streaming?

  • logs/Customer_One/2011-01-02-001
  • logs/Customer_One/2012-02-03-001
  • logs/Customer_One/2012-02-03-002
  • logs/Customer_Two/2009-03-03-001
  • logs/Customer_Two/2009-03-03-002

Jeder einzelne Protokollsatz kann sich fünf oder sechs Ebenen tief sein und tausende von Dateien enthalten.

Daher möchte ich eigentlich die einzelnen Map-Jobs zu Fuß die Unterverzeichnisse behandeln: einfach die Aufzählung einzelner Dateien ist Teil meines verteilten Computerproblems!

Leider, wenn ich versuche, ein Verzeichnis mit nur Log-Unterverzeichnissen an Hadoop zu übergeben, beschwert es sich, dass ich diese Unterverzeichnisse nicht an meine Mapper übergeben kann. (Auch hier habe ich geschrieben Verzeichnisse als Eingabe zu akzeptieren):

$ hadoop jar "${HADOOP_HOME}/contrib/streaming/hadoop-streaming-${HADOOP_VERSION}.jar" -input file:///mnt/logs/Customer_Name/ -file mapper.sh -mapper "mapper.sh" -file reducer.sh -reducer "reducer.sh" -output .

[ . . . ]

12/04/10 12:48:35 ERROR security.UserGroupInformation: PriviledgedActionException as:cloudera (auth:SIMPLE) cause:java.io.IOException: Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 12/04/10 12:48:35 ERROR streaming.StreamJob: Error Launching job : Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 Streaming Command Failed! [[email protected] ~]$

Gibt es eine einfache Möglichkeit, Hadoop-Streaming zu überzeugen, mir zu erlauben, Verzeichnisse als Arbeitselemente zuweisen?

+0

wildcarding/globs sollte funktionieren, versuchen '-input file: /// mnt/logs/Kunde _ */**/*. Log' –

+0

Globbing ist nicht die Antwort: Erstens würde es nur Dateien zu einem gegebenen finden level im Verzeichnisbaum und nicht mehrere Ebenen; Zweitens, wie ich ursprünglich beschrieben habe, ist die Anzahl der Verzeichnisse und Unterverzeichnisse enorm (tatsächlich weit über die Grenzen einer Shell hinaus, um ohne Xargs zu expandieren), und die Zeit, diesen Baum zu durchlaufen, ist genau ein Teil des Problems, das ich verteilen möchte. (Die Durchführung des Globbing, von dem du sprichst, würde Tage dauern, buchstäblich mit 1 ms Rt.) –

+1

Für einen Moment erinnerte ich mich daran, dass Hadoop rekursive Klumpen mit der Doppelstern-Notation unterstützt, aber ein schneller Test in meiner Konsole steht sonst –

Antwort

1

Ich denke, Sie müssen untersuchen, ein benutzerdefiniertes InputFormat schreiben, die Sie auch das Stammverzeichnis übergeben können, wird es eine Aufteilung für jeden Kunden erstellen, und dann der Datensatz Leser für jeden Split wird das Verzeichnis gehen und schieben Sie den Inhalt der Datei an Ihre Mapper

+0

Es ist mir nicht klar, dass hadoop-streaming alle anderen Eingabeformate akzeptieren kann. Kann es? –

+0

http://hadoop.apache.org/mapreduce/docs/r0.21.0/streaming.html - siehe Parameter '-inputformat' –

+0

Ja. Wenn ich es jedoch in ein anderes vorhandenes InputFormat (z. B. org.apache.hadoop.mapred.KeyValueTextInputFormat) ändere, beschwert es sich immer noch über "keine Datei." –

0

Hadoop unterstützt Eingabepfade zu einem regulären Ausdruck. Ich habe nicht mit vielen komplexen Regex experimentiert, aber die einfachen Platzhalter ? und * funktioniert.

Also in Ihrem Fall denke ich, wenn Sie die folgenden als Eingabepfad haben, wird es funktionieren:

file:///mnt/logs/Customer_Name/*/* 

Der letzte Stern möglicherweise nicht, da alle Dateien in der endgültigen Verzeichnis benötigt werden als Eingabe automatisch hinzugefügt Pfad.

+0

Darf ich wissen, warum wurde das abgelehnt? Dies ist in der Tat eine süße und einfache Möglichkeit, Verzeichnis als Eingabepfad zu übergeben, nur dass Sie die Tiefe im Voraus wissen müssen.Ich habe es erfolgreich viele Male verwendet. – Amar

+0

Es funktioniert nicht, es werden nur Dateien auf einer bestimmten Ebene gefunden. – Liton

Verwandte Themen