it-swarm.com.de

Anzahl der Kartenaufgaben festlegen und Aufgaben reduzieren

Ich führe derzeit einen Job aus. Ich habe die Anzahl der Map-Aufgaben auf 20 festgelegt, aber eine höhere Nummer erhalten. Ich habe auch die Reduzierungsaufgabe auf Null gesetzt, aber ich bekomme immer noch eine andere Zahl als Null. Die Gesamtzeit für den Abschluss des MapReduce-Jobs wird ebenfalls nicht angezeigt. Kann mir jemand sagen, was ich falsch mache ... Ich benutze diesen Befehl

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

Ausgabe:

11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164
11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18
11/07/30 19:48:56 INFO mapred.JobClient:   Job Counters 
11/07/30 19:48:56 INFO mapred.JobClient:     Launched reduce tasks=13
11/07/30 19:48:56 INFO mapred.JobClient:     Rack-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:     Launched map tasks=24
11/07/30 19:48:56 INFO mapred.JobClient:     Data-local map tasks=12
11/07/30 19:48:56 INFO mapred.JobClient:   FileSystemCounters
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_READ=4020792636
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_READ=1556534680
11/07/30 19:48:56 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=6026699058
11/07/30 19:48:56 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:   Map-Reduce Framework
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input groups=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Combine output records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map input records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce shuffle bytes=1974162269
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Spilled Records=120000000
11/07/30 19:48:56 INFO mapred.JobClient:     Map output bytes=1928893942
11/07/30 19:48:56 INFO mapred.JobClient:     Combine input records=0
11/07/30 19:48:56 INFO mapred.JobClient:     Map output records=40000000
11/07/30 19:48:56 INFO mapred.JobClient:     Reduce input records=40000000
[hcrc1425n30]s0907855: 
32
asembereng

Die Anzahl der Map-Tasks für einen bestimmten Job wird von der Anzahl der Eingabeaufteilungen und nicht vom Parameter mapred.map.tasks bestimmt. Für jeden Eingabesplit wird eine Map-Aufgabe erzeugt. Während der gesamten Lebensdauer eines Mapreduce-Jobs entspricht die Anzahl der Map-Tasks der Anzahl der Eingangssplits. mapred.map.tasks ist nur ein Hinweis auf das InputFormat für die Anzahl der Maps.

In Ihrem Beispiel hat Hadoop festgestellt, dass es 24 Eingabe-Splits gibt und insgesamt 24 Map-Aufgaben erzeugt werden. Sie können jedoch steuern, wie viele Map-Tasks von jedem Task-Tracker parallel ausgeführt werden können.

Wenn Sie nach -D ein Leerzeichen entfernen, kann das Problem möglicherweise reduziert werden.

Weitere Informationen zur Anzahl der Karten und zum Reduzieren von Aufgaben finden Sie in der folgenden URL

http://wiki.Apache.org/hadoop/HowManyMapsAndReduces

57
Praveen Sripati

Wie Praveen oben erwähnt hat, ist bei Verwendung der grundlegenden FileInputFormat-Klassen nur die Anzahl der Eingangssplits, aus denen die Daten bestehen. Die Anzahl der Reduzierungen ist wird durch mapred.reduce.tasks in der von Ihnen festgelegten Art gesteuert: -D mapred.reduce.tasks=10 würde 10 Reduzierungen angeben. Beachten Sie, dass das Leerzeichen nach -D erforderlich ist. Wenn Sie das Leerzeichen weglassen, wird die Konfigurationseigenschaft an die entsprechende JVM übergeben, nicht an Hadoop.

Geben Sie 0 an, weil es keine Reduzierungsarbeit gibt? In diesem Fall können Sie den Wert auch direkt im Code festlegen, wenn Sie Probleme mit dem Laufzeitparameter haben. Bei einer JobConf-Instanz job rufen Sie auf

job.setNumReduceTasks(0);

sagen wir, Ihre Implementierung von Tool.run. Das sollte Ausgabe direkt von den Mappern erzeugen. Wenn Ihr Job tatsächlich überhaupt keine Ausgabe liefert (weil Sie das Framework nur für Nebeneffekte wie Netzwerkaufrufe oder Bildverarbeitung verwenden oder wenn die Ergebnisse vollständig in Counter-Werten berücksichtigt werden), können Sie die Ausgabe auch durch Aufrufen deaktivieren

job.setOutputFormat(NullOutputFormat.class);
19
Matt Tenenbaum

Es ist wichtig zu wissen, dass das MapReduce-Framework in Hadoop nur das zulässt 

vorschlagen Anzahl der Map-Aufgaben für einen Job

die wie Praveen oben ausgeführt wurde, entspricht der Anzahl der Eingabeaufteilungen für die Aufgabe. Anders als bei der Anzahl der Reduktionen (die direkt mit der Anzahl der vom MapReduce-Job ausgegebenen Dateien zusammenhängt) können wir dies tun 

Nachfrage dass es n Reduzierungen gibt.

9
Engineiro

Um es mit einem Beispiel zu erklären:

Angenommen, die Größe Ihrer hadoop-Eingabedatei beträgt 2 GB, und Sie legen die Blockgröße auf 64 MB fest, sodass 32 Mapper-Aufgaben ausgeführt werden, während jeder Mapper einen 64-MB-Block verarbeitet, um den Mapper-Job Ihres Hadoop-Jobs abzuschließen.

==> Die Anzahl der für die Ausführung festgelegten Mappers hängt vollständig von 1) Dateigröße und 2) Blockgröße ab

Angenommen, Sie haben hadoop auf einer Clustergröße von 4: .__ ausgeführt. Nehmen Sie an, Sie setzen die Parameter mapred.map.tasks und mapred.reduce.tasks in Ihrer conf-Datei wie folgt für die Knoten: 

Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2
Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4
Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1

Angenommen, Sie legen die obigen Parameter für 4 Ihrer Knoten in diesem Cluster fest. Wenn Sie feststellen, dass der Knoten 2 nur 2 bzw. 2 festgelegt hat, weil die Verarbeitungsressourcen des Knotens 2 möglicherweise geringer sind (z. B. 2 Prozessoren, 2 Kerne) und der Knoten 4 sogar auf 1 oder 1 niedriger eingestellt ist, liegt möglicherweise an Verarbeitungsressourcen Auf diesem Knoten befinden sich 1 Prozessor, 2 Kerne, daher können nicht mehr als 1 Mapper- und 1 Reduktionsaufgabe ausgeführt werden.

Wenn Sie den Job ausführen, sind Knoten 1, Knoten 2, Knoten 3, Knoten 4 so konfiguriert, dass max. insgesamt (4 + 2 + 4 + 1) 11 Mapper-Tasks gleichzeitig aus 42 Mapper-Tasks, die vom Job abgeschlossen werden müssen. Nachdem jeder Knoten seine Map-Aufgaben abgeschlossen hat, werden die verbleibenden Mapper-Aufgaben in 42 Mapper-Aufgaben übernommen.

Wenn Sie nun mapred.reduce.tasks = 0 setzen, erhalten Sie jetzt nur noch Reduzierungen, so dass wir nur in 42 Dateien (1 Datei für jede Mapper-Aufgabe) eine Mapper-Ausgabe und keine Reduktionsausgabe erhalten.

7
praveenak

In der neueren Version von Hadoop gibt es viel mehr mapreduce.job.running.map.limit und mapreduce.job.running.reduce.limit, wodurch Sie die Mapper- und Reducer-Anzahl unabhängig von der Größe der HDFS-Datei aufteilen können. Dies ist hilfreich, wenn Sie unter dem Zwang stehen, keine großen Ressourcen im Cluster zu belegen.

JIRA

2
Joel

Aus Ihrem Protokoll habe ich verstanden, dass Sie 12 Eingabedateien haben, da 12 lokale Karten generiert werden. Lokale Rack-Karten werden für dieselbe Datei erstellt, wenn sich einige Blöcke dieser Datei in einem anderen Datenknoten befinden. Wie viele Datenknoten haben Sie?

1
Sandeep

Die Anzahl der Map-Aufgaben wird direkt durch die Anzahl der Chunks definiert, für die Ihre Eingabe aufgeteilt wird. Die Größe des Datenblocks (d. H. HDFS-Blockgröße) ist steuerbar und kann für eine einzelne Datei, einen Dateisatz, ein Verzeichnis (-s) festgelegt werden. Das Festlegen einer bestimmten Anzahl von Map-Tasks in einem Job ist möglich, erfordert jedoch das Einstellen einer entsprechenden HDFS-Blockgröße für die Eingabedaten des Jobs. mapred.map.tasks kann auch dafür verwendet werden, jedoch nur, wenn der angegebene Wert größer als die Anzahl der Aufteilungen für die Eingabedaten des Jobs ist.

Die Anzahl der Reduzierungen über mapred.reduce.tasks steuern ist korrekt. Die Einstellung auf Null ist jedoch ein Sonderfall: Die Ausgabe des Jobs ist eine Verkettung der Ausgaben der Mapper (nicht sortiert). In Matts Antwort sieht man mehr Möglichkeiten, die Anzahl der Reduzierstücke einzustellen.

1
Denis

In Ihrem Beispiel werden die -D Teile nicht abgeholt:

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0

Sie sollten nach dem Klassennamen wie folgt kommen:

hadoop jar Test_Parallel_for.jar Test_Parallel_for -Dmapred.map.tasks=20 -Dmapred.reduce.tasks=0 Matrix/test4.txt Result 3

Ein Leerzeichen nach -D ist jedoch erlaubt.

Beachten Sie auch, dass das Ändern der Anzahl der Mapper wahrscheinlich eine schlechte Idee ist, wie andere hier erwähnt haben.

1
Bert Hekman

Der erste Teil wurde bereits beantwortet: "Nur ein Vorschlag" Der zweite Teil wurde ebenfalls beantwortet: "Entfernen Sie zusätzliche Leerzeichen um =" Wenn beide nicht funktionieren, haben Sie ToolRunner

0
killjoy

Die Anzahl der Map-Aufgaben hängt von der Dateigröße ab. Wenn Sie n Map-Nummer verwenden möchten, teilen Sie die Dateigröße wie folgt durch n: 

conf.set("mapred.max.split.size", "41943040"); // maximum split file size in bytes
conf.set("mapred.min.split.size", "20971520"); // minimum split file size in bytes
0
Victor

Ich bin damit einverstanden, dass die Anzahl der Zuordnungsaufträge von der Eingabeaufteilung abhängt, aber in einigen Szenarien konnte ich feststellen, dass es etwas anders ist 

fall-1 Ich habe eine einfache Mapp-Aufgabe erstellt, nur dass 2 Ausgabedateien doppelt erstellt werden (Daten ia gleich) Befehl, den ich unten gab

bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -D mapred.reduce.tasks = 0-input /home/sample.csv -output /home/sample_csv112.txt -mapper/home/amitav/workpython /readcsv.py

Fall-2 Also habe ich die Mapp-Aufgabe auf 1 zurückgesetzt, und der Ausgabedatei wurde mit einer Ausgabedatei korrekt ausgegeben, aber ein Reduzierer setzte sich auch im UI-Bildschirm zusammen, obwohl ich den Reduziererauftrag eingeschränkt hatte. Der Befehl ist unten angegeben.

bin/hadoop jar contrib/streaming/hadoop-streaming-1.2.1.jar -D mapred.map.tasks = 1 mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv115.txt - mapper /home/amitav/workpython/readcsv.py

0
amitav Swain

Eine Möglichkeit, die Anzahl der Mapper zu erhöhen, besteht darin, Ihre Eingabe in Form von aufgeteilten Dateien zu geben [Sie können den Linux-Split-Befehl verwenden]. Beim Hadoop-Streaming werden normalerweise so viele Mapper zugewiesen, da Eingabedateien vorhanden sind (wenn eine große Anzahl von Dateien vorhanden ist). Andernfalls wird versucht, die Eingabe in gleich große Teile aufzuteilen.

0
viper
  • Verwenden Sie -D property = value anstelle von -D property = value (beseitigen Sie Zusätzliche Whitespaces). Damit funktioniert -D mapred.reduce.tasks = value Fine. 

  • Das Festlegen der Anzahl der Map-Aufgaben spiegelt nicht immer den Wert wider, den Sie festgelegt haben, da sie von der Aufteilungsgröße und dem verwendeten InputFormat abhängt.

  • Durch das Festlegen der Anzahl der Reduzierungen wird die Anzahl von Auf jeden Fall überschrieben, die für die cluster-/clientseitige Konfiguration festgelegt ist.

0
Shailvi