2010-04-02 12 views
7

Actualmente estoy implementando PageRank en Disco. Como algoritmo iterativo, los resultados de una iteración se utilizan como entrada para la siguiente iteración.Disco/MapReduce: Uso de los resultados de la iteración anterior como entrada a la nueva iteración

Tengo un archivo grande que representa todos los enlaces, con cada fila que representa una página y los valores en la fila que representa las páginas a las que se vincula.

Para Disco, rompo este archivo en N trozos, luego ejecuto MapReduce por una ronda. Como resultado, obtengo un conjunto de tuplas (de página, rango).

Me gustaría dar este rango a la próxima iteración. Sin embargo, ahora mi asignador necesita dos entradas: el archivo de gráficos y los ejecutores de páginas.

  1. me gustaría "zip", junto el archivo gráfico y las filas de la página, tal manera que cada línea representa una página , que es el rango, y que está fuera de enlaces.
  2. Dado que este archivo gráfico se separa en N trozos, necesito dividir el vector pagerank en N trozos paralelos y código postal las regiones de los vectores pagerank a la gráfica trozos

Todo esto parece más más complicado de lo necesario, y como una operación bastante sencilla (con el algoritmo de reducción de mapas por excelencia), parece que me falta algo sobre Disco que realmente podría simplificar el enfoque.

¿Alguna idea?

Respuesta

1

Parece que querrá usar un mapa_inicio para el primer pase y luego un mapa_errador para cada iteración posterior.

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

Puede usted objeto pitón de salida que incluye los outlinks, en lugar de sólo las tuplas (página rango)?

Otra opción sería tener los enlaces externos codificados por página en alguna parte (dict, memcache, kyotocabinet, etc.) y buscarlos desde la función de asignación. Si estás encadenando cosas con Disco, no creo que quieras unir cosas en el medio del flujo de trabajo.