2010-04-02 4 views
7

Derzeit implementiert PageRank auf Disco. Als iterativer Algorithmus werden die Ergebnisse einer Iteration als Eingabe für die nächste Iteration verwendet.Disco/MapReduce: Verwenden der Ergebnisse der vorherigen Iteration als Eingabe für eine neue Iteration

Ich habe eine große Datei, die alle Links darstellt, wobei jede Zeile eine Seite und die Werte in der Zeile die Seiten darstellt, zu denen sie verknüpft ist.

Für Disco, breche ich diese Datei in N Chunks und dann MapReduce für eine Runde. Als Ergebnis bekomme ich eine Reihe von (Seiten-, Rang-) Tupeln.

Ich möchte diesen Rang in die nächste Iteration einspeisen. Jetzt benötigt mein Mapper jedoch zwei Eingaben: die Graph-Datei und die Seitenzahlen.

  1. Ich mag würde zu „zip“ zusammen die Grafik-Datei und die Seite Reihen, , so dass jede Zeile eine Seite darstellt, ist es Rang, und es ist aus Links.
  2. Da dieser Graph-Datei in N Stücke getrennt ist, ich brauche den Pagerank Vektor in N parallel Stücke aufteilen und Reißverschluss über die Regionen der Pagerank Vektoren zum Graphen Brocken

Das alles scheint mehr Komplizierter als nötig, und als ziemlich einfache Operation (mit dem grundlegenden Mapreduce-Algorithmus) scheint mir etwas an Disco zu fehlen, das den Ansatz wirklich vereinfachen könnte.

Irgendwelche Gedanken?

Antwort

1

Es sieht so aus, als würden Sie eine init_map für den ersten Durchlauf und dann eine iter_map für jede nachfolgende Iteration verwenden.

Siehe: http://discoproject.org/doc/faq.html#id7

können Sie die Ausgabe Python-Objekt, das die outlinks umfassen, und nicht nur die (Seite Rang) Tupeln?

Eine andere Möglichkeit wäre, die Outlinks irgendwo nach Seiten zu codieren (dict, memcache, kyotocabinet, etc ...) und sie von der Mapping-Funktion abzurufen. Wenn Sie Dinge mit Disco verketten, glaube ich nicht, dass Sie die Dinge mitten im Workflow zusammenfügen möchten.

Verwandte Themen