Spark GraphX-zelfstudie - Graph Analytics in Apache Spark



Deze GraphX ​​Tutorial-blog laat je kennismaken met Apache Spark GraphX, zijn functies en componenten, waaronder een Flight Data Analysis-project.

GraphX is Apache Spark's API voor grafieken en grafiekparallelle berekeningen. GraphX ​​verenigt ETL-proces (Extract, Transform & Load), verkennende analyse en iteratieve grafiekberekening binnen één systeem. Het gebruik van grafieken is te zien in de vrienden van Facebook, de connecties van LinkedIn, de routers op internet, de relaties tussen sterrenstelsels en sterren in de astrofysica en Google Maps. Hoewel het concept van het berekenen van grafieken heel eenvoudig lijkt, zijn de toepassingen van grafieken letterlijk grenzeloos met gebruikssituaties in het opsporen van rampen, het bankwezen, de aandelenmarkt, het bankwezen en geografische systemen om er maar een paar te noemen.Het leren gebruiken van deze API is een belangrijk onderdeel van de .Via deze blog leren we de concepten van Spark GraphX, de functies en componenten ervan aan de hand van voorbeelden en doorlopen we een volledige use case van Flight Data Analytics met GraphX.

We zullen de volgende onderwerpen behandelen in deze Spark GraphX-blog:





  1. Wat zijn grafieken?
  2. Gebruik voorbeelden van grafische berekeningen
  3. Wat is Spark GraphX?
  4. Spark GraphX-functies
  5. GraphX ​​begrijpen met voorbeelden
  6. Use Case - Flight Data Analysis met GraphX

Wat zijn grafieken?

Een grafiek is een wiskundige structuur die neerkomt op een set objecten waarin enkele paren van de objecten in zekere zin met elkaar verband houden. Deze relaties kunnen worden weergegeven met behulp van randen en hoekpunten die een grafiek vormen. De hoekpunten vertegenwoordigen de objecten en de randen geven de verschillende relaties tussen die objecten weer.

Graph Concepts - Spark GraphX-zelfstudie - EdurekaFiguur: Spark GraphX ​​Tutorial - Hoekpunten, randen en tripletten in grafieken



In de informatica is een grafiek een abstract gegevenstype dat bedoeld is om de ongerichte graaf- en gerichte graafconcepten uit de wiskunde te implementeren, met name op het gebied van de grafentheorie. Een gegevensstructuur van een grafiek kan ook aan elke rand worden gekoppeld randwaarde , zoals een symbolisch label of een numeriek kenmerk (kosten, capaciteit, lengte,enzovoort.).

Gebruik voorbeelden van grafische berekeningen

De volgende use-cases geven een perspectief op het berekenen van grafieken en meer mogelijkheden om andere oplossingen met grafieken te implementeren.

  1. Rampdetectiesysteem

    Grafieken kunnen worden gebruikt om rampen zoals orkanen, aardbevingen, tsunami's, bosbranden en vulkanen op te sporen om mensen te waarschuwen.



    verschil tussen methode overbelasting en methode overschrijven
  2. Paginabeoordeling Page Rank kan worden gebruikt om de influencers in elk netwerk te vinden, zoals een paper-citation-netwerk of een social media-netwerk.
  3. Opsporing van financiële fraude

    Grafiekanalyse kan worden gebruikt om financiële transacties te volgen en mensen te detecteren die betrokken zijn bij financiële fraude en het witwassen van geld.

  4. Bedrijfsanalyse

    Wanneer grafieken samen met Machine Learning worden gebruikt, helpen ze de aankooptrends van klanten te begrijpen. Bijv. Uber, McDonald's, enz.

  5. Geografische Informatie Systemen

    Grafieken worden intensief gebruikt om functionaliteiten op geografische informatiesystemen te ontwikkelen, zoals afbakening van stroomgebieden en weersvoorspelling.

  6. Google Pregel

    Pregel is het schaalbare en fouttolerante platform van Google met een API die voldoende flexibel is om willekeurige grafieken weer te gevenalgoritmen.

Wat is Spark GraphX?

GraphX is de Spark API voor grafieken en grafiekparallelle berekeningen. Het bevat een groeiende verzameling grafiekalgoritmen en builders om grafiekanalysetaken te vereenvoudigen.


GraphX ​​breidt de Spark RDD uit met een Resilient Distributed Property Graph.
De eigenschappengrafiek is een gerichte multigraaf die meerdere parallelle randen kan hebben. Aan elke rand en hoekpunt zijn door de gebruiker gedefinieerde eigenschappen gekoppeld. De parallelle randen laten meerdere toerelaties tussen dezelfde hoekpunten.

Spark GraphX-functies

De volgende zijn de kenmerken van Spark GraphX:

  1. Flexibiliteit :
    Spark GraphX ​​werkt met zowel grafieken als berekeningen. GraphX ​​verenigt ETL (Extract, Transform & Load), verkennende analyse en iteratieve grafiekberekening binnen één systeem. We kunnen dezelfde gegevens bekijken als zowel grafieken als verzamelingen, grafieken efficiënt transformeren en samenvoegen met RDD's en aangepaste iteratieve grafiekalgoritmen schrijven met behulp van de Pregel API.
  2. Snelheid :
    Spark GraphX ​​biedt vergelijkbare prestaties als de snelste gespecialiseerde grafische verwerkingssystemen. Het is vergelijkbaar met de snelste grafische systemen met behoud van Spark's flexibiliteit, fouttolerantie en gebruiksgemak.
  3. Groeiende algoritmebibliotheek :
    We kunnen kiezen uit een groeiende bibliotheek met grafische algoritmen die Spark GraphX ​​te bieden heeft. Enkele van de populaire algoritmen zijn paginarangschikking, verbonden componenten, labelpropagatie, SVD ++, sterk verbonden componenten endriehoek tellen.

GraphX ​​begrijpen met voorbeelden

We zullen nu de concepten van Spark GraphX ​​begrijpen aan de hand van een voorbeeld. Laten we eens kijken naar een eenvoudige grafiek zoals weergegeven in de onderstaande afbeelding.

Figuur: Spark GraphX-zelfstudie - Grafiekvoorbeeld

Als we naar de grafiek kijken, kunnen we informatie over de mensen (hoekpunten) en de relaties daartussen (randen) extraheren. De grafiek hier geeft de Twitter-gebruikers weer en wie ze volgen op Twitter. Voor b.v. Bob volgt Davide en Alice op Twitter.

Laten we hetzelfde implementeren met Apache Spark. Eerst zullen we de nodige klassen voor GraphX ​​importeren.

// De noodzakelijke klassen importeren 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

Vertices weergeven :Verder zullen we nu alle namen en leeftijden van de gebruikers (hoekpunten) weergeven.

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

De uitvoer voor de bovenstaande code is als volgt:

Davidis42 Franisvijftig Edis55 Charlieis65

Randen weergeven : Laten we eens kijken welke persoon wie leuk vindt op Twitter.

voor (triplet<- graph.triplets.collect) { println(s'${triplet.srcAttr._1} likes ${triplet.dstAttr._1}') } 

De uitvoer voor de bovenstaande code is als volgt:

BoblikesAlice BoblikesDavid CharlielikesBob CharlielikesFran DavidlikesAlice EdlikesBob EdlikesCharlie EdlikesFran

Nu we de basis van GraphX ​​hebben begrepen, gaan we wat dieper duiken en wat geavanceerde berekeningen uitvoeren.

Aantal volgers : Elke gebruiker in onze grafiek heeft een ander aantal volgers. Laten we eens kijken naar alle volgers voor elke gebruiker.

// Een klasse definiëren om de casusklasse van de gebruikerseigenschap duidelijker te modelleren User (naam: String, leeftijd: Int, inDeg: Int, outDeg: Int) // Een gebruiker maken Graph val initialUserGraph: Graph [User, Int] = graph. mapVertices {case (id, (naam, leeftijd)) => Gebruiker (naam, leeftijd, 0, 0)} // De graadinformatie invullen val userGraph = initialUserGraph.outerJoinVertices (initialUserGraph.inDegrees) {case (id, u, inDegOpt) => Gebruiker (u.name, u.age, inDegOpt.getOrElse (0), u.outDeg)} .outerJoinVertices (initialUserGraph.outDegrees) {case (id, u, outDegOpt) => Gebruiker (u.name, u.age, u.inDeg, outDegOpt.getOrElse (0))} voor ((id, eigenschap)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

De uitvoer voor de bovenstaande code is als volgt:

Gebruiker eenwordt genoemdAliceen is geliefd bij2mensen. Gebruiker 2wordt genoemdBoben is geliefd bij2mensen. Gebruiker 3wordt genoemdCharlieen is geliefd bijeenmensen. Gebruiker 4wordt genoemdDaviden is geliefd bijeenmensen. Gebruiker 5wordt genoemdEden is geliefd bij0mensen. Gebruiker 6wordt genoemdFranen is geliefd bij2mensen.

Oudste volgers : We kunnen de volgers ook sorteren op hun kenmerken. Laten we de oudste volgers van elke gebruiker op leeftijd zoeken.

// Zoek de oudste volger voor elke gebruiker val oudsteVolger: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// Stuur voor elke rand een bericht naar het doelpunt met het attribuut van de bron vertex edge => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))), // Om berichten te combineren, neem je het bericht voor de oudere volger (a, b) => if (a. _2> b._2) a anders b)

De uitvoer voor de bovenstaande code is als volgt:

Davidis de oudste volgeling vanAlice. Charlieis de oudste volgeling vanBob. Edis de oudste volgeling vanCharlie. Bobis de oudste volgeling vanDavid. Edheeft geen volgers. Charlieis de oudste volgeling vanFran. 

Use Case: Flight Data Analysis met Spark GraphX

Nu we de kernconcepten van Spark GraphX ​​hebben begrepen, kunnen we een realistisch probleem oplossen met GraphX. Dit zal ons het vertrouwen geven om in de toekomst aan Spark-projecten te werken.

Probleemstelling : Om realtime vluchtgegevens te analyseren met Spark GraphX, levert u bijna realtime berekeningsresultaten op en visualiseert u de resultaten met Google Data Studio.

Use Case - Uit te voeren berekeningen :

  1. Bereken het totale aantal vliegroutes
  2. Bereken en sorteer de langste vliegroutes
  3. Geef de luchthaven weer met de hoogste hoekpunt
  4. Maak een lijst van de belangrijkste luchthavens volgens PageRank
  5. Maak een lijst van de routes met de laagste vluchtkosten

We zullen Spark GraphX ​​gebruiken voor de bovenstaande berekeningen en de resultaten visualiseren met Google Data Studio.

Use Case - Dataset :

Figuur: Use Case - USA Flight Dataset

Gebruiksvoorbeeld - Stroomschema :

De volgende illustratie legt duidelijk alle stappen uit die betrokken zijn bij onze vluchtgegevensanalyse.

Figuur: Use Case - Stroomdiagram van Flight Data Analysis met Spark GraphX

Use Case - Spark-implementatie :

Laten we nu ons project implementeren met behulp van Eclipse IDE voor Spark.

Zoek de pseudo-code hieronder:

// De noodzakelijke klassen importeren import org.apache.spark._ ... import java.io.File object airport {def main (args: Array [String]) {// Een Case Class Flight maken case class Flight (dofM: String, dofW: String, ..., dist: Int) // Een Parse String-functie definiëren om invoer in Flight class te parseren def parseFlight (str: String): Flight = {val line = str.split (',') Flight (regel (0), regel (1), ..., regel (16) .toInt)} val conf = nieuwe SparkConf (). setAppName ('luchthaven'). setMaster ('local [2]') val sc = new SparkContext (conf) // Laad de gegevens in een RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Parseer de RDD van CSV-regels in een RDD van vluchtklassen val flightsRDD = Map ParseFlight to Text RDD // Maak luchthavens RDD aan met ID en naam val luchthavens = Map Flight OriginID en Origin airports.take (1) // Definieer een standaard hoekpunt genaamd nergens en mapping luchthaven ID voor printlns val nergens = 'nergens' val airportMap = Gebruik de kaartfunctie .collect.toList.toMap // Maak routes RDD met sourceID, destinationID en afstand val routes = flightsRDD. Gebruik kaartfunctie .distinct routes.take (2) // Creëer randen RDD met sourceID, destinationID en afstand valranden = routes.map {(Map OriginID en DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} randen.take (1) // Definieer de grafiek en toon enkele hoekpunten en randen val graph = Graph (Airports, Edges and Nowhere) graph.vertices.take (2) graph.edges.take (2) // Query 1 - Vind het totale aantal luchthavens val numairports = Vertices Number // Query 2 - Bereken het totale aantal routes? val numroutes = aantal randen // Vraag 3 - Bereken die routes met afstanden van meer dan 1000 mijl graph.edges.filter {Haal de randafstand op) => afstand> 1000} .take (3) // Schrijf op dezelfde manier Scala-code voor de onderstaande queries // Query 4 - Sorteer en print de langste routes // Query 5 - Toon de hoogste hoekpunten voor inkomende en uitgaande vluchten van luchthavens // Query 6 - Haal de naam van de luchthaven op met ID's 10397 en 12478 // Query 7 - Vind de luchthaven met de hoogste inkomende vluchten // Query 8 - Vind de luchthaven met de hoogste uitgaande vluchten // Query 9 - Vind de belangrijkste luchthavens volgens PageRank // Query 10 - Sorteer de luchthavens op ranking // Query 11 - Toon de meeste belangrijke luchthavens // Vraag 12 - Vind de routes met de laagste vluchtkosten // Vraag 13 - Vind luchthavens en hun laagste vluchtkosten // Vraag 14 - Toon luchthavencodes samen met gesorteerde laagste vluchtkosten

Use Case - Resultaten visualiseren :

We zullen Google Data Studio gebruiken om onze analyse te visualiseren. Google Data Studio is een product onder Google Analytics 360 Suite. We zullen de Geo Map-service gebruiken om de luchthavens op hun respectieve locaties op de kaart van de VS in kaart te brengen en de metrische hoeveelheid weer te geven.

  1. Geef het totale aantal vluchten per luchthaven weer
  2. Geef de metrische som van bestemmingsroutes vanaf elke luchthaven weer
  3. Geef de totale vertraging van alle vluchten per luchthaven weer

Dit concludeert de Spark GraphX-blog. Ik hoop dat je het leuk vond om het te lezen en het informatief vond. Bekijk de volgende blog in onze Apache Spark-serie over om marktklaar te worden in Apache Spark.

We bevelen het volgende aan Apache Spark-training | Video over analyse van vluchtgegevens van Edureka om te beginnen:

Apache Spark-training | Spark GraphX ​​vluchtgegevensanalyse | Edureka

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte en we nemen zo spoedig mogelijk contact met u op.

Als je Spark wilt leren en een carrière wilt opbouwen in het domein van Spark en expertise wilt opbouwen om grootschalige gegevensverwerking uit te voeren met behulp van RDD, Spark Streaming, SparkSQL, MLlib, GraphX ​​en Scala met Real Life use-cases, bekijk dan onze interactieve, live -online hier, dat wordt geleverd met 24 * 7 ondersteuning om u tijdens uw leerperiode te begeleiden.