Ich habe eine folgende Situation
Ich habe 3 Maschinencluster mit folgender Konfiguration.
Master
Slave 01
Slave 02
hadoop / conf / core-site.xml
%Vor%hadoop / conf / mapred-site.xml
%Vor%hadoop / conf / hdfs-site.xml
%Vor%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 map
Aufgaben - 100 reduce
Aufgaben - 01 number of documents = 10,000
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
Bitte helfen Sie mir zu verstehen, was ich tun muss, um dieses Problem zu lösen?
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.
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
Tags und Links java hadoop mapreduce hadoop-streaming