Hadoop: Auftrag wird in kleineren Datenmengen ausgeführt, schlägt jedoch mit großen Datenmengen fehl

8

Ich habe eine folgende Situation

Ich habe 3 Maschinencluster mit folgender Konfiguration.

Master

%Vor%

Slave 01

%Vor%

Slave 02

%Vor%

hadoop / conf / core-site.xml

%Vor%

hadoop / conf / mapred-site.xml

%Vor%

hadoop / conf / hdfs-site.xml

%Vor%
  • Ich habe über 2 Millionen XML-Dokumente (jede Dokumentgröße ~ 400 KB)
  • map tasks öffnet jedes dieser xmls und gibt sie als JSON aus
  • reduce task ruft jede dieser JSON als Zeichenfolge ab, wendet eine Umwandlung an und gibt sie aus
  • nein. von map Aufgaben - 100
  • nein. von reduce Aufgaben - 01
  • Der gesamte Job läuft gut, wenn number of documents = 10,000
  • Wenn number of documents = 278262 fehlschlägt, schlägt der Job fehl und ich sehe verschiedene Probleme wie folgt

Auf WebUI

auf Slave-01, Slave-02

%Vor%

Ein Master

%Vor% %Vor%

Wenn ich Logs in slaves suche, habe ich das in hadoop-hduser-datanode-hadoop-01.log

gefunden %Vor%

Bitte helfen Sie mir zu verstehen, was ich tun muss, um dieses Problem zu lösen?

    
daydreamer 22.07.2012, 16:40
quelle

2 Antworten

14

Da Sie mehr als einen Reduzierer haben, schreiben Ihre Mapper Ausgaben auf die lokale Festplatte auf Ihren Slaves (im Gegensatz zu HDFS). Um genauer zu sein, schreiben Mapper nicht sofort auf die lokale Festplatte. Stattdessen puffern sie die Ausgabe im Speicher, bis sie einen Schwellenwert erreicht (siehe Konfigurationseinstellung "io.sort.mb"). Dieser Prozess wird als Verschütten bezeichnet. Ich denke, das Problem ist, dass Ihre Slaves nicht genügend Speicherplatz haben, um alle von Ihren Mappern generierten Daten zu speichern, wenn Hadoop versucht, auf die Festplatte zu übertragen.

Sie haben erwähnt, dass jeder Mapper eine JSON-Zeichenkette erzeugt. Angenommen, es ist ~ 100 KB pro Dokument (vielleicht sogar größer als das), würde es 278.262 x 100 KB = ~ 28 GB betragen und beide Ihrer Sklaven haben jeweils etwa 15 GB freien Speicherplatz.

Der einfachste Weg, denke ich, besteht darin, Ihre unmittelbare Ausgabe von Mappern mit den folgenden zwei Konfigurationseinstellungen zu komprimieren:

%Vor%

Da es sich bei Ihren Daten ausschließlich um JSON / Text-Daten handelt, werden Sie von jedem von Hadoop unterstützten Komprimierungsalgorithmus profitieren.

Wenn Ihre Dokumentgröße weit über 2 mil hinausgeht, sollten Sie überlegen, Ihrem Master mehr Speicher hinzuzufügen. Als Faustregel gilt, dass jede Datei / jedes Verzeichnis / jeder Block ungefähr 150 Bytes (oder 300 MB pro 1 Million Dateien) belegt. In Wirklichkeit würde ich jedoch 1 GB pro 1 Million Dateien reservieren.

    
Edenbauer 08.08.2012 01:54
quelle
0

Ich stieß auf das gleiche Problem (unter Mac OS X) und löste es, indem ich den folgenden Wert in mapred-site.xml festlegte

%Vor%

Ich habe dann die hadoop-Dienste bin/stop-all.sh beendet, den Ordner / usr / local / tmp / entfernt, den namenode bin/hadoop namenode -format formatiert und die hadoop-Dienste bin/start-all.sh

gestartet     
fjxx 24.02.2013 23:12
quelle