• Aucun résultat trouvé

O. M.S  Une action (trop) ecace 

3.3 Conclusion

3.4.1 GraphBuilder

De iniciativa da Intel, o framework GraphBuilder (JAIN et al., 2013) pode ser integrado ao Hadoop, e oferece ferramentas para facilitar a construção de grafos, bem como para balancear a carga de processamento em MapReduce. Oferece uma abordagem similar às séries de extração, transformação e carga usadas com Data Warehouse, ou ETL (Extract Transform Load), visando garantir os requisitos de representação e catalogação de grafos.

Na extração, os dados são obtidos a partir de diversas fontes ou sistemas. O formato heterogêneo desses dados é considerado, convertendo-os em representação específica da constru- ção de grafos (tabela), permitindo o processamento da próxima etapa, que é a transformação. Na transformação, ocorre a aplicação das regras que visam limpar informações indevidas (como dados redundantes), unificando e padronizando. A parte da carga consiste em atribuir dados aos sistemas nas unidades de processamento, particionando, serializando e comprimindo grafos. Aqui, o aspecto crítico é o particionamento3, pois trata-se de um problema NP-difícil (XU et al., 2015; JAIN et al., 2013). Um método comum para partição do grafo consiste em dividir um conjunto V de vértices em k subconjuntos disjuntos balanceados, minimizando o total de arestas com extremidades em subconjuntos distintos (partições).

Nesse contexto, surgem duas abordagens: partição de grafos em modo offline (KARY- PIS; KUMAR, 1996) e partição de grafos em modo online (STANTON; KLIOT, 2012; TSOU- RAKAKIS et al., 2014). O primeiro requer como entrada todo o grafo para fornecer uma solução. O segundo assume que os vértices e arestas do grafo são carregados continuamente em um fluxo (FILIPPIDOU; KOTIDIS, 2015). Ao processar um vértice ou aresta, decisões sobre as partições de destino devem ser tanto quanto possível rápidas, minimizando computações. Particionamento onlineé necessário especialmente quando um grafo é grande o suficiente para não se encaixar em uma máquina, seja por armazenamento, seja por processamento. A ideia é utilizar um agente particionador que lê vértices e arestas em série, devendo imediatamente decidir sua partição destino. Essa alternativa não encontra uma solução ótima, mas é uma estratégia realística para conjuntos de dados grandes, que potencialmente atingem os limites computacionais da plataforma de execução alvo.

1 2 3 4 5 6 7 8 9 1 9 17 25 2 10 18 26 3 11 19 27 4 12 20 28 5 13 21 29 6 14 22 30 7 15 23 31 8 16 24 32 Fig a: Grid Fig b: Toro Fig c: exemplo corte de vértice work1 work2 work3

Figura 15 – Esquema de particionamento em grade (Fig a) e em tórus (Fig b). Exemplo de corte de vértice na Fig c. Fonte (JAIN et al., 2013).

O GraphBuilder adota o modo online, com cortes de vértices ao invés de arestas,

justificado pelos bons resultados obtidos em grafos cujos graus de vértices seguem a lei de potência(power-law function) (ABOU-RJEILI; KARYPIS, 2006), comum em grafos de larga escala, onde há muitos vértices com baixo grau e poucos vértices com alto grau. Apesar do corte de arestas apresentar balanceamento de carga satisfatório, também alcança pior caso em comunicação (GONZALEZ et al., 2012). Por exemplo, a divisão de vértices por função hash, usada na especificação do modelo Pregel, é vista como corte de arestas, pois não atribui um mesmo vértice para duas ou mais máquinas. O contrário ocorre com corte de vértices. É assinado um mesmo vértice para uma ou mais máquinas, sendo um deles o vértice real, e os demais são réplicas. De fato, o corte de vértices busca atribuir arestas às máquinas, enquanto o corte de arestas busca atribuir vértices (DOEKEMEIJER; VARBANESCU, 2014).

A estratégia usada no GraphBuilder é atribuir uma aresta e={u,v} a uma máquina A(e) ∈ {1, 2, 3, ..., p}, onde p é o número total de partições. Com o corte de vértices, há uma potencial replicação de vértices em um conjunto de máquinas, pois o vértice (representando cópia local) deve pertencer às arestas localizadas em várias partições, como observado no exemplo da Figura 15c, onde as cores vermelha, verde e azul representam a acomodação do vértice central em três máquinas, balanceando três arestas por máquina. Uma mudança em alguma aresta não necessita comunicação. Porém, alterações no vértice replicado envolve comunicação e atualização, mantendo a integridade. Visando essas replicações, considere o vértice v pertencente ao conjunto de máquinasA(v), onde A(v) ⊆ {1, 2, 3, ..., p}. O tamanho de |A(v)| é o número de replicação do vértice v no sistema distribuído, onde ∑v∈V|A(v)| deve ser minimizado (JAIN et al., 2013; GONZALEZ et al., 2012). Para isso, o framework conta com um esquema em grade (Figura 15a) ou em tórus (Figura 15b).

Veja o exemplo em grade para uma aresta e={u,v}:

• Se v é mapeado por uma função hash para o espaço 5, v pertence ao conjunto {2,4,5,6,8}, que é a representação linha/coluna;

• Se u é mapeado por uma função hash para 9, u pertence ao conjunto {3,6,7,8,9}; • Então, e={u,v} pertencerá a alguma máquina de intersecção 6 ou 8.

Exemplo do esquema em tórus para uma aresta e={u,v}:

• Se v é mapeado pela função hash para 25, v pertence ao conjunto {1, 9, 17, 25, 26, 27, 28, 29};

• Se u é mapeado pela função hash para 8, u pertence ao conjunto {1, 2, 3, 4, 8, 16, 24, 32}; • Então, e={u,v} pertencerá à intersecção representativa da máquina 1.

3.4.2 PowerGraph

PowerGraph introduz uma abstração capaz de suportar características do modelo Pregel e a consistência do GraphLab em sistemas distribuídos, visando uma nova forma de particionar e processar grafos grandes. As definições do PowerGraph são usadas para persistir e manter a consistência de subgrafos que são particionados através do corte de vértices, ao invés de arestas como é indicado em Pregel. Um vértice que recebe um corte possui espelhos somente leitura espalhados no cluster. O vértice principal, também chamado de master, fica na máquina que contém os dados. Por exemplo, o dado rank de um vértice em uma computação PageRank. Veja um esboço do processo na Figura 16. Trata-se de um modelo de computação e assincronismo denominado GAS, baseado nas seguintes operações:

• reunir (gather ou pull), que é o resultado de uma iteração mapreduce;

• soma (sum), uma operação realizada juntamente com reunir, visando agrupar mensagens acumuladas oriundas de vértices vizinhos4do vértice principal;

• aplicar (apply), que realiza a gravação de dados no vértice principal, e replica imediata- mente nos espelhos;

• espalhar (scatter), que envia mensagens para outros vértices se necessário, para nova iteração.

Por exemplo, para o algoritmo do SSSP (Single Source Shortest Path), dado um vértice v e uma distância dmin, os passos são: reunir e soma fazem respectivamente a obtenção e acumulação das distâncias mínimas que foram sugeridas pelos vizinhos de entrada de v; aplicar verifica se há alguma distância sugerida que seja menor que dmin, e em caso afirmativo, dmin local e de todos os vértices espelho são imediatamente atualizados; espalhar, se houve mudança em dmin, efetua-se o envio de mensagens para vizinhos de saída de v, sugerindo uma opção melhor de distância.