Spark GraphX ​​Tutorial - Grafanalyse i Apache Spark



Denne GraphX-selvstudieblog introducerer dig til Apache Spark GraphX, dens funktioner og komponenter inklusive et flydataanalyseprojekt.

GraphX er Apache Sparks API til grafer og graf-parallel beregning. GraphX ​​forener ETL (Extract, Transform & Load) proces, sonderende analyse og iterativ grafberegning inden for et enkelt system. Brugen af ​​grafer kan ses i Facebooks venner, LinkedIn's forbindelser, internetets routere, forholdet mellem galakser og stjerner i astrofysik og Googles Maps. Selvom begrebet grafberegning ser ud til at være meget simpelt, er anvendelsen af ​​grafer bogstaveligt talt ubegrænset med brugssituationer i katastrofedetektering, bank, aktiemarked, bank og geografiske systemer for blot at nævne nogle få.At lære at bruge denne API er en vigtig del af .Gennem denne blog lærer vi begreberne i Spark GraphX, dens funktioner og komponenter gennem eksempler og gennemgår en komplet brugstilfælde af Flight Data Analytics ved hjælp af GraphX.

Vi vil dække følgende emner i denne Spark GraphX-blog:





  1. Hvad er grafer?
  2. Brug tilfælde af grafberegning
  3. Hvad er Spark GraphX?
  4. Spark GraphX-funktioner
  5. Forståelse af GraphX ​​med eksempler
  6. Use Case - Flight Data Analysis ved hjælp af GraphX

Hvad er grafer?

En graf er en matematisk struktur svarende til et sæt objekter, hvor nogle par af objekterne er relateret i en eller anden forstand. Disse relationer kan repræsenteres ved hjælp af kanter og hjørner, der danner en graf. Hovedpunkterne repræsenterer objekterne, og kanterne viser de forskellige forhold mellem disse objekter.

Grafkoncepter - Spark GraphX-vejledning - EdurekaFigur: Spark GraphX ​​Tutorial - Vertices, kanter og tripletter i grafer



I datalogi er en graf en abstrakt datatype, der er beregnet til at implementere den ikke-rettede graf og styrede grafkoncepter fra matematik, specifikt inden for grafteori. En graf datastruktur kan også knytte sig til hver kant kantværdi , såsom en symbolsk etiket eller en numerisk attribut (pris, kapacitet, længde,etc.).

Brug tilfælde af grafberegning

Følgende brugssager giver et perspektiv i grafberegning og yderligere muligheder for at implementere andre løsninger ved hjælp af grafer.

  1. System til detektion af katastrofer

    Grafer kan bruges til at opdage katastrofer som orkaner, jordskælv, tsunami, skovbrande og vulkaner for at give advarsler om at advare folk.



  2. Side rank Page Rank kan bruges til at finde indflydelsesrige i ethvert netværk såsom papircitationsnetværk eller sociale medianetværk.
  3. Opdagelse af økonomisk svig

    Grafanalyse kan bruges til at overvåge finansielle transaktioner og afsløre personer, der er involveret i økonomisk svindel og hvidvaskning af penge.

  4. Forretningsanalyse

    Grafer, når de bruges sammen med Machine Learning, hjælper med at forstå kundernes købstendenser. For eksempel. Uber, McDonald's osv.

  5. Geografiske informationssystemer

    Grafer bruges intensivt til at udvikle funktionaliteter på geografiske informationssystemer som afgrænsning af vandskel og vejrudsigter.

  6. Google Pregel

    Pregel er Googles skalerbare og fejltolerante platform med en API, der er tilstrækkelig fleksibel til at udtrykke vilkårlig grafalgoritmer.

Hvad er Spark GraphX?

GraphX er Spark API til grafer og graf-parallel beregning. Det inkluderer en voksende samling af grafalgoritmer og bygherrer for at forenkle grafanalyseopgaver.

sorter en liste c ++


GraphX ​​udvider Spark RDD med en elastisk distribueret egenskabsgraf.
Ejendomsgrafen er en rettet multigraf, som kan have flere kanter parallelt. Hver kant og toppunkt har brugerdefinerede egenskaber tilknyttet. De parallelle kanter tillader flereforhold mellem de samme hjørner.

Spark GraphX-funktioner

Følgende er funktionerne i Spark GraphX:

  1. Fleksibilitet :
    Spark GraphX ​​fungerer med både grafer og beregninger. GraphX ​​forener ETL (Extract, Transform & Load), sonderende analyse og iterativ grafberegning inden for et enkelt system. Vi kan se de samme data som både grafer og samlinger, transformere og sammenføje grafer med RDD'er effektivt og skrive tilpassede iterative grafalgoritmer ved hjælp af Pregel API.
  2. Hastighed :
    Spark GraphX ​​giver sammenlignelig ydelse med de hurtigste specialiserede grafbehandlingssystemer. Det kan sammenlignes med de hurtigste grafsystemer, samtidig med at Sparks fleksibilitet, fejltolerance og brugervenlighed bevares.
  3. Voksende algoritmebibliotek :
    Vi kan vælge mellem et voksende bibliotek med grafalgoritmer, som Spark GraphX ​​har at tilbyde. Nogle af de populære algoritmer er siderangering, tilsluttede komponenter, etiketformering, SVD ++, stærkt forbundne komponenter ogtrekantantal.

Forståelse af GraphX ​​med eksempler

Vi vil nu forstå begreberne i Spark GraphX ​​ved hjælp af et eksempel. Lad os overveje en simpel graf som vist på billedet nedenfor.

Figur: Spark GraphX ​​Tutorial - Grafeksempel

Når vi ser på grafen, kan vi udtrække information om folket (hjørner) og forholdet mellem dem (kanter). Grafen repræsenterer Twitter-brugerne, og hvem de følger på Twitter. For f.eks. Bob følger Davide og Alice på Twitter.

Lad os implementere det samme ved hjælp af Apache Spark. Først importerer vi de nødvendige klasser til GraphX.

// Import af de nødvendige klasser 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

Visning af hjørner :Desuden viser vi nu alle brugernes navne og aldre (hjørner).

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

Outputtet for ovenstående kode er som nedenfor:

Davider42 Franerhalvtreds Eder55 Charlieer65

Visning af kanter : Lad os se på, hvilken person der kan lide hvem på Twitter.

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

Outputtet for ovenstående kode er som nedenfor:

Bobkan lideAlice Bobkan lideDavid Charliekan lideBob Charliekan lideFran Davidkan lideAlice Edkan lideBob Edkan lideCharlie Edkan lideFran

Nu hvor vi har forstået det grundlæggende i GraphX, lad os dykke lidt dybere og udføre nogle avancerede beregninger på det samme.

Antal tilhængere : Hver bruger i vores graf har et andet antal følgere. Lad os se på alle tilhængere for hver bruger.

// Definere en klasse for mere tydeligt at modellere brugeregenskabssagsklassen Bruger (navn: String, age: Int, inDeg: Int, outDeg: Int) // Oprettelse af en bruger Graf værdi initialUserGraph: Graf [Bruger, Int] = graf. mapVertices {case (id, (name, age)) => User (name, age, 0, 0)} // Udfyldning af gradinformation val userGraph = initialUserGraph.outerJoinVertices (initialUserGraph.inDegrees) {case (id, u, inDegOpt) => Bruger (u.navn, u.alder, inDegOpt.getOrElse (0), u.outDeg)} .outJoinVertices (initialUserGraph.outDegrees) {case (id, u, outDegOpt) => Bruger (u.navn, u.age, u.inDeg, outDegOpt.getOrElse (0))} for ((id, egenskab)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

Outputtet for ovenstående kode er som nedenfor:

Bruger enHedderAliceog kan lide af2mennesker. Bruger 2HedderBobog kan lide af2mennesker. Bruger 3HedderCharlieog kan lide afenmennesker. Bruger 4HedderDavidog kan lide afenmennesker. Bruger 5HedderEdog kan lide af0mennesker. Bruger 6HedderFranog kan lide af2mennesker.

Ældste følgere : Vi kan også sortere tilhængerne efter deres egenskaber. Lad os finde de ældste tilhængere af hver bruger efter alder.

// Find den ældste tilhænger for hver bruger, val elderFollower: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// For hver kant skal du sende en besked til destinationspunktet med kildets attribut vertex edge => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))), // For at kombinere meddelelser skal du tage beskeden til den ældre tilhænger (a, b) => hvis (a. _2> b._2) en anden b)

Outputtet for ovenstående kode er som nedenfor:

Davider den ældste tilhænger afAlice. Charlieer den ældste tilhænger afBob. Eder den ældste tilhænger afCharlie. Bober den ældste tilhænger afDavid. Edhar ingen tilhængere. Charlieer den ældste tilhænger afFran. 

Brugssag: Flydataanalyse ved hjælp af Spark GraphX

Nu hvor vi har forstået kernebegreberne i Spark GraphX, lad os løse et virkeligt problem ved hjælp af GraphX. Dette vil hjælpe os med at give tillid til at arbejde på Spark-projekter i fremtiden.

Problemformulering : For at analysere data i realtid ved hjælp af Spark GraphX ​​skal du give næsten realtidsberegningsresultater og visualisere resultaterne ved hjælp af Google Data Studio.

Brug sag - beregninger, der skal udføres :

  1. Beregn det samlede antal flyruter
  2. Beregn og sorter de længste flyruter
  3. Vis lufthavnen med den højeste grad af toppunkt
  4. Liste over de vigtigste lufthavne i henhold til PageRank
  5. Angiv ruter med de laveste flyomkostninger

Vi bruger Spark GraphX ​​til ovenstående beregninger og visualiserer resultaterne ved hjælp af Google Data Studio.

Brug sag - datasæt :

Figur: Brug sag - USAs flydatasæt

Brug sag - flowdiagram :

Den følgende illustration forklarer tydeligt alle trin involveret i vores flydataanalyse.

Figur: Brug sag - Flowdiagram over flygedataanalyse ved hjælp af Spark GraphX

Brugssag - gnistimplementering :

Gå videre, lad os nu implementere vores projekt ved hjælp af Eclipse IDE for Spark.

Find Pseudo-koden nedenfor:

// Import af de nødvendige klasser import org.apache.spark._ ... import java.io.File objekt lufthavn {def main (args: Array [String]) {// Oprettelse af en Case Class Flight case class Flight (dofM: String, dofW: String, ..., dist: Int) // Definere en Parse String-funktion til at analysere input til Flight class def parseFlight (str: String): Flight = {val line = str.split (',') Flight (linje (0), linje (1), ..., linje (16) .toInt)} val conf = ny SparkConf (). setAppName ('lufthavn'). setMaster ('lokal [2]') val sc = ny SparkContext (conf) // Indlæs dataene i en RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Parse RDD af CSV-linjer i en RDD for flyklasser val flightRDD = Kort ParseFlight til tekst RDD // Opret lufthavne RDD med ID og navn val lufthavne = Kort Flight OriginID og Origin lufthavne. tage (1) // Definere et standardpunkt, der hedder ingensteds og kortlægge lufthavn-ID til printlns val nowhere = 'ingensteds' val airportMap = Brug kortfunktion .collect.toList.toMap // Opret ruter RDD med sourceID, destinationID og distance val ruter = flyRDD. Brug kortfunktion .distinct routes.take (2) // Opret kanter RDD med sourceID, destinationID og distance val edge = routes.map {(Map OriginID and DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} kanter.take (1) // Definer grafen og vis nogle hjørner og kanter val graf = Graf (lufthavne, kanter og ingen steder) graph.vertices.take (2) graph.edges.take (2) // forespørgsel 1 - find det samlede antal lufthavne val numairports = Vertices Number // Query 2 - Beregn det samlede antal ruter? val numroutes = Antal kanter // Forespørgsel 3 - Beregn disse ruter med afstande mere end 1000 miles graph.edges.filter {Få kantafstand) => afstand> 1000}. tag (3) // Skriv ligeledes Scala-kode for under forespørgsler // Forespørgsel 4 - Sorter og udskriv de længste ruter // Forespørgsel 5 - Vis højeste højdepunkter for indgående og udgående fly i lufthavne // Forespørgsel 6 - Få lufthavnens navn med ID 10397 og 12478 // Forespørgsel 7 - Find lufthavn med de højeste indgående fly // Forespørgsel 8 - Find lufthavnen med de højeste udgående fly // Forespørgsel 9 - Find de vigtigste lufthavne i henhold til PageRank // Forespørgsel 10 - Sorter lufthavne efter placering // Forespørgsel 11 - Vis mest vigtige lufthavne // Forespørgsel 12 - Find ruterne med de laveste flyomkostninger // Forespørgsel 13 - Find lufthavne og deres laveste flyomkostninger // Spørgsmål 14 - Vis lufthavnskoder sammen med de sorterede laveste flyomkostninger

Brug sag - Visualisering af resultater :

Vi bruger Google Data Studio til at visualisere vores analyse. Google Data Studio er et produkt under Google Analytics 360 Suite. Vi bruger Geo Map-tjenesten til at kortlægge lufthavne på deres respektive placeringer på USA-kortet og vise metrics-mængden.

  1. Vis det samlede antal flyrejser pr. Lufthavn
  2. Vis metrisk sum af destinationsruter fra hver lufthavn
  3. Vis den samlede forsinkelse for alle flyrejser pr. Lufthavn

Nu afsluttes Spark GraphX-bloggen. Jeg håber, du nød at læse det og fandt det informativt. Tjek den næste blog i vores Apache Spark-serie den for at blive markedsklar i Apache Spark.

Vi anbefaler følgende Apache gnisttræning | Flydataanalysevideo fra Edureka til at begynde med:

Apache gnisttræning | Spark GraphX ​​Flight Data Analyse | Edureka

Har du et spørgsmål til os? Nævn det i kommentarfeltet, så vi vender tilbage til dig tidligst.

Hvis du ønsker at lære Spark og opbygge en karriere inden for Spark-domæne og opbygge ekspertise til at udføre databehandling i stor skala ved hjælp af RDD, Spark Streaming, SparkSQL, MLlib, GraphX ​​og Scala med Real Life-brugssager, skal du tjekke vores interaktive, live -online her, der kommer med 24 * 7 support til at guide dig gennem hele din læringsperiode.