Tutorial do Spark GraphX ​​- Graph Analytics no Apache Spark



Este blog do tutorial do GraphX ​​apresentará o Apache Spark GraphX, seus recursos e componentes, incluindo um projeto de análise de dados de voo.

GraphX é a API do Apache Spark para gráficos e computação paralela a gráficos. GraphX ​​unifica processo ETL (Extract, Transform & Load), análise exploratória e computação gráfica iterativa em um único sistema. O uso de gráficos pode ser visto em amigos do Facebook, conexões do LinkedIn, roteadores de internet, relações entre galáxias e estrelas na astrofísica e no Google Maps. Embora o conceito de computação gráfica pareça muito simples, as aplicações de gráficos são literalmente ilimitadas com casos de uso em detecção de desastres, bancos, mercado de ações, bancos e sistemas geográficos, apenas para citar alguns.Aprender a usar esta API é uma parte importante do .Por meio deste blog, aprenderemos os conceitos do Spark GraphX, seus recursos e componentes por meio de exemplos e passaremos por um caso de uso completo de Flight Data Analytics usando GraphX.

Estaremos cobrindo os seguintes tópicos neste blog do Spark GraphX:





  1. O que são gráficos?
  2. Casos de uso de computação gráfica
  3. O que é Spark GraphX?
  4. Recursos do Spark GraphX
  5. Compreendendo o GraphX ​​com exemplos
  6. Caso de uso - Análise de dados de voo usando GraphX

O que são gráficos?

Um gráfico é uma estrutura matemática que corresponde a um conjunto de objetos em que alguns pares de objetos estão relacionados em algum sentido. Essas relações podem ser representadas usando arestas e vértices formando um gráfico. Os vértices representam os objetos e as arestas mostram as várias relações entre esses objetos.

Conceitos de gráfico - Tutorial do Spark GraphX ​​- EdurekaFigura: Tutorial do Spark GraphX ​​- vértices, arestas e trigêmeos em gráficos



Na ciência da computação, um gráfico é um tipo de dado abstrato que se destina a implementar o gráfico não direcionado e os conceitos de gráfico direcionado da matemática, especificamente o campo da teoria dos grafos. Uma estrutura de dados de gráfico também pode associar a cada aresta alguns valor de borda , como um rótulo simbólico ou um atributo numérico (custo, capacidade, comprimento,etc.).

Casos de uso de computação gráfica

Os casos de uso a seguir fornecem uma perspectiva da computação de gráfico e um escopo adicional para implementar outras soluções usando gráficos.

  1. Sistema de detecção de desastres

    Os gráficos podem ser usados ​​para detectar desastres como furacões, terremotos, tsunami, incêndios florestais e vulcões, a fim de fornecer alertas para alertar as pessoas.



  2. Ranking da página O Page Rank pode ser usado para encontrar os influenciadores em qualquer rede, como a rede de citações em papel ou rede de mídia social.
  3. Detecção de fraude financeira

    A análise gráfica pode ser usada para monitorar transações financeiras e detectar pessoas envolvidas em fraudes financeiras e lavagem de dinheiro.

  4. Análise de negócio

    Os gráficos, quando usados ​​junto com o aprendizado de máquina, ajudam a entender as tendências de compra do cliente. Por exemplo. Uber, McDonald's, etc.

  5. Sistemas de Informação Geográfica

    Os gráficos são intensamente usados ​​para desenvolver funcionalidades em sistemas de informações geográficas, como delineamento de bacias hidrográficas e previsão do tempo.

    java deep copy vs raso copy
  6. Google Pregel

    Pregel é a plataforma escalonável e tolerante a falhas do Google com uma API suficientemente flexível para expressar gráfico arbitrárioalgoritmos.

O que é Spark GraphX?

GraphX é a API Spark para gráficos e computação paralela a gráficos. Ele inclui uma coleção crescente de algoritmos e construtores de gráfico para simplificar as tarefas de analítica de gráfico.


GraphX ​​estende o Spark RDD com um Resilient Distributed Property Graph.
O gráfico de propriedades é um multigrafo direcionado que pode ter várias arestas em paralelo. Cada aresta e vértice têm propriedades definidas pelo usuário associadas a ele. As bordas paralelas permitem váriosrelações entre os mesmos vértices.

Recursos do Spark GraphX

A seguir estão os recursos do Spark GraphX:

  1. Flexibilidade :
    Spark GraphX ​​funciona com gráficos e cálculos. GraphX ​​unifica ETL (Extract, Transform & Load), análise exploratória e computação gráfica iterativa em um único sistema. Podemos visualizar os mesmos dados como gráficos e coleções, transformar e juntar gráficos com RDDs de forma eficiente e escrever algoritmos gráficos iterativos personalizados usando a API Pregel.
  2. Rapidez :
    O Spark GraphX ​​oferece desempenho comparável aos sistemas de processamento gráfico especializados mais rápidos. É comparável com os sistemas gráficos mais rápidos, mantendo a flexibilidade, tolerância a falhas e facilidade de uso do Spark.
  3. Biblioteca de Algoritmo em Crescimento :
    Podemos escolher em uma biblioteca crescente de algoritmos de gráfico que o Spark GraphX ​​tem a oferecer. Alguns dos algoritmos populares são classificação de página, componentes conectados, propagação de rótulo, SVD ++, componentes fortemente conectados econtagem de triângulo.

Compreendendo o GraphX ​​com exemplos

Agora vamos entender os conceitos do Spark GraphX ​​usando um exemplo. Vamos considerar um gráfico simples, conforme mostrado na imagem abaixo.

Figura: Tutorial do Spark GraphX ​​- Exemplo de gráfico

Olhando para o gráfico, podemos extrair informações sobre as pessoas (vértices) e as relações entre elas (arestas). O gráfico aqui representa os usuários do Twitter e quem eles seguem no Twitter. Por ex. Bob segue Davide e Alice no Twitter.

Vamos implementar o mesmo usando o Apache Spark. Primeiro, importaremos as classes necessárias para o GraphX.

// Importando as classes necessárias import org.apache.spark._ import org.apache.spark.rdd.RDD import org.apache.spark.util.IntParam import org.apache.spark.graphx._ import org.apache.spark .graphx.util.GraphGenerators

Exibindo vértices :Além disso, agora exibiremos todos os nomes e idades dos usuários (vértices).

val vertexRDD: RDD [(Long, (String, Int))] = sc.parallelize (vertexArray) val edgeRDD: RDD [Edge [Int]] = sc.parallelize (edgeArray) val graph: Graph [(String, Int), Int] = Graph (vertexRDD, edgeRDD) graph.vertices.filter {case (id, (name, age)) => age> 30} .collect.foreach {case (id, (name, age)) => println ( s '$ name is $ age')}

A saída para o código acima é a seguinte:

Davidé42 Franécinquenta Edé55 Charlieé65

Exibindo Bordas : Vamos ver qual pessoa gosta de quem no Twitter.

para (trigêmeo<- graph.triplets.collect) { println(s'${triplet.srcAttr._1} likes ${triplet.dstAttr._1}') } 

A saída para o código acima é a seguinte:

PrumogostosAlice PrumogostosDavid CharliegostosPrumo CharliegostosFran DavidgostosAlice EdgostosPrumo EdgostosCharlie EdgostosFran

Agora que entendemos os fundamentos do GraphX, vamos mergulhar um pouco mais fundo e realizar alguns cálculos avançados no mesmo.

Número de seguidores : Cada usuário em nosso gráfico possui um número diferente de seguidores. Vejamos todos os seguidores de cada usuário.

// Definindo uma classe para modelar mais claramente a classe de caso de propriedade do usuário User (name: String, age: Int, inDeg: Int, outDeg: Int) // Criando um gráfico de usuário val initialUserGraph: Graph [User, Int] = graph. mapVertices {case (id, (name, age)) => User (name, age, 0, 0)} // Preenchendo as informações do grau val userGraph = initialUserGraph.outerJoinVertices (initialUserGraph.inDegrees) {case (id, u, inDegOpt) => Usuário (u.name, u.age, inDegOpt.getOrElse (0), u.outDeg)} .outerJoinVertices (initialUserGraph.outDegrees) {case (id, u, outDegOpt) => Usuário (u.name, u.age, u.inDeg, outDegOpt.getOrElse (0))} para ((id, propriedade)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

A saída para o código acima é a seguinte:

Do utilizador 1é chamadoAlicee é apreciado por2pessoas. Do utilizador 2é chamadoPrumoe é apreciado por2pessoas. Do utilizador 3é chamadoCharliee é apreciado por1pessoas. Do utilizador 4é chamadoDavide é apreciado por1pessoas. Do utilizador 5é chamadoEde é apreciado por0pessoas. Do utilizador 6é chamadoFrane é apreciado por2pessoas.

Seguidores mais antigos : Também podemos classificar os seguidores por suas características. Vamos encontrar os seguidores mais antigos de cada usuário por idade.

// Encontrando o seguidor mais antigo para cada usuário val oldFollower: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// Para cada aresta enviar uma mensagem ao vértice de destino com o atributo da fonte vértice edge => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))), // Para combinar mensagens pegue a mensagem para o seguidor mais antigo (a, b) => if (a. _2> b._2) a else b)

A saída para o código acima é a seguinte:

Davidé o seguidor mais antigo deAlice. Charlieé o seguidor mais antigo dePrumo. Edé o seguidor mais antigo deCharlie. Prumoé o seguidor mais antigo deDavid. Ednão tem nenhum seguidor. Charlieé o seguidor mais antigo deFran. 

Caso de uso: análise de dados de voo usando Spark GraphX

Agora que entendemos os principais conceitos do Spark GraphX, vamos resolver um problema da vida real usando o GraphX. Isso nos ajudará a ter confiança para trabalhar em qualquer projeto Spark no futuro.

Declaração do Problema : Para analisar dados de voo em tempo real usando Spark GraphX, forneça resultados de computação quase em tempo real e visualize os resultados usando Google Data Studio.

Caso de uso - cálculos a serem feitos :

o que é um hashset java
  1. Calcule o número total de rotas de voo
  2. Calcular e classificar as rotas de voo mais longas
  3. Exibir o aeroporto com o vértice de grau mais alto
  4. Liste os aeroportos mais importantes de acordo com o PageRank
  5. Liste as rotas com os custos de voo mais baixos

Usaremos Spark GraphX ​​para os cálculos acima e visualizaremos os resultados usando o Google Data Studio.

Caso de uso - conjunto de dados :

Figura: Caso de uso - Conjunto de dados de voo nos EUA

Caso de uso - Diagrama de fluxo :

A ilustração a seguir explica claramente todas as etapas envolvidas em nossa Análise de Dados de Voo.

Figura: Caso de uso - diagrama de fluxo de análise de dados de voo usando Spark GraphX

Caso de uso - Implementação do Spark :

Seguindo em frente, agora vamos implementar nosso projeto usando Eclipse IDE para Spark.

Encontre o pseudo código abaixo:

// Importando as classes necessárias import org.apache.spark._ ... import java.io.File object airport {def main (args: Array [String]) {// Criando um Case Class Flight case class Flight (dofM: String, dofW: String, ..., dist: Int) // Definindo uma função Parse String para analisar a entrada na classe Flight def parseFlight (str: String): Flight = {val line = str.split (',') Flight (linha (0), linha (1), ..., linha (16) .toInt)} val conf = new SparkConf (). setAppName ('aeroporto'). setMaster ('local [2]') val sc = new SparkContext (conf) // Carregar os dados em um RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Analisar o RDD de linhas CSV em um RDD de classes de vôo val flightRDD = Map ParseFlight para Texto RDD // Criar aeroportos RDD com ID e Nome val aeroportos = Mapear Voo OriginID e Origem aeroportos.take (1) // Definindo um vértice padrão chamado nowhere e mapeando Airport ID para printlns val nowhere = 'nowhere' val airportMap = Usar função de mapa .collect.toList.toMap // Criar rotas RDD com sourceID, destinationID e distance val routes = flightsRDD. Use a função de mapa .distinct routes.take (2) // Criar bordas RDD com sourceID, destinationID e distance val edge = routes.map {(Map OriginID e DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} edge.take (1) // Define o gráfico e mostra alguns vértices e arestas val graph = Graph (Airports, Edges and Nowhere) graph.vertices.take (2) graph.edges.take (2) // Query 1 - Find número total de aeroportos val numairports = Número de vértices // Consulta 2 - Calcular o número total de rotas? val numroutes = Número de bordas // Consulta 3 - Calcule aquelas rotas com distâncias superiores a 1000 milhas graph.edges.filter {Get the edge distance) => distance> 1000} .take (3) // Similarmente escreva o código Scala para o consultas abaixo // Consulta 4 - Classifique e imprima as rotas mais longas // Consulta 5 - Exibir vértices de maior grau para voos de entrada e saída de aeroportos // Consulta 6 - Obtenha o nome do aeroporto com IDs 10397 e 12478 // Consulta 7 - Encontre o aeroporto com os voos de entrada mais altos // Consulta 8 - Encontre o aeroporto com os voos de saída mais altos // Consulta 9 - Encontre os aeroportos mais importantes de acordo com o PageRank // Consulta 10 - Classifique os aeroportos por classificação // Consulta 11 - Mostrar mais aeroportos importantes // Consulta 12 - Encontre as rotas com os custos de voo mais baixos // Consulta 13 - Encontre aeroportos e seus custos de voo mais baixos // Consulta 14 - Exibir códigos de aeroporto juntamente com os custos de voo mais baixos classificados

Caso de uso - Visualizando resultados :

Usaremos o Google Data Studio para visualizar nossa análise. O Google Data Studio é um produto do Google Analytics 360 Suite. Usaremos o serviço Geo Map para mapear os aeroportos em seus respectivos locais no mapa dos EUA e exibir a quantidade de métricas.

  1. Exibir o número total de voos por aeroporto
  2. Exibir a soma métrica das rotas de destino de cada aeroporto
  3. Exibir o atraso total de todos os voos por aeroporto

Agora, isso conclui o blog Spark GraphX. Espero que você tenha gostado de lê-lo e considerado informativo. Confira o próximo blog em nossa série Apache Spark sobre para estar pronto para o mercado no Apache Spark.

Recomendamos o seguinte Treinamento do Apache Spark | Vídeo de análise de dados de voo de Edureka para começar:

Treinamento do Apache Spark | Análise de dados de voo do Spark GraphX ​​| Edureka

Tem alguma questão para nós? Mencione isso na seção de comentários e entraremos em contato com você o mais breve possível.

Se você deseja aprender o Spark e construir uma carreira no domínio do Spark e construir experiência para realizar processamento de dados em grande escala usando RDD, Spark Streaming, SparkSQL, MLlib, GraphX ​​e Scala com casos de uso da vida real, confira nossos casos de uso interativo e ao vivo -conectados Aqui, que vem com suporte 24 horas por dia, 7 dias por semana para guiá-lo durante o período de aprendizado.

diferença entre git e github