2013-10-24 10 views
9

Ich verwende hdfs -put, um eine große 20GB-Datei in hdfs zu laden. Derzeit läuft der Prozess @ 4 Minuten. Ich versuche, die Schreibzeit des Ladens von Daten in hdfs zu verbessern. Ich habe versucht, verschiedene Blockgrößen verwendet Schreibgeschwindigkeit zu verbessern, aber die folgenden Ergebnisse erhielt:Hadoop Put-Leistung - große Datei (20 GB)

512M blocksize = 4mins; 
256M blocksize = 4mins; 
128M blocksize = 4mins; 
64M blocksize = 4mins; 

Wer weiß, was der Engpass sein könnte und andere Optionen könnte ich erforschen Leistung des -Setzen cmd zu verbessern?

+0

parallele Kopie So ausführen es ist derzeit 80 MB/s. Untersuchen Sie die Festplatte und die Netzwerk-E/A. Kann deine Festplatte/Netzwerk besser sein? Was ist deine genaue Einstellung? Eine einzelne Maschine oder ein Cluster? – harpun

Antwort

12

20GB/4Minute kommt auf etwa 85MB/Sek. Das ist ein ziemlich vernünftiger Durchsatz, den man von einem einzelnen Laufwerk mit dem Overhead des HDFS-Protokolls und des Netzwerks erwarten kann. Ich wette, das ist dein Flaschenhals. Ohne deinen Ingest-Prozess zu ändern, wirst du das nicht magisch schneller machen können.

Das Kernproblem ist, dass 20 GB eine anständige Menge von Daten ist und diese Daten in HDFS als ein einziger Stream geschoben werden. Sie sind durch Festplatten-I/O eingeschränkt, was ziemlich lahm ist, wenn Sie eine große Anzahl von Festplatten in einem Hadoop-Cluster haben. Sie haben eine Weile Zeit, ein 10GigE-Netzwerk zu sättigen (und wahrscheinlich auch ein 1GigE).

Ändern der Blockgröße sollte dieses Verhalten nicht ändern, wie Sie gesehen haben. Es ist immer noch die gleiche Menge an Daten von Festplatte in HDFS.

Ich empfehle Ihnen, die Datei in 1 GB-Dateien aufzuteilen und sie auf mehrere Festplatten zu verteilen, dann schieben Sie sie mit -put parallel. Vielleicht möchten Sie sogar erwägen, diese Dateien auf mehrere Knoten aufzuteilen, wenn das Netzwerk zu einem Engpass wird. Können Sie die Art und Weise ändern, wie Sie Ihre Daten erhalten, um dies schneller zu machen? Offensichtliches Teilen der Datei und Verschieben der Datei wird ebenfalls Zeit benötigen.

9

Es hängt viel von den Details Ihrer Einrichtung ab. Zuerst wissen, dass 20GB in 4 Minuten 80MBps ist.

Der Engpass ist wahrscheinlich die Hardware Ihres lokalen Rechners oder seine Ethernet-Verbindung. Ich bezweifle, dass das Spielen mit Blockgröße Ihren Durchsatz erheblich verbessern wird.

Wenn Ihre lokale Maschine eine typische 7200rpm Festplatte hat, seine Platte Übertragungsrate zu puffern ist etwa 128 Mbps, was bedeutet, dass es in etwa 2.35 dass 20BG Datei in den Speicher geladen werden, könnte man 20GB unter der Annahme zu ersparen. Sie kopieren es jedoch nicht einfach in den Arbeitsspeicher, sondern streamen es aus dem Speicher in Netzwerkpakete. Daher ist es verständlich, dass Sie einen zusätzlichen Aufwand für die Verarbeitung dieser Aufgaben benötigen.

Siehe auch den Wikipedia-Eintrag auf wire speed, der eine schnelle Ethernet-Konfiguration bei 100 Mbit/s (~ 12 MB/s) setzt. Beachten Sie, dass in diesem Fall Fast Ethernet ein Begriff für eine bestimmte Gruppe von Ethernet-Standards ist. Sie erhalten eindeutig eine schnellere Rate als das. Die Drahtgeschwindigkeit ist ein gutes Maß, da sie alle Faktoren auf Ihrem lokalen Rechner berücksichtigt.

also lasst sie die verschiedenen Schritte in dem Streaming-Prozess auf dem lokalen Computer brechen:

  • ein Stück aus der Datei gelesen und in den Speicher laden. Komponenten: Festplatte, Speicher
  • Split und übersetzen Sie diesen Chunk in Pakete. Zuletzt habe ich gehört, dass Hadoop keine DMA Funktionen verwendet, daher werden diese Operationen von Ihrer CPU und nicht von der NIC durchgeführt. Komponenten: Speicher, CPU
  • Pakete an Hadoop-Dateiserver senden.Komponenten: NIC, Netzwerk

Ohne mehr über Ihre lokale Maschine zu kennen, ist es schwer, welche diese Komponenten zu spezifizieren der Engpass ist. Dies sind jedoch die Orte, an denen man mit der Bitrate beginnt.

2

Sie können verwenden distcp hadoop distcp -Ddfs.block.size = $ [256 * 1024 * 1024]/path/to/Eingangsdaten/path/to/Output

Verwandte Themen