2016-06-23 50 views
0

Ich werde mehrere kleine Textdateien etwa Größe von 10KB haben, hat verwirrt, wo diese Dateien in HBase oder in HDFS zu speichern. Was wird der optimierte Speicher sein? Weil ich in HBase speichern muss, muss ich es zuerst analysieren und dann gegen einen Zeilenschlüssel speichern. In HDFS kann ich direkt einen Pfad erstellen und diese Datei an diesem Speicherort speichern. Aber bis jetzt, was auch immer ich lese, es sagt, dass Sie nicht mehrere kleine Dateien haben sollten, anstatt weniger große Dateien zu erstellen. Aber ich kann diese Dateien nicht zusammenführen, so dass ich keine große Datei aus kleinen Dateien erstellen kann.Was ist der beste Ort, um mehrere kleine Dateien in hadoop zu speichern

Mit freundlichen Grüßen.

Antwort

0

Es ist kein Problem mit vielen kleinen verschiedenen Dateien. Wenn Sie zum Beispiel eine Tabelle in Hive mit vielen sehr kleinen Dateien in hdfs haben, ist es nicht optimal, diese Dateien in weniger große Dateien zusammenzufassen, da beim Lesen dieser Tabelle viele Mapper erstellt werden. Wenn Ihre Dateien völlig verschieden sind wie "Äpfel" und "Angestellte" und nicht zusammengeführt werden können, dann speichern Sie sie einfach wie sie sind.

2

Eine große Anzahl von kleinen Dateien passen nicht gut zu hadoop, da jede Datei ein hdfs-Block ist und jeder Block einen Mapper benötigt, der standardmäßig verarbeitet wird.

Es gibt mehrere Optionen/Strategien, um die Auswirkungen von kleinen Dateien zu minimieren, alle Optionen erfordern mindestens einmal kleine Dateien zu verarbeiten und sie in einem besseren Format zu "packen". Wenn Sie vorhaben, diese Dateien mehrmals zu lesen, könnte die Vorverarbeitung von kleinen Dateien sinnvoll sein, aber wenn Sie diese Dateien nur einmal verwenden, ist das egal. https://github.com/lalosam/HadoopInExamples/blob/master/src/main/java/rojosam/hadoop/CombinedInputWordCount/DriverCIPWC.java

CombineTextInputFormat Verwendung einen Mapper auf mehrere Dateien verarbeiten konnte aber benötigen, um die Dateien auf einen anderen DataNode zum Übertragen von Dateien zusammen zu stellen:

Um kleine Dateien, meine sugesstion verwenden CombineTextInputFormat (hier ein Beispiel) zu verarbeiten in der DAtaNode, wo die Karte läuft und könnte eine schlechte Leistung mit spekulativen Aufgaben haben, aber Sie können sie deaktivieren, wenn Ihr Cluster genug stabil ist.

Alternative kleine Dateien neu zu verpacken sind:

  1. Sequenzdateien erstellen, in dem jeder Datensatz einer der kleinen Dateien enthält. Mit dieser Option behalten Sie die Originaldateien bei.
  2. Verwenden Sie IdentityMapper und IdentityReducer, wenn die Anzahl der Reduzierungen kleiner als die Anzahl der Dateien ist. Dies ist der einfachste Ansatz, erfordert jedoch, dass jede Zeile in den Dateien gleich und unabhängig ist (keine Header oder Metadaten am Anfang der Dateien, die zum Verständnis des Rests der Datei erforderlich sind).
  3. Erstellen Sie eine externe Tabelle in Hive und fügen Sie dann alle Datensätze für diese Tabelle in eine neue Tabelle ein (INSERT INTO.. SELECT FROM...). Dieser Ansatz hat dieselben Einschränkungen wie die Option zwei und erfordert die Verwendung von Hive. Der Vorteil besteht darin, dass Sie kein MapReduce schreiben müssen.

Wenn Sie keine Dateien wie in Option 2 oder 3 fusionieren können, ist mein Vorschlag mit der Option gehen 1