Spark GraphX-handledning - Grafanalys i Apache Spark



Denna grafiska handledningsblogg introducerar dig till Apache Spark GraphX, dess funktioner och komponenter inklusive ett flygdata-analysprojekt.

GraphX är Apache Sparks API för grafer och graf-parallell beräkning. GraphX ​​förenar ETL-processen (Extract, Transform & Load), undersökande analys och iterativ grafberäkning i ett enda system. Användningen av grafer kan ses i Facebooks vänner, LinkedIn-anslutningar, internet-routrar, relationer mellan galaxer och stjärnor i astrofysik och Googles kartor. Även om begreppet grafberäkning verkar vara väldigt enkelt, är grafiska tillämpningar bokstavligen obegränsade med användningsfall i katastrofupptäckt, bank, aktiemarknad, bank och geografiska system för att bara nämna några.Att lära sig användningen av detta API är en viktig del av .Genom den här bloggen kommer vi att lära oss begreppen Spark GraphX, dess funktioner och komponenter genom exempel och gå igenom ett fullständigt användningsfall av Flight Data Analytics med GraphX.

Vi kommer att täcka följande ämnen i denna Spark GraphX-blogg:





  1. Vad är diagram?
  2. Använd fall av grafberäkning
  3. Vad är Spark GraphX?
  4. Spark GraphX-funktioner
  5. Förstå GraphX ​​med exempel
  6. Use Case - Flygdataanalys med GraphX

Vad är diagram?

En graf är en matematisk struktur som motsvarar en uppsättning objekt där vissa par av objekten är relaterade i någon mening. Dessa relationer kan representeras med hjälp av kanter och hörn som bildar en graf. Hörnpunkterna representerar objekten och kanterna visar de olika förhållandena mellan dessa objekt.

Graph Concepts - Spark GraphX ​​Tutorial - EdurekaFigur: Spark GraphX ​​Tutorial - Vertices, kanter och tripletter i grafer



Inom datavetenskap är en graf en abstrakt datatyp som är avsedd att implementera den oriktade grafen och riktade grafkoncept från matematik, särskilt området för grafteori. En grafdatastruktur kan också associera till varje kant kantvärde , såsom en symbolisk etikett eller ett numeriskt attribut (kostnad, kapacitet, längd,etc.).

Använd fall av grafberäkning

Följande användningsfall ger perspektiv på grafberäkning och ytterligare utrymme att implementera andra lösningar med hjälp av grafer.

  1. System för upptäckt av katastrofer

    Diagram kan användas för att upptäcka katastrofer som orkaner, jordbävningar, tsunami, skogsbränder och vulkaner för att ge varningar för att varna människor.



  2. Sidrankning Sidrankning kan användas för att hitta influenser i vilket nätverk som helst, t.ex. pappersciteringsnätverk eller sociala medier.
  3. Upptäckt av ekonomisk bedrägeri

    Grafanalys kan användas för att övervaka finansiella transaktioner och upptäcka personer som är involverade i ekonomiskt bedrägeri och penningtvätt.

  4. Affärsanalys

    Grafer, när de används tillsammans med maskininlärning, hjälper till att förstå kundernas inköpstrender. T.ex. Uber, McDonald's, etc.

  5. Geografiska informationssystem

    Grafer används intensivt för att utveckla funktioner på geografiska informationssystem som vattenavgränsning och väderprognos.

  6. Google Pregel

    Pregel är Googles skalbara och feltoleranta plattform med ett API som är tillräckligt flexibelt för att uttrycka godtycklig grafalgoritmer.

Vad är Spark GraphX?

GraphX är Spark API för grafer och graf-parallell beräkning. Den innehåller en växande samling grafalgoritmer och byggare för att förenkla grafanalysuppgifter.


GraphX ​​utökar Spark RDD med en elastisk distribuerad fastighetsgraf.
Egenskapsdiagrammet är ett riktat multigraph som kan ha flera kanter parallellt. Varje kant och topp har användardefinierade egenskaper associerade med det. De parallella kanterna tillåter fleraförhållanden mellan samma hörn.

Spark GraphX-funktioner

Följande är funktionerna i Spark GraphX:

  1. Flexibilitet :
    Spark GraphX ​​fungerar med både grafer och beräkningar. GraphX ​​förenar ETL (Extract, Transform & Load), undersökande analys och iterativ grafberäkning i ett enda system. Vi kan visa samma data som både grafer och samlingar, omvandla och sammanfoga grafer med RDDs effektivt och skriva anpassade iterativa grafalgoritmer med Pregel API.
  2. Hastighet :
    Spark GraphX ​​ger jämförbar prestanda med de snabbaste specialiserade grafbehandlingssystemen. Det är jämförbart med de snabbaste grafsystemen samtidigt som Sparks flexibilitet, feltolerans och användarvänlighet bibehålls.
  3. Växande algoritmbibliotek :
    Vi kan välja mellan ett växande bibliotek med grafalgoritmer som Spark GraphX ​​har att erbjuda. Några av de populära algoritmerna är sidrankning, anslutna komponenter, etikettutbredning, SVD ++, starkt anslutna komponenter ochtriangelantal.

Förstå GraphX ​​med exempel

Vi kommer nu att förstå begreppen Spark GraphX ​​med ett exempel. Låt oss överväga ett enkelt diagram som visas i bilden nedan.

Figur: Spark GraphX ​​Tutorial - Diagramexempel

hur man använder en iterator

När vi tittar på diagrammet kan vi extrahera information om människorna (hörnpunkterna) och förhållandet mellan dem (kanter). Grafen här representerar Twitter-användare och vem de följer på Twitter. För t.ex. Bob följer Davide och Alice på Twitter.

Låt oss implementera detsamma med Apache Spark. Först importerar vi nödvändiga klasser för GraphX.

// Importera nödvändiga klasser importera org.apache.spark._ importera org.apache.spark.rdd.RDD importera org.apache.spark.util.IntParam importera org.apache.spark.graphx._ importera org.apache.spark .graphx.util.GraphGenerators

Visar hörn :Vidare kommer vi nu att visa alla namn och åldrar på användarna (vertices).

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

Utgången för ovanstående kod är som nedan:

Davidär42 Franärfemtio Edär55 Charlieär65

Visar kanter : Låt oss titta på vilken person som gillar vem på Twitter.

för (triplett<- graph.triplets.collect) { println(s'${triplet.srcAttr._1} likes ${triplet.dstAttr._1}') } 

Utgången för ovanstående kod är som nedan:

GuppagillarAlice GuppagillarDavid CharliegillarGuppa CharliegillarFran DavidgillarAlice EdgillarGuppa EdgillarCharlie EdgillarFran

Nu när vi har förstått grunderna i GraphX, låt oss dyka lite djupare och utföra några avancerade beräkningar på samma.

Antal följare : Varje användare i vårt diagram har olika antal följare. Låt oss titta på alla följare för varje användare.

// Definiera en klass för att tydligare modellera användaregenskapens fallklass Användare (namn: String, age: Int, inDeg: Int, outDeg: Int) // Skapa en användare Graf val initialUserGraph: Diagram [User, Int] = diagram. mapVertices {case (id, (name, age)) => User (name, age, 0, 0)} // Fyll i gradinformation val userGraph = initialUserGraph.outerJoinVertices (initialUserGraph.inDegrees) {case (id, u, inDegOpt) => Användare (u.name, u.age, inDegOpt.getOrElse (0), u.outDeg)} .outerJoinVertices (initialUserGraph.outDegrees) {case (id, u, outDegOpt) => User (u.name, u.age, u.inDeg, outDegOpt.getOrElse (0))} för ((id, egendom)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

Utgången för ovanstående kod är som nedan:

förklara mvc-arkitektur i java med exempel
Användare ettkallasAliceoch gillas av2människor. Användare 2kallasGuppaoch gillas av2människor. Användare 3kallasCharlieoch gillas avettmänniskor. Användare 4kallasDavidoch gillas avettmänniskor. Användare 5kallasEdoch gillas av0människor. Användare 6kallasFranoch gillas av2människor.

Äldsta följare : Vi kan också sortera följare efter deras egenskaper. Låt oss hitta de äldsta följare av varje användare efter ålder.

// Hitta den äldsta följare för varje användare val elderFollower: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// För varje kant skicka ett meddelande till destinationspunkten med attributet för källan vertex edge => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))), // För att kombinera meddelanden ta meddelandet för den äldre följare (a, b) => if (a. _2> b._2) en annan b)

Utgången för ovanstående kod är som nedan:

Davidär den äldsta följare avAlice. Charlieär den äldsta följare avGuppa. Edär den äldsta följare avCharlie. Guppaär den äldsta följare avDavid. Edhar inga följare. Charlieär den äldsta följare avFran. 

Användningsfall: Flygdataanalys med Spark GraphX

Nu när vi har förstått kärnkoncepten i Spark GraphX, låt oss lösa ett verkligt problem med GraphX. Detta kommer att ge oss förtroendet att arbeta med eventuella Spark-projekt i framtiden.

Problemförklaring : För att analysera realtidsdata med hjälp av Spark GraphX, ge nästan realtidsberäkningsresultat och visualisera resultaten med Google Data Studio.

Use Case - Beräkningar som ska göras :

  1. Beräkna det totala antalet flygvägar
  2. Beräkna och sortera de längsta flygvägarna
  3. Visa flygplatsen med högsta graden
  4. Lista de viktigaste flygplatserna enligt PageRank
  5. Lista rutter med de lägsta flygkostnaderna

Vi kommer att använda Spark GraphX ​​för ovanstående beräkningar och visualisera resultaten med Google Data Studio.

Use Case - Dataset :

Figur: Use Case - USA Flight Dataset

Användningsfall - Flödesdiagram :

Följande illustration förklarar tydligt alla steg i vår flygdataanalys.

Figur: Use Case - Flödesschema för flygdataanalys med Spark GraphX

Användningsfall - Gnistimplementering :

Låt oss nu genomföra vårt projekt med Eclipse IDE for Spark.

Hitta Pseudokoden nedan:

// Importera nödvändiga klasser importera org.apache.spark._ ... importera java.io.File-objekt flygplats {def main (args: Array [String]) {// Skapa en Case Class Flight case class Flight (dofM: String, dofW: String, ..., dist: Int) // Definiera en Parse String-funktion för att analysera inmatning i Flight class def parseFlight (str: String): Flight = {val line = str.split (',') Flight (rad (0), rad (1), ..., rad (16) .toInt)} val conf = ny SparkConf (). setAppName ('flygplats'). setMaster ('lokal [2]') val sc = ny SparkContext (conf) // Ladda in data i en RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Analysera RDD för CSV-rader till en RDD för flygklasser val flightRDD = Map ParseFlight to Text RDD // Skapa flygplatser RDD med ID och namn val flygplatser = Karta Flight OriginID och Origin flygplatser. ta (1) // Definiera ett standardkod som kallas ingenstans och mappa flygplats-ID för printlns val ingenstans = 'ingenstans' val airportMap = Använd kartfunktion .collect.toList.toMap // Skapa rutter RDD med käll-ID, destinations-ID och avståndsval rutter = flygRDD. Använd kartfunktion .distinct routes.take (2) // Skapa kanter RDD med sourceID, destinationID och avståndsvalskanter = rutter.map {(Map OriginID och DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} kanter.take (1) // Definiera grafen och visa några hörn och kanter valgraf = Graf (flygplatser, kanter och ingenstans) graph.vertices.take (2) graph.edges.take (2) // fråga 1 - hitta det totala antalet flygplatser val numairports = Vertices Number // Fråga 2 - Beräkna det totala antalet rutter? val numroutes = Antal kanter // Fråga 3 - Beräkna dessa rutter med avstånd mer än 1000 miles graph.edges.filter {Få kantavståndet) => avstånd> 1000}. ta (3) // Skriv på samma sätt Scalakod för nedanförfrågor // Fråga 4 - Sortera och skriva ut de längsta rutterna // Fråga 5 - Visa högsta gradens hörn för inkommande och utgående flyg på flygplatser // Fråga 6 - Få flygplatsnamnet med ID 10397 och 12478 // Fråga 7 - Hitta flygplats med högst inkommande flyg // Fråga 8 - Hitta flygplats med högst utgående flyg // Fråga 9 - Hitta de viktigaste flygplatserna enligt PageRank // Fråga 10 - Sortera flygplatserna efter ranking // Fråga 11 - Visa mest viktiga flygplatser // Fråga 12 - Hitta rutter med de lägsta flygkostnaderna // Fråga 13 - Hitta flygplatser och deras lägsta flygkostnader // Fråga 14 - Visa flygplatskoder tillsammans med sorterade lägsta flygkostnader

Användningsfall - Visualisera resultat :

Vi kommer att använda Google Data Studio för att visualisera vår analys. Google Data Studio är en produkt under Google Analytics 360 Suite. Vi använder Geo Map-tjänsten för att kartlägga flygplatserna på deras respektive platser på USA-kartan och visa mätvärdena.

  1. Visa det totala antalet flygningar per flygplats
  2. Visa den metriska summan av resvägar från varje flygplats
  3. Visa den totala förseningen för alla flygningar per flygplats

Nu avslutar detta Spark GraphX-bloggen. Jag hoppas att du tyckte om att läsa den och tyckte att den var informativ. Kolla in nästa blogg i vår Apache Spark-serie på för att bli marknadsklar i Apache Spark.

Vi rekommenderar följande Apache Spark Training | Flygdata analys video från Edureka till att börja med:

Apache Spark Training | Spark GraphX ​​Flygdataanalys | Edureka

Har du en fråga till oss? Vänligen nämna det i kommentarfältet så återkommer vi tidigast.

Om du vill lära dig Spark och bygga en karriär inom Spark-området och bygga expertis för att utföra storskalig databehandling med RDD, Spark Streaming, SparkSQL, MLlib, GraphX ​​och Scala med Real Life-användningsfall, kolla in våra interaktiva, live -uppkopplad här, som kommer med 24 * 7 support för att vägleda dig under hela din inlärningsperiod.