2010-12-13 9 views
6

Ich sammle Protokolle mit Flume zum HDFS. Für den Testfall habe ich kleine Dateien (~ 300kB), weil der Log-Sammelvorgang für die reale Nutzung skaliert wurde.Welches ist der einfachste Weg, kleine HDFS-Blöcke zu kombinieren?

Gibt es eine einfache Möglichkeit, diese kleinen Dateien zu größeren zu kombinieren, die näher an der HDFS-Blockgröße (64 MB) liegen?

+0

Möchten Sie Dateien für die Speicherung oder für Mapreduce-Job-Eingaben kombinieren? – wlk

+0

Gibt es eine Möglichkeit, sie aus der Perspektive eines Mappers zu kombinieren? –

+0

Ich möchte sie für den Speicher kombinieren –

Antwort

5

Die GNU Coreutils Split könnte die Arbeit tun.

Wenn die Quelldaten sind Linien - in meinem Fall sind sie - und eine Zeile um 84 bytes, dann ein HDFS Block 64MB um 800000 Zeilen enthalten könnte:

hadoop dfs -cat /sourcedir/* | split --lines=800000 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 

oder mit --line-bytes Option:

hadoop dfs -cat /sourcedir/* | split --line-bytes=67108864 - joined_ 
hadoop dfs -copyFromLocal ./joined_* /destdir/ 
+0

btw Ich könnte mir einen hadoop Befehl vorstellen, um das gleiche zu tun, wenn jemand interessiert ist, ist die Frage noch offen. –

3

Meine aktuelle Lösung besteht darin, einen MapReduce-Job zu schreiben, der praktisch nichts tut, während eine begrenzte Anzahl von Reduzierern vorhanden ist. Jeder Reducer gibt eine Datei aus, so dass diese zusammenkommen. Sie können den Namen der Originaldatei in jeder Zeile hinzufügen, um zu zeigen, woher sie stammt.

Ich bin immer noch interessiert zu hören, ob es einen Standard oder bewährte beste Weise, dies zu tun, die mir nicht bekannt ist.

+1

+1. Das ist auch die Lösung, die ich selbst in der Vergangenheit benutzt habe. –

+0

meine auch, das ist die beste Arbeits –

+0

Das ist, was ich getan habe. Ich verwende addInputPath in der SequenceFileInputFormat-Klasse, um alle Dateien hinzuzufügen, die ich "crush" hinzufügen und dann den Job ausführen möchte. – PhillipAMann

3

Sie sollten einen Blick auf File Crusher Open Source von media6degrees. Es könnte ein wenig veraltet sein, aber Sie können die Quelle herunterladen und Ihre Änderungen vornehmen und/oder beitragen. Das JAR und die Quelle sind in: http://www.jointhegrid.com/hadoop_filecrush/index.jsp

Dies ist im Wesentlichen eine Map-Reduce-Technik zum Zusammenführen kleiner Dateien.