Vodič za Spark GraphX ​​- Analitika grafikona u Apache Spark



Ovaj blog s vodičem za GraphX ​​upoznat će vas s Apache Spark GraphX-om, njegovim značajkama i komponentama, uključujući projekt analize podataka o letu.

GraphX je API Apache Spark-a za grafove i grafički paralelno računanje. GraphX ​​objedinjuje ETL (Extract, Transform & Load) postupak, istraživačku analizu i iterativno izračunavanje grafova unutar jednog sustava. Korištenje grafova može se vidjeti na Facebookovim prijateljima, LinkedInovim vezama, internetskim usmjerivačima, odnosima između galaksija i zvijezda u astrofizici i Googleovim kartama. Iako se čini da je koncept izračunavanja grafova vrlo jednostavan, primjena grafova doslovno je neograničena sa slučajevima korištenja u otkrivanju katastrofa, bankarstvu, tržištu dionica, bankarskim i zemljopisnim sustavima da nabrojimo samo neke.Učenje upotrebe ovog API-ja važan je dio .Kroz ovaj ćemo blog kroz primjere naučiti koncepte Spark GraphX-a, njegove značajke i komponente te proći cjelovit slučaj upotrebe Flight Data Analytics pomoću GraphX-a.

Na ovom blogu Spark GraphX ​​obrađivat ćemo sljedeće teme:





  1. Što su Grafovi?
  2. Koristite slučajeve izračunavanja grafova
  3. Što je Spark GraphX?
  4. Značajke Spark GraphX
  5. Razumijevanje GraphX-a s primjerima
  6. Slučaj upotrebe - Analiza podataka o letu pomoću GraphX-a

Što su Grafovi?

Graf je matematička struktura koja iznosi skup objekata u kojima su neki parovi predmeta povezani u nekom smislu. Te se relacije mogu prikazati pomoću bridova i vrhova koji tvore graf. Vrhovi predstavljaju objekte, a rubovi prikazuju različite odnose između tih predmeta.

Grafički koncepti - Vodič za Spark GraphX ​​- EdurekaLik: Vodič za Spark GraphX ​​- Vrhovi, rubovi i trojke u grafikonima



U računalnim znanostima, graf je apstraktni tip podataka kojem je namijenjena primjena neusmjerenog grafa i usmjerenih koncepata grafa iz matematike, posebno područja teorije grafova. Struktura podataka grafa također se može pridružiti svakom rubu vrijednost ruba , poput simboličke naljepnice ili numeričkog atributa (trošak, kapacitet, duljina,itd.).

Koristite slučajeve izračunavanja grafova

Sljedeći slučajevi upotrebe daju perspektivu izračunavanju grafova i daljnji opseg primjene drugih rješenja pomoću grafova.

  1. Sustav za otkrivanje katastrofa

    Grafikoni se mogu koristiti za otkrivanje katastrofa poput uragana, potresa, tsunamija, šumskih požara i vulkana kako bi se upozorilo ljude.



  2. Page Rank Page Rank može se koristiti za pronalaženje utjecajnih osoba u bilo kojoj mreži, kao što je mreža za citiranje papira ili mreža društvenih medija.
  3. Otkrivanje financijske prijevare

    Analiza grafikona može se koristiti za praćenje financijskih transakcija i otkrivanje ljudi koji su uključeni u financijske prijevare i pranje novca.

  4. Analiza poslovanja

    Grafikoni, kada se koriste zajedno sa Strojnim učenjem, pomažu u razumijevanju trendova kupčeve kupnje. Npr. Uber, McDonald’s itd.

  5. Geografski informacijski sustavi

    Grafovi se intenzivno koriste za razvijanje funkcionalnosti na geografskim informacijskim sustavima poput razgraničenja sliva i predviđanja vremena.

    kako obrnuti broj
  6. Google Pregel

    Pregel je Googleova skalabilna i otporna na greške platforma s API-jem koji je dovoljno fleksibilan za izražavanje proizvoljnog grafaalgoritmi.

Što je Spark GraphX?

GraphX je Spark API za grafove i grafički paralelno računanje. Uključuje sve veću kolekciju algoritama grafova i graditelja za pojednostavljivanje zadataka analitike grafova.


GraphX ​​proširuje Spark RDD s elastičnim raspoređenim grafom svojstava.
Graf svojstava usmjereni je multigraf koji može imati više bridova paralelno. Svaki rub i vrh imaju korisnički definirana svojstva povezana s njima. Paralelni rubovi omogućuju višestrukoodnosi između istih vrhova.

Značajke Spark GraphX

Slijede značajke Spark GraphX:

  1. Fleksibilnost :
    Spark GraphX ​​radi i s grafikonima i s proračunima. GraphX ​​objedinjuje ETL (Extract, Transform & Load), istraživačku analizu i iterativno izračunavanje grafova u jednom sustavu. Možemo pregledavati iste podatke kao i grafikoni i zbirke, učinkovito transformirati i spajati grafikone s RDD-ima i pisati prilagođene iterativne algoritme grafikona pomoću Pregel API-ja.
  2. Ubrzati :
    Spark GraphX ​​pruža usporedive performanse sa najbržim specijaliziranim sustavima za obradu grafova. Usporedljiv je s najbržim sustavima grafova uz zadržavanje Sparkove fleksibilnosti, tolerancije kvarova i jednostavnosti upotrebe.
  3. Rastuća biblioteka algoritama :
    Možemo birati između rastuće biblioteke algoritama grafova koje Spark GraphX ​​nudi. Neki od popularnih algoritama su rang stranice, povezane komponente, širenje naljepnica, SVD ++, jako povezane komponente ibroj trokuta.

Razumijevanje GraphX-a s primjerima

Sada ćemo na primjeru razumjeti koncepte Spark GraphX-a. Razmotrimo jednostavan graf kao što je prikazano na donjoj slici.

Lik: Vodič za Spark GraphX ​​- Primjer grafikona

Gledajući graf, možemo izvući informacije o ljudima (vrhovi) i odnosima između njih (rubovi). Grafikon ovdje predstavlja korisnike Twittera i koga slijede na Twitteru. Jer npr. Bob prati Davidea i Alice na Twitteru.

Primijenimo isto koristeći Apache Spark. Prvo ćemo uvesti potrebne klase za GraphX.

// Uvoz potrebnih klasa 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

Prikazivanje vrhova :Dalje, sada ćemo prikazati sva imena i dob korisnika (vrhove).

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

Izlaz za gornji kod je sljedeći:

Davidje42 Franjepedeset Edje55 Charlieje65

Prikazivanje rubova : Pogledajmo koja se osoba kome sviđa na Twitteru.

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

Izlaz za gornji kod je sljedeći:

BobesviđanjaAlice BobesviđanjaDavid CharliesviđanjaBobe CharliesviđanjaFran DavidsviđanjaAlice EdsviđanjaBobe EdsviđanjaCharlie EdsviđanjaFran

Sad kad smo shvatili osnove GraphX-a, zaronimo malo dublje i izvodimo napredna izračunavanja na istom.

Broj sljedbenika : Svaki korisnik na našem grafikonu ima različit broj sljedbenika. Pogledajmo sve sljedbenike za svakog korisnika.

// Definiranje klase radi jasnijeg modeliranja klase slučaja svojstva korisnika Korisnik (ime: String, dob: Int, inDeg: Int, outDeg: Int) // Stvaranje korisnika Graf val InitiUserGraph: Graf [Korisnik, Int] = graf. mapVertices {case (id, (name, age)) => User (name, age, 0, 0)} // Popunjavanje podataka o stupnju val userGraph = InitialUserGraph.outerJoinVertices (InitialUserGraph.inDegrees) {case (id, u, inDegOpt) => Korisnik (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))} za ((id, svojstvo)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

Izlaz za gornji kod je sljedeći:

Korisnik jedanZove seAlicei sviđa mu se2narod. Korisnik 2Zove seBobei sviđa mu se2narod. Korisnik 3Zove seCharliei sviđa mu sejedannarod. Korisnik 4Zove seDavidi sviđa mu sejedannarod. Korisnik 5Zove seEdi sviđa mu se0narod. Korisnik 6Zove seFrani sviđa mu se2narod.

Najstariji sljedbenici : Sljedbenike također možemo sortirati prema njihovim karakteristikama. Pronađimo najstarije sljedbenike svakog korisnika prema dobi.

// Pronalaženje najstarijeg sljedbenika za svakog korisnika val najstarijiFollower: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// Za svaki rub pošaljite poruku odredišnom tjemenu s atributom izvora rub vrha => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age)))), // Za kombiniranje poruka uzmite poruku za starijeg sljedbenika (a, b) => if (a. _2> b._2) a drugo b)

Izlaz za gornji kod je sljedeći:

Davidje najstariji sljedbenikAlice. Charlieje najstariji sljedbenikBobe. Edje najstariji sljedbenikCharlie. Bobeje najstariji sljedbenikDavid. Ednema nijednog sljedbenika. Charlieje najstariji sljedbenikFran. 

Slučaj upotrebe: Analiza podataka o letu pomoću Spark GraphX-a

Sad kad smo shvatili temeljne koncepte Spark GraphX-a, riješimo stvarni život koristeći GraphX. To će nam pružiti samopouzdanje za rad na bilo kojem Spark projektu u budućnosti.

Izjava o problemu : Da biste analizirali podatke o letu u stvarnom vremenu pomoću Spark GraphX-a, pružite rezultate izračuna u gotovo stvarnom vremenu i vizualizirajte rezultate pomoću Google Data Studija.

Slučaj upotrebe - Izračuni koje treba obaviti :

  1. Izračunajte ukupan broj letačkih ruta
  2. Izračunajte i sortirajte najduže rute leta
  3. Prikažite aerodrom s vrhom najvišeg stupnja
  4. Navedite najvažnije zračne luke prema PageRank-u
  5. Navedite rute s najnižim troškovima leta

Za gornja izračunavanja upotrijebit ćemo Spark GraphX ​​i vizualizirati rezultate pomoću Google Data Studija.

Slučaj upotrebe - Skup podataka :

Lik: Slučaj upotrebe - SAD set podataka o letu

Dijagram toka upotrebe - slučaj :

scrum master uloge i odgovornosti pdf

Sljedeća ilustracija jasno objašnjava sve korake koji su uključeni u našu Analizu podataka o letu.

Lik: Slučaj upotrebe - Dijagram toka analize podataka leta pomoću Spark GraphX-a

Slučaj upotrebe - Implementacija iskre :

Krenimo dalje, sada ćemo implementirati naš projekt koristeći Eclipse IDE za Spark.

Pronađite pseudo kod ispod:

// Uvoz potrebnih klasa import org.apache.spark._ ... import java.io.File objekt aerodrom {def main (args: Array [String]) {// Stvaranje Case Class Flight case class Flight (dofM: String, dofW: String, ..., dist: Int) // Definiranje funkcije Parse String za raščlanjivanje unosa u klasu Flight def parseFlight (str: String): Flight = {val line = str.split (',') Flight (linija (0), linija (1), ..., linija (16) .toInt)} val conf = new SparkConf (). setAppName ('airport'). setMaster ('local [2]') val sc = novi SparkContext (conf) // Učitaj podatke u RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Raščlanite RDD CSV linija u RDD klase leta val flightsRDD = Mapirajte ParseFlight u tekst RDD // Stvaranje aerodroma RDD s ID-om i imenom val airports = Map Flight OriginID and Origin airports.take (1) // Definiranje zadanog vrha koji se zove nigdje i mapiranje ID-a aerodroma za printlns val nowhere = 'nigdje' val airportMap = Koristi funkciju karte .collect.toList.toMap // Izrada ruta RDD s ID-om izvora, odredišta i udaljenostima val rute = letoviRDD. Upotrijebite funkciju karte .disinct routes.take (2) // Stvorite RDD rubova s ​​ID-om izvora, odredištem i udaljenostom val edge = routes.map {(Map OriginID i DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} edge.take (1) // Definirajte graf i prikažite neke vrhove i rubove val graph = Grafikon (Zračne luke, rubovi i nigdje) graph.vertices.take (2) graph.edges.take (2) // Upit 1 - Pronađi ukupan broj zračnih luka val numairports = Broj vrhova // Upit 2 - Izračunajte ukupan broj ruta? val numroutes = Broj rubova // Upit 3 - Izračunajte one rute s udaljenostima većim od 1000 milja graph.edges.filter {Dobijte rubnu udaljenost) => distance> 1000} .take (3) // Slično napišite Scala kôd za donji upiti // Upit 4 - Sortiranje i ispis najdužih ruta // Upit 5 - Prikaz vrhova najvišeg stupnja za dolazne i odlazne letove zračnih luka // Upit 6 - Dohvatite naziv zračne luke s ID-ovima 10397 i 12478 // Upit 7 - Pronađite zračna luka s najviše dolaznih letova // Upit 8 - Pronađite zračnu luku s najviše odlaznih letova // Upit 9 - Pronađite najvažnije zračne luke prema PageRank-u // Upit 10 - Poredajte zračne luke prema rangu // Upit 11 - Prikažite najviše važne zračne luke // Upit 12 - Pronađite rute s najnižim troškovima leta // Upit 13 - Pronađite zračne luke i njihove najniže troškove leta // Upit 14 - Prikažite kodove zračnih luka zajedno s razvrstanim najnižim troškovima leta

Slučaj upotrebe - vizualizacija rezultata :

Za vizualizaciju naše analize koristit ćemo Google Data Studio. Google Data Studio proizvod je pod Google Analytics 360 Suite. Koristit ćemo uslugu Geo Map za mapiranje zračnih luka na njihovim mjestima na karti SAD-a i prikaz veličine mjernih podataka.

  1. Prikažite ukupan broj letova po zračnoj luci
  2. Prikažite metrički zbroj odredišnih ruta sa svake zračne luke
  3. Prikažite ukupno kašnjenje svih letova po zračnoj luci

Ovo je zaključio blog Spark GraphX. Nadam se da ste ga uživali čitati i da vam je informativan. Pogledajte sljedeći blog u našoj seriji Apache Spark kako bi postali spremni za tržište u Apache Sparku.

Preporučujemo sljedeće Apache Spark trening | Video za analizu podataka o letu od Edureke za početak:

Apache Spark trening | Analiza podataka o letu Spark GraphX ​​| Edureka

Imate pitanje za nas? Molimo vas da ga spominjete u odjeljku za komentare i javit ćemo vam se najranije.

Ako želite naučiti Spark i izgraditi karijeru u domeni Spark i izgraditi stručnost za obavljanje velike obrade podataka pomoću RDD-a, Spark Streaming-a, SparkSQL-a, MLlib-a, GraphX-a i Scale sa stvarnim slučajevima upotrebe, pogledajte našu interaktivnu, uživo -na liniji ovdje, koja dolazi s podrškom 24 * 7 koja će vas voditi tijekom cijelog razdoblja učenja.