2010-08-04 12 views
7

Mein Team hat mithilfe der Hadoop-Bibliotheken eine Java-Anwendung erstellt, um mehrere Eingabedateien in nützliche Ausgaben umzuwandeln. Angesichts der aktuellen Auslastung wird ein einzelner Multicore-Server für das kommende Jahr gut funktionieren. Wir müssen (noch) nicht auf einen Hadoop-Cluster mit mehreren Servern zurückgreifen, aber wir haben beschlossen, dieses Projekt "in Vorbereitung" zu starten.Ausführen einer eigenständigen Hadoop-Anwendung auf mehreren CPU-Kernen

Wenn ich diese App in der Befehlszeile (oder in Eclipse oder Netbeans) ausführen, konnte ich noch nicht davon überzeugen, mehr als eine Karte zu verwenden und/oder Thread gleichzeitig zu reduzieren. Angesichts der Tatsache, dass das Werkzeug sehr CPU-intensiv ist, ist diese "single threadedness" mein aktueller Flaschenhals.

Wenn ich es im Netbeans Profiler starte, sehe ich, dass die App mehrere Threads für verschiedene Zwecke startet, aber nur eine einzige Map/Reduce läuft im selben Moment.

Die Eingabedaten bestehen aus mehreren Eingabedateien, daher sollte Hadoop mindestens einen Thread pro Eingabedatei gleichzeitig für die Kartenphase ausführen können.

Was mache ich, um mindestens 2 oder sogar 4 aktive Threads laufen zu lassen (was für die meiste Verarbeitungszeit dieser Anwendung möglich sein sollte)?

Ich erwarte, dass dies etwas sehr albern ist, dass ich übersehen habe.


Ich habe gerade dies: https://issues.apache.org/jira/browse/MAPREDUCE-1367 Das die Funktion implementiert wurde ich für Hadoop in der Suche 0,21 Es führt die Flagge mapreduce.local.map.tasks.maximum es zu kontrollieren.

Für jetzt habe ich auch die beschriebene Lösung here in this question gefunden.

Antwort

5

Ich bin nicht sicher, ob ich richtig bin, aber wenn Sie Aufgaben im lokalen Modus ausführen, können Sie nicht mehrere Mapper/Reducer haben.

Wie dem auch sei, die maximale Anzahl der laufenden Mapper und Reduzierungen verwenden Konfigurationsoptionen mapred.tasktracker.map.tasks.maximum und mapred.tasktracker.reduce.tasks.maximum von Standard festlegen diese Optionen auf 2 gesetzt sind, so dass ich vielleicht richtig sein.

Schließlich, wenn Sie für Cluster mit vorbereitet werden möchten, gehen Sie direkt mit dieser voll verteilte Art und Weise in Laufen, aber haben alle Server (NameNode, DataNode, Tasktracker, Jobtracker, ...) auf einer einzigen Maschine laufen

+1

Danke, wegen Ihrer Beobachtung habe ich die Quelle heruntergeladen und habe das gegraben. Ich habe festgestellt, dass org.apache.hadoop.mapred.LocalJobRunner im lokalen Modus verwendet wird, um den Job tatsächlich auszuführen. Die run() Methode erledigt einfach alles sequentiell. Kein Threading überhaupt. Ich fand org.apache.hadoop.mapreduce.lib.map.MultithreadedMapper Ein sehr seltsames Feature: Eine Mapper-Implementierung, die außerhalb des eigentlichen Hadoop-Framework Threading führt. Nach der Dokumentation nur sinnvoll, wenn Sie nicht CPU-gebunden sind. Unser Werkzeug ist CPU-gebunden, so dass wir das nicht verwenden können. –

0

Gemäß this thread on the hadoop.core-user email list sollten Sie die Einstellung mapred.tasktracker.tasks.maximum auf die maximale Anzahl von Aufgaben ändern, die Ihr Computer verarbeiten soll (dies wäre die Anzahl der Kerne).

Diese (und andere Eigenschaften, die Sie konfigurieren möchten) ist auch in the main documentation on how to setup your cluster/daemons dokumentiert.

+2

Es gibt keine Option wie: 'mapred.tasktracker.tasks.maximum', es gibt separate Optionen für map und reduce:' mapred.tasktracker. {Map | reduce} .tasks.maximum', es ist unter dem zweiten Link den du hast Gesendet. – wlk

+0

meine Interpretation davon war, dass Sie "map" oder "reduzieren" oder keine haben könnten. Der E-Mail-Thread stammt aus dem Jahr 2007, aber der Autor von Hadoop erwähnt 'mapred.tasktracker.tasks.maximum'. –

+0

Nun, diese E-Mail stammt aus dem Jahr 2007, betrifft wahrscheinlich die Version vor 0,16 von Hadoop, da separate Optionen für Mapper und Reducer eingeführt wurden in 0.16 (und 0.16 wurde irgendwo um 2008 eingeführt) werfen Sie einen Blick auf: http://hadoop.apache.org/common/docs/r0.15.2/cluster_setup.html#Configuring+the+Hadoop+Daemons und http://hadoop.apache.org/common/docs/r0.16.0/cluster_setup.html#Configuring+the+Hadoop+Daemons – wlk

2

Nur zur Klarstellung ... Wenn Hadoop im lokalen Modus läuft, haben Sie keine parallele Ausführung auf einer Aufgabenebene (außer Sie laufen> = hadoop 0.21 (MAPREDUCE-1367)). Sie können zwar mehrere Jobs gleichzeitig einreichen und diese dann parallel ausführen.

All diese

mapred.tasktracker {Karte | reduzieren}. .tasks.maximal

Eigenschaften gelten nur für den Hadoop im verteilten Modus!

HTH Joahnnes

+0

Korrigieren. Die Art, wie ich es vor zwei Jahren (http://stackoverflow.com/questions/3546025/) ausgeführt habe, war, NUR einen Job und Tasktracker auszuführen. Das ist also nicht lokal und nur halbwegs pseudoverteilt. Dies macht die Verwendung mehrerer CPU-Kerne möglich, ohne dass das von Ihnen erwähnte 0.21-Feature verwendet wird. –

0

Was Sie tun möchten, ist in "pseudo-verteilt" -Modus Hadoop ausgeführt werden. Eine Maschine, aber Task-Tracker ausführen und Knoten benennen, als wäre es ein echter Cluster. Dann wird es (möglicherweise) mehrere Arbeiter führen.

Beachten Sie, dass Hadoop bei kleinen Eingaben entscheidet, dass eine Parallelisierung nicht sinnvoll ist. Möglicherweise müssen Sie es überreden, indem Sie die Standard-Split-Größe ändern.

Meiner Erfahrung nach sind "typische" Hadoop-Jobs I/O-gebunden, manchmal speichergebunden, lange bevor sie CPU-gebunden sind. Aus diesem Grund können Sie möglicherweise nicht alle Kerne auf einer Maschine vollständig nutzen.

+0

Für die CPU-gebundene Aufgabe, die diese Frage betraf (vor fast 2 Jahren), war es in Ordnung, sie auf mehreren CPU-Kernen ohne HDFS laufen zu lassen. Daher eine abgespeckte Form des "pseudo-verteilten" Modus. –

Verwandte Themen