2010-12-27 17 views
3

Ich habe einen einfachen K-Means-Clustering-Code für Hadoop geschrieben (zwei separate Programme - Mapper und Reducer). Der Code arbeitet über einen kleinen Datensatz von 2d Punkten auf meiner lokalen Box. Es ist in Python geschrieben und ich möchte Streaming API verwenden.Iterative MapReduce

Ich möchte Vorschläge, wie Sie dieses Programm auf Hadoop am besten ausführen.

Nach jedem Lauf von Mapper und Reducer werden neue Zentren generiert. Diese Zentren werden für die nächste Iteration eingegeben.

Soweit ich sehen kann, muss jede mapreduce-Iteration ein separater mapreduce-Job sein. Und es sieht so aus, als würde ich ein weiteres Skript (Python/Bash) schreiben müssen, um die neuen Center aus HDFS nach jeder Reduktionsphase zu extrahieren und es dem Mapper wieder zuzuführen.

Irgendein einfacherer, weniger unordentlicher Weg? Wenn der Cluster zufällig einen fairen Scheduler verwendet, wird es sehr lange dauern, bis diese Berechnung abgeschlossen ist.

Antwort

0

Fühlt sich lustig an, meine eigene Frage zu beantworten. Ich habe PIG 0.9 verwendet (noch nicht veröffentlicht, aber im Kofferraum verfügbar). Dabei wird Modularität und Flusskontrolle unterstützt, indem PIG-Anweisungen in Skriptsprachen wie Python eingebettet werden können.

Also schrieb ich ein Haupt-Python-Skript, das eine Schleife hatte, und innerhalb dieser meine PIG-Skripte aufgerufen. Die PIG-Skripte haben Aufrufe an die UDFs getätigt. Also, musste drei verschiedene Programme schreiben. Aber es hat gut geklappt.

Sie das Beispiel hier überprüfen - http://www.mail-archive.com/[email protected]/msg00672.html

Für die Aufzeichnung wurden meine UDF auch in Python geschrieben, diese neue Funktion verwenden, das Schreiben von benutzerdefinierten Funktionen in Skriptsprachen ermöglicht.

0

Hier ein paar Möglichkeiten, es zu tun: github.com/bwhite/hadoop_vision/tree/master/kmeans

Überprüfen Sie auch dies heraus (hat oozie Unterstützung): http://bwhite.github.com/hadoopy/

1

Sie brauchen keinen anderen Job zu schreiben. Sie können denselben Job in eine Schleife (eine while-Schleife) einfügen und die Parameter des Jobs einfach ändern. Wenn der Mapper und Reducer ihre Verarbeitung abgeschlossen haben, beginnt die Steuerung mit der Erstellung einer neuen Konfiguration und Sie haben sie automatisch eine Eingabedatei, die die Ausgabe der vorherigen Phase ist.