Samouczek Spark GraphX ​​- Analiza wykresów w Apache Spark



Ten blog z samouczkiem GraphX ​​przedstawia Apache Spark GraphX, jego funkcje i komponenty, w tym projekt analizy danych lotu.

GraphX to API Apache Spark dla wykresów i obliczeń równoległych do wykresów. GraphX ​​ujednolica proces ETL (Extract, Transform & Load), analizę eksploracyjną i iteracyjne obliczanie wykresów w ramach jednego systemu. Wykorzystanie wykresów można zobaczyć u znajomych z Facebooka, połączeniach LinkedIn, routerach internetowych, związkach między galaktykami i gwiazdami w astrofizyce i Mapach Google. Mimo że koncepcja obliczania wykresów wydaje się być bardzo prosta, zastosowania wykresów są dosłownie nieograniczone, a przypadki użycia w wykrywaniu katastrof, bankowości, giełdzie, systemach bankowych i geograficznych to tylko kilka przykładów.Nauka korzystania z tego interfejsu API jest ważną częścią .Na tym blogu poznamy koncepcje Spark GraphX, jego funkcje i komponenty na podstawie przykładów i przejrzymy pełny przypadek użycia Flight Data Analytics przy użyciu GraphX.

W tym blogu Spark GraphX ​​omówimy następujące tematy:





  1. Co to są wykresy?
  2. Użyj przypadków obliczania wykresów
  3. Co to jest Spark GraphX?
  4. Funkcje Spark GraphX
  5. Zrozumienie GraphX ​​z przykładami
  6. Przypadek użycia - analiza danych lotu przy użyciu GraphX

Co to są wykresy?

Graf jest matematyczną strukturą składającą się z zestawu obiektów, w których pewne pary obiektów są w pewnym sensie powiązane. Relacje te można przedstawić za pomocą krawędzi i wierzchołków tworzących graf. Wierzchołki reprezentują obiekty, a krawędzie pokazują różne relacje między tymi obiektami.

Koncepcje wykresów - Samouczek Spark GraphX ​​- EdurekaPostać: Samouczek Spark GraphX ​​- wierzchołki, krawędzie i tryplety na wykresach



W informatyce wykres jest abstrakcyjnym typem danych, który ma zaimplementować graf nieukierunkowany i koncepcje wykresu ukierunkowanego z matematyki, w szczególności z dziedziny teorii grafów. Struktura danych wykresu może również wiązać się z każdą krawędzią wartość krawędzi , takie jak symboliczna etykieta lub atrybut liczbowy (koszt, pojemność, długość,itp.).

Użyj przypadków obliczania wykresów

Poniższe przypadki użycia dają perspektywę obliczania wykresów i dalszy zakres implementacji innych rozwiązań wykorzystujących wykresy.

  1. System wykrywania katastrof

    Wykresy mogą być wykorzystywane do wykrywania katastrof, takich jak huragany, trzęsienia ziemi, tsunami, pożary lasów i wulkany, aby zapewnić ostrzeżenia ostrzegające ludzi.



    jak zrobić alert w javascript
  2. Ranking strony Page Rank może być używany do znajdowania wpływowych osób w dowolnej sieci, takiej jak sieć cytatów papierowych lub sieć mediów społecznościowych.
  3. Wykrywanie oszustw finansowych

    Analiza wykresów może służyć do monitorowania transakcji finansowych i wykrywania osób zaangażowanych w oszustwa finansowe i pranie pieniędzy.

  4. Analiza biznesowa

    Wykresy używane razem z uczeniem maszynowym pomagają w zrozumieniu trendów zakupowych klientów. Na przykład. Uber, McDonald’s itp.

  5. Systemy Informacji Geograficznej

    Wykresy są intensywnie wykorzystywane do rozwijania funkcjonalności systemów informacji geograficznej, takich jak wyznaczanie zlewni i prognozy pogody.

  6. Google Pregel

    Pregel to skalowalna i odporna na błędy platforma Google z interfejsem API, który jest wystarczająco elastyczny, aby przedstawić dowolny wykresalgorytmy.

Co to jest Spark GraphX?

GraphX to Spark API dla wykresów i obliczeń równoległych do wykresów. Obejmuje rosnącą kolekcję algorytmów i konstruktorów wykresów, które upraszczają zadania analizy wykresów.


GraphX ​​rozszerza Spark RDD o Resilient Distributed Property Graph.
Wykres właściwości jest skierowanym multigrafem, który może mieć wiele krawędzi równoległych. Każda krawędź i wierzchołek mają przypisane właściwości zdefiniowane przez użytkownika. Równoległe krawędzie pozwalają na wielerelacje między tymi samymi wierzchołkami.

Funkcje Spark GraphX

Oto funkcje Spark GraphX:

  1. Elastyczność :
    Spark GraphX ​​działa zarówno z wykresami, jak i obliczeniami. GraphX ​​ujednolica ETL (Extract, Transform & Load), analizę eksploracyjną i iteracyjne obliczanie wykresów w ramach jednego systemu. Możemy wyświetlać te same dane, zarówno jako wykresy, jak i kolekcje, wydajnie przekształcać i łączyć wykresy za pomocą RDD oraz pisać niestandardowe iteracyjne algorytmy wykresów za pomocą interfejsu Pregel API.
  2. Prędkość :
    Spark GraphX ​​zapewnia porównywalną wydajność do najszybszych wyspecjalizowanych systemów przetwarzania wykresów. Jest porównywalny z najszybszymi systemami graficznymi, zachowując elastyczność Sparka, odporność na błędy i łatwość użycia.
  3. Rosnąca biblioteka algorytmów :
    Możemy wybierać z rosnącej biblioteki algorytmów grafowych, które ma do zaoferowania Spark GraphX. Niektóre z popularnych algorytmów to ranking stron, połączone komponenty, propagacja etykiet, SVD ++, silnie połączone komponenty iliczba trójkątów.

Zrozumienie GraphX ​​z przykładami

Teraz zrozumiemy koncepcje Spark GraphX ​​na przykładzie. Rozważmy prosty wykres, jak pokazano na poniższym obrazku.

Postać: Samouczek Spark GraphX ​​- przykład wykresu

Patrząc na wykres, możemy wydobyć informacje o osobach (wierzchołkach) i relacjach między nimi (krawędzie). Poniższy wykres przedstawia użytkowników Twittera i ich obserwację na Twitterze. Np. Bob śledzi Davide i Alice na Twitterze.

Zaimplementujmy to samo za pomocą Apache Spark. Najpierw zaimportujemy niezbędne klasy dla GraphX.

// Importowanie niezbędnych klas 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

Wyświetlanie wierzchołków :Ponadto będziemy teraz wyświetlać wszystkie nazwy i wiek użytkowników (wierzchołki).

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”)}

Dane wyjściowe dla powyższego kodu są następujące:

Davidjest42 Franjestpięćdziesiąt Edjest55 Charliejest65

Wyświetlanie krawędzi : Spójrzmy, która osoba lubi kogo na Twitterze.

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

Dane wyjściowe dla powyższego kodu są następujące:

PionlubiAlice PionlubiDavid CharlielubiPion CharlielubiFran DavidlubiAlice EdlubiPion EdlubiCharlie EdlubiFran

Teraz, gdy zrozumieliśmy podstawy GraphX, zanurzmy się nieco głębiej i wykonajmy kilka zaawansowanych obliczeń na tym samym.

Liczba obserwujących : Każdy użytkownik na naszym wykresie ma inną liczbę obserwujących. Przyjrzyjmy się wszystkim obserwującym dla każdego użytkownika.

// Definiowanie klasy w celu wyraźniejszego modelowania klasy przypadku właściwości użytkownika User (name: String, age: Int, inDeg: Int, outDeg: Int) // Tworzenie wykresu użytkownika val initialUserGraph: Graph [User, Int] = graph. mapVertices {case (id, (name, age)) => User (name, age, 0, 0)} // Wypełnianie informacji o stopniu val userGraph = initialUserGraph.outerJoinVertices (initialUserGraph.inDegrees) {case (id, u, inDegOpt) => Użytkownik (u.name, u.age, inDegOpt.getOrElse (0), u.outDeg)} .outerJoinVertices (initialUserGraph.outDegrees) {case (id, u, outDegOpt) => Użytkownik (u.name, u.age, u.inDeg, outDegOpt.getOrElse (0))} for ((id, property)<- userGraph.vertices.collect) { println(s'User $id is called ${property.name} and is liked by ${property.inDeg} people.') } 

Dane wyjściowe dla powyższego kodu są następujące:

Użytkownik jedennazywa sięAlicei jest lubiany przez2ludzie. Użytkownik 2nazywa sięPioni jest lubiany przez2ludzie. Użytkownik 3nazywa sięCharliei jest lubiany przezjedenludzie. Użytkownik 4nazywa sięDavidi jest lubiany przezjedenludzie. Użytkownik 5nazywa sięEdi jest lubiany przez0ludzie. Użytkownik 6nazywa sięFrani jest lubiany przez2ludzie.

Najstarsi obserwatorzy : Możemy również sortować obserwujących według ich cech. Znajdźmy najstarszych obserwujących każdego użytkownika według wieku.

// Znalezienie najstarszego obserwatora dla każdego użytkownika val ancientFollower: VertexRDD [(String, Int)] = userGraph.mapReduceTriplets [(String, Int)] (// Dla każdej krawędzi wyślij wiadomość do wierzchołka docelowego z atrybutem źródła vertex edge => Iterator ((edge.dstId, (edge.srcAttr.name, edge.srcAttr.age))), // Aby połączyć wiadomości, weź wiadomość dla starszego obserwatora (a, b) => if (a. _2> b._2) a else b)

Dane wyjściowe dla powyższego kodu są następujące:

Davidjest najstarszym naśladowcąAlice. Charliejest najstarszym naśladowcąPion. Edjest najstarszym naśladowcąCharlie. Pionjest najstarszym naśladowcąDavid. Ednie ma żadnych obserwujących. Charliejest najstarszym naśladowcąFran. 

Przykład zastosowania: analiza danych lotu za pomocą Spark GraphX

Teraz, gdy zrozumieliśmy podstawowe koncepcje Spark GraphX, rozwiążmy prawdziwy problem za pomocą GraphX. Dzięki temu będziemy mieć pewność, że będziemy pracować nad projektami Spark w przyszłości.

php wstaw do tablicy $ table

Stwierdzenie problemu : Aby analizować dane lotu w czasie rzeczywistym za pomocą Spark GraphX, dostarczaj wyniki obliczeń niemal w czasie rzeczywistym i wizualizuj wyniki za pomocą Google Data Studio.

Przypadek użycia - obliczenia do wykonania :

  1. Oblicz całkowitą liczbę tras lotów
  2. Oblicz i sortuj najdłuższe trasy lotów
  3. Wyświetl lotnisko z wierzchołkiem o najwyższym stopniu
  4. Wymień najważniejsze lotniska według PageRank
  5. Wypisz trasy z najniższymi kosztami lotu

Wykorzystamy Spark GraphX ​​do powyższych obliczeń i wizualizujemy wyniki za pomocą Google Data Studio.

Przykład zastosowania - zbiór danych :

Postać: Przykład zastosowania - zbiór danych lotu USA

Przykład zastosowania - diagram przepływu :

Poniższa ilustracja jasno wyjaśnia wszystkie kroki związane z naszą analizą danych lotu.

Postać: Przypadek użycia - diagram przepływu analizy danych lotu przy użyciu Spark GraphX

Przypadek użycia - implementacja Spark :

Idąc dalej, zaimplementujmy teraz nasz projekt przy użyciu Eclipse IDE for Spark.

Znajdź poniższy pseudokod:

// Importowanie niezbędnych klas import org.apache.spark._ ... import java.io.File object airport {def main (args: Array [String]) {// Tworzenie klasy Case Class Flight case class Flight (dofM: String, dofW: String, ..., dist: Int) // Definiowanie funkcji Parse String do analizowania danych wejściowych w klasie Flight def parseFlight (str: String): Flight = {val line = str.split (',') Flight (line (0), line (1), ..., line (16) .toInt)} val conf = new SparkConf (). setAppName ('airport'). setMaster ('local [2]') val sc = new SparkContext (conf) // Załaduj dane do RDD val textRDD = sc.textFile ('/ home / edureka / usecases / airport / airportdataset.csv') // Przetłumacz RDD linii CSV do RDD klas lotów val flightRDD = Mapuj ParseFlight to Text RDD // Utwórz lotniska RDD z ID i nazwą val airport = Map Flight OriginID i Origin airports.take (1) // Definiowanie domyślnego wierzchołka zwanego nigdzie i mapowanie identyfikatora lotniska dla printlns val nowhere = 'nowhere' val airportMap = Użyj funkcji mapy .collect.toList.toMap // Utwórz trasy RDD z sourceID, destinationID i odległości val route = FlightsRDD. Użyj funkcji mapy .distinct tours.take (2) // Utwórz krawędzie RDD z ID_źródła, id_docelowym i odległością val edge = tours.map {(Map OriginID and DestinationID) => Edge (org_id.toLong, dest_id.toLong, distance)} edge.take (1) // Zdefiniuj wykres i wyświetl kilka wierzchołków i krawędzi val graph = Graph (Airports, Edges and Nowhere) graph.vertices.take (2) graph.edges.take (2) // Zapytanie 1 - Znajdź całkowita liczba lotnisk val numairports = Vertices Number // Zapytanie 2 - Obliczyć całkowitą liczbę tras? val numroutes = Liczba krawędzi // Zapytanie 3 - Oblicz te trasy z odległościami powyżej 1000 mil. graph.edges.filter {Get the edge distance) => distance> 1000} .take (3) // Podobnie napisz kod Scala dla poniżej zapytań // Zapytanie 4 - Sortuj i drukuj najdłuższe trasy // Zapytanie 5 - Wyświetl wierzchołki najwyższego stopnia dla przylotów i odlotów z lotnisk // Zapytanie 6 - Uzyskaj nazwę lotniska z identyfikatorami 10397 i 12478 // Zapytanie 7 - Znajdź lotnisko z najwyższymi przylotami // Zapytanie 8 - Znajdź lotnisko z najwyższymi odlotami // Zapytanie 9 - Znajdź najważniejsze lotniska według PageRank // Zapytanie 10 - Sortuj lotniska według rankingu // Zapytanie 11 - Wyświetl najwięcej ważne lotniska // Zapytanie 12 - Znajdź trasy z najniższymi kosztami lotu // Zapytanie 13 - Znajdź lotniska i ich najniższe koszty lotów // Zapytanie 14 - Wyświetl kody lotnisk wraz z posortowanymi najniższymi kosztami lotów

Przykład zastosowania - wizualizacja wyników :

Będziemy używać Google Data Studio do wizualizacji naszej analizy. Studio danych Google to produkt w ramach pakietu Google Analytics 360. Będziemy korzystać z usługi Geo Map, aby mapować lotniska w ich odpowiednich lokalizacjach na mapie USA i wyświetlać ilość metryk.

  1. Wyświetl łączną liczbę lotów na lotnisko
  2. Wyświetl sumę metryczną tras docelowych z każdego lotniska
  3. Wyświetl całkowite opóźnienie wszystkich lotów na lotnisko

Teraz kończy się blog Spark GraphX. Mam nadzieję, że podobało Ci się to czytanie i uznałeś to za przydatne. Przeczytaj następny blog z naszej serii Apache Spark aby być gotowym na rynek w Apache Spark.

Zalecamy następujące Szkolenie Apache Spark | Film dotyczący analizy danych lotu od Edureka na początek:

Szkolenie Apache Spark | Analiza danych lotu Spark GraphX ​​| Edureka

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy, a my skontaktujemy się z Tobą najwcześniej.

java co to jest instancja

Jeśli chcesz nauczyć się Spark i zbudować karierę w domenie Spark i zdobyć doświadczenie w przetwarzaniu danych na dużą skalę przy użyciu RDD, Spark Streaming, SparkSQL, MLlib, GraphX ​​i Scala z wykorzystaniem rzeczywistych przypadków użycia, sprawdź nasze interaktywne, na żywo -online tutaj, który zapewnia wsparcie 24 * 7, które poprowadzi Cię przez cały okres nauki.