No dia 29/01/2020, o colega do BioBD Diogo Munaro fez uma apresentação sobre Apache Spark. Os slides estão aqui e o vídeo aqui.
Em termos de anotações gerais temos:
- O Spark faz parte de versões mais recentes do Hadoop, na 1.0 só tinha MapReduce e HDFS, na 2.0 foi acrescentado o suporte a outros data processing e ao YARN (gerenciamento de cluster)
- MapReduce é um paradigma de programação paralela da Google, a Yahoo fez um implementação e colocou público
- HDFS tem API para comunicação direta
- Suporte a várias linguagens (Scala, R,Java, Python) e Conectores para Data Sources (API)
- Conceito de dataframe, é igual a uma planilha
Um dos componentes que me interessou foi o Graph. Nesse componente o grafo é representado por duas tabelas: Vértices (com suas propriedades) e Arestas (v1, v2, aresta). Nessa representação é possível representar um multigrafo direcionado, próximo ao modelo LPG porém sem propriedades nas arestas.
Um
operação me chamou a atenção, trata-se da necessidade de inicializar os
atributos não definidos com valores NULOS. Acredito que esteja
relacionado com o conceito de Data Frames (os dados são representados na
forma tabular, ou seja, tabelas).
Nesse link tem algumas operações possíveis usando a linguagem Scala com o GraphX como ferramenta para Graph Analytics.
A vantagem de uso do Spark+GraphX em relação estaria expressa no seguinte trecho:
The goal of the GraphX project is to unify graph-parallel and data-parallel computation in one system with a single composable API. The GraphX API enables users to view data both as graphs and as collections (i.e., RDDs) without data movement or duplication. By incorporating recent advances in graph-parallel systems, GraphX is able to optimize the execution of graph operations.
O componente fornece as classes vertices, Edge e EdgeTriplet
(que estende a Edge). Permite utilizar o pardigma MapReduce para as
análise, oferece funções específicas para esse tipo de dados como por
exemplo achar um subgrafo que atenda a determinados critérios, gerar o
grafo reverso e até mesmo algoritmos como PageRank, Componentes Conexas e
Contagem de Triângulos.
Na documentação completa, disponível aqui, é possível entender a classe EdgeTriplet através do comando SQL que faz a junção das tabelas que representam os vértices e as arestas:
SELECT src.id, dst.id, src.attr, e.attr, dst.attr
FROM edges AS e LEFT JOIN vertices AS src, vertices AS dst
ON e.srcId = src.Id AND e.dstId = dst.Id
Até o momento não testei essa solução. Tenho usado somente o Jupyter Notebook.
ResponderExcluirComecei a testar o toolkit KGTK por sugestão do professor Daniel Schwabe. O GraphX não permite também a manipulação de hipergrafos uma vez que as arestas não possuem ids para serem consideradas como vértices de outras arestas.
ResponderExcluir