• No se han encontrado resultados

2.4 Resumen

3.1.3 Pregel

Muchos algoritmos iterativos de grafos se pueden describir en términos de las operaciones apli- cadas a los vértices del gráfico. Por ejemplo, el algoritmo de PageRank (Page et al., 1999) (Capítulo 2, Sección 2.3.3) aplica la misma operación para cada vértice del grafo. De hecho, la ecuación 2.1, del Capítulo 2 describe implícitamente las operaciones realizadas a cada vér-

1 p u b l i c c l a s s V e r t e x F u n c t i o n { 2 v o i d c o m p u t e ( L i s t m e s s a g e s ){ 3 if ( s u p e r s t e p < 30) { 4 f l o a t pr = 0; 5 for ( M e s s a g e m : m e s s a g e ) 6 pr += m . v a l u e (); 7 s e t V a l u e ( pr * 0 . 8 5 + 0 . 1 5 / N u m b e r O f V e r t i c e s ( ) ) ; 8 s e n d T o N e i g h b o r s ( c u r r e n t v e r t e x . p r _ s c o r e ); 9 } e l s e 10 h a l t (); 11 } 12 }

Listado de código 3.1: Ejemplo de PageRank bajo el modelo Pregel.

tice. El factorATPk−1 suma todas las puntuaciones de PageRank de los vértices entrantes (la transpuesta de la matriz de adyacenciaA indica los ejes entrantes). Luego, el algoritmo actual- iza la puntuación de PR actual de cada vértice utilizando los puntajes sumados de PR y penaliza su valor usando un parámetro α para producir la nueva puntuación. Como consecuencia, la

forma matricial puede ser vista como una función, a menudo llamada función de vértice, que se aplica a la totalidad o a un conjunto de vértices en el grafo. Los modelos de programación que requieren que el usuario defina algoritmos a través de funciones de vértices se les conoce comúnmente como un modelo centrados en el vértice y Pregel (Malewicz et al., 2010) es el más representativo de esta categoría. Además de presentar un modelo para el desarrollador, Pregel también especifica un framework para el procesamiento distribuido de grafos.

El listado de código 3.1 muestra una posible implementación del algoritmo de PageRank bajo el modelo Pregel. El procedimiento de cálculo del objeto VertexFunction se aplica a cada vértice. En este ejemplo, el vértice recibe las puntuaciones de relaciones públicas de los men- sajes entrantes, actualiza su puntuación de relaciones públicas, y envía el resultado a sus vértices vecinos. Por último, en el ejemplo de PageRank, cuando el algoritmo llega a 30 Superpasos, cada vértice llama a la funciónhalt, lo que indica que el cálculo está terminado y, como resul- tado, termina el algoritmo. En Pregel, este mecanismo de mensajería es muy importante para mantener la localidad de datos: en lugar de obtener datos de otros vértices – posiblemente ubi- cados en nodos remotos –, cada vértice envía los subresultados del algoritmo (por ejemplo su puntuación PR) a otros vértices. Entonces, cuando se ejecuta un vértice, los actuales resulta- dos de provenientes de otros vértices se presenta como una lista de mensajes. El framework subyacente que soporta el modelo de Pregel se explica a continuación.

Mensajes vértice a vértice y agregadores

Una función de vértice puede comunicar subresultados utilizando dos mecanismos: mensajería vértice a vértice y agregadores. Como se muestra en el ejemplo de PageRank 3.3, la mensajería

PR Score PR Score PR Score PR Score HaltAggregator PR PR PR PR

Figure 3.3: Ejemplo de cómputo de PageRank utilizando mensajes y agregadores.

vértice a vértice permite a cada vértice compartir el estado actual del cómputo con sus vecinos (aunque el mecanismo permite el envío de mensajes a cualquier vértice). Este tipo de comuni- cación se utiliza para compartir subresultados, por ejemplo la puntuación de PageRank.

El segundo mecanismo utilizado para procesar resultados corresponde al de los agregadores. Este mecanismo se utiliza para proporcionar información global (por ejemplo, contadores o estadísticas), gestionar condiciones de corte o mantener resultados compartidos. Por ejemplo, el algoritmo declustering k-meansproduce un conjunto de centroides que son globales al grafo y se actualizan en cada superpaso. Los centroides deben estar disponibles para todo el grafo porque todos los vértices deben calcular su distancia a ellos con el fin de actualizar su ubicación. Por lo tanto, el conjunto de centroides es un ejemplo de resultado global que no puede ser procesado usando mensajería vértice a vértice. Para modelar centroides, el desarrollador puede definir un agregador que administre la computación del centroide.

La Figura 3.3 representa otro ejemplo del uso de agregadores, que muestra una ejecución del algoritmo de PageRank donde se utilizan ambos mecanismos (vértice a vértice y agregadores). La puntuación de PR se envía a otros vértices utilizando mensajería vértice a vértice, pero el delta total de puntuación de PR (es decir, la diferencia de puntuación entre el superstep anterior y el actual) se combina en un agregador llamado HaltAggregator. En este ejemplo, el HaltAggregator se puede utilizar para detener la ejecución cuando el delta global de las puntuaciones de PR es menor que un determinadoε, es decir, el algoritmo ha convergido.

Componentes de Pregel

El framework Pregel se compone de dos tipos de componentes en tiempo de ejecución: los workers y un coordinador. Cadaworker se le asigna una partición del grafo y es responsable de la aplicación de la función de vértice a la totalidad o parte de los vértices dentro de su par- tición asignada. El coordinador (análogo almasteren MapReduce) es responsable de iniciar y coordinar la ejecución de losworkers.

Figure 3.4: Ejemplo de cómputo de BSP.

Una de las operaciones implícitas en los modelos Fork-Join y MapReduce es el de realizar la sincronización entre iteraciones. Esto significa que, cuando el algoritmo se ejecuta, se leen los valores actuales y se retornan los nuevos valores, pero nunca se sobreescriben aquellos valores que están siendo leídos. Para organizar la ejecución del algoritmo distribuido, Pregel utiliza una barrera de sincronización lógica que establece los límites de iteración y evita la lectura de valores inconsistentes. Esta técnica es un framework de procesamiento distribuido en sí mismo y se llama BSP (Bulk-Synchronous Parallel) (Valiant, 1990).

En BSP, cada iteración del algoritmo se llama un super paso, y se realiza el cómputo en- tre barreras de sincronización. Cuando un worker termina su cálculo, alcanza una barrera de sincronización y se bloquea hasta que la barrera sea levantada por el Coordinador. BSP tam- bién divide la ejecución delworkeren dos etapas: procesamiento y envío de mensajes. Durante la fase de procesamiento, los resultados intermedios se computan –y combinan– localmente en cadaworker. Durante el envío de mensajes, losworkerscomunican sus resultados intermedios a sus compañeros. Cuando todos los trabajadores terminan el envío de mensajes, la barrera se levanta y el siguiente superpaso puede comenzar. Un ejemplo de una ejecución BSP se muestra en la Figura 3.4.

Flujo de trabajo

El usuario puede enviar una función vértice a Pregel a través coordinador. Al recibir la solicitud del usuario, el coordinador instruye a losworkers para activar todos los vértices, tal como se muestra en el ejemplo en la Figura 3.5. En este contexto, un vértice se considera activo cuando forma parte del cómputo actual. Después de la fase de inicialización, el primer superpaso puede comenzar y el coordinador comanda a losworkers para aplicar la función vértice definida por el usuario sobre los vértices activos. Si un vértice ha completado el procesamiento para el resto del algoritmo, debe desactivarse invocando a la función "halt". Un vértice puede ser activado de nuevo externamente mediante el envío de un mensaje.

Cuando unworker termina su etapa de procesamiento, los resultados producidos son com- partidos con otros workers para que estén disponibles a nivel local para la próxima iteración. Como se ve en el ejemplo, algunosworkerspueden seguir procesando mientras otros están en-

W0 W1 W2 D0 D1 D2 Coordinador W0 W1 W2 D0 D1 D2 Coordinador W0 W1 W2 D0 D1 D2 Coordinador

Activar Vertices Datos de

Agregadores

Mensajes de Vértice

Etapa Inicial Etapa de Procesamiento Etapa de

Comunicacion/Procesamiento Datos de Agregadores W0 W1 W2 D0 D1 D2 Coordinador

iniciar siguiente superpaso +estado de agregadores

Etapa de Sincronización Superpaso

Figure 3.5: Ejemplo de etapas y comunicación de Pregel.

viando resultados. Se debe tener en cuenta, también, la diferencia entre los mensajes de vértice a vértice y los datos del agregador. Mientras que los mensajes de vértices implican una comu- nicación worker a worker, la naturaleza global del agregador requiere fusionar los resultados en una ubicación central, por ejemplo, en el Coordinador. Si los datos del agregador se pueden dividir por alguna clave, la fusión podría ser distribuida entre los workers(Han and Daudjee, 2015).

Cuando todos los workers completan el envío de mensajes, el siguiente superpaso puede comenzar. Antes de comenzar el superpaso nuevo, el coordinador envía una copia del estado de los agregadores a losworkers. En este nuevo paso, todos los vértices que recibieron un mensaje se consideran activos y, por tanto, están programados para su ejecución.

Desventajas

El modelo centrado en el vértice y, en particular, los sistemas basados en BSP tienen algunas desventajas. En primer lugar, el modelo restringe la forma en que los algoritmos pueden ser definidos. Diseñar un algoritmo desde el punto de vista del vértice no es una tarea sencilla debido a que los algoritmos de grafos se describen generalmente en términos de su matriz de adyacencia (recordemos el ejemplo PageRank dada anteriormente). El cambio de paradigma es muy propenso a errores y, en muchos casos, requiere la introducción de "ajustes" o "atajos" para compensar las limitaciones del modelo. Algunos ejemplos se presentan en las implementaciones de algunos algoritmos de enlace de predicción propuestos en los Capítulos 5 y 6.

Por otro lado, el modelo de procesamiento BSP introduce sus propios problemas. La restric- ción de que los trabajadores deben llegar a la barrera de la sincronización antes de comenzar el siguiente superpaso limita el rendimiento general al trabajador más lento. Incluso si los tra- bajadores ejecutan en nodos con hardware idéntico, el procesamiento asignado podría ser dese- quilibrado. Por ejemplo, en los grafos que siguen una distribución de ley de potencia, es decir, grafos donde hay muchos nodos con grado bajo y algunos nodos con grado alto, el tiempo de ejecución del superpaso dependerá de la forma en que los nodos de grado alto se distribuyen y

el tiempo que se tarda en procesarlos.

Frameworks basados en Pregel

Pregel es uno de los frameworks más influyentes que implementaron el modelo de programación centrado en el vértice. Muchos frameworks y modelos se basan en las ideas de Pregel. Por ejem- plo, GraphX (Xin et al., 2013) es un framework basado en BSP que cubre todo el flujo de trabajo sobre un grafo, es decir, la adquisición de datos, el particionado del grafo y el procesamiento subsiguiente. También proporciona una visualización del grafo en forma de tabla que permite al usuario operaciones de filtrado, asociación y combinación.

Otro framework centrado en el vértice, pero de código cerrado, es Trinity (Shao et al., 2012), un framework de procesamiento de grafos creado por Microsoft. Además de proporcionar una implementación basada en BSP, Trinity incluye capacidades de consulta de grafos y pasaje de mensajes a nivel de nodo computacional.

Algunos frameworks se originaron en el mundo académico. HipG (Hierarchycal Parallel Graph) (Krepska et al., 2011), por ejemplo, utiliza la noción de sincronizadores para modelar algoritmos y nodos para realizar cálculos centrados en el vértice. Cada sincronizador puede llamar de forma asíncrona a muchos nodos y luego usar una barrera que espera la finalización de la ejecución de los nodos. Los sincronizadores pueden anidar múltiples sincronizadores hijo, construyendo efectivamente una jerarquía de sincronizadores paralelos.

Finalmente, varias implementaciones open-source basadas en Pregel se encuentran disponibles públicamente, por ejemplo, Giraph6, jPregel7, GoldenOrb8y Phoebus9.