2016-12-27 28 views
6

Pracuję z dużym (?) Wykresem (60 milionów wierzchołków i 9,5 miliarda krawędzi) za pomocą Spark Graphframes. Podstawowe dane nie są duże - wierzchołki zajmują około 500 MB na dysku, a krawędzie około 40 gb. Moje kontenery są często zamykane z powodu problemów z pamięcią w Javie, ale myślę, że podstawowym problemem jest to, że wykresy ciągle przesuwają dane wokół (widzę, że odczytuję/zapisuję do 150 gb). Czy istnieje sposób na wydajne podzielenie Graphframe lub podstawowych krawędzi/wierzchołków w celu zmniejszenia shuffle?Partycjonowanie za pomocą Spark Graphframes

Odpowiedz

6

TL; DR Nie jest możliwe skuteczne partycjonowanie Graphframe.

Graphframe algorytmy mogą być podzielone na dwie kategorie:

  • metody przetwarzania, które przenoszą na GraphX odpowiednik. GraphX ​​obsługuje wiele metod partycjonowania, ale nie są one udostępniane za pośrednictwem interfejsu API Graphframe. Jeśli używasz jednego z nich, prawdopodobnie lepiej jest użyć bezpośrednio GraphX.

    Niestety rozwój GraphX zatrzymał się prawie całkowicie z zaledwie kilkoma drobnymi poprawkami w ciągu ostatnich dwóch lat, a ogólna wydajność jest wysoce rozczarowująca w porównaniu z obydwoma bibliotekami wewnętrznymi i out-of-core libraries.

  • Metody wdrażane natywnie za pomocą Sparka Datasets, które uwzględniają ograniczony model programowania i tylko jeden tryb partycjonowania, są głęboko niezdatne do złożonego przetwarzania wykresów.

    Podczas gdy relacyjne przechowywanie w kolumnach może być użyte do wydajnego przetwarzania wykresów, naiwny iteracyjny join podejście stosowane przez Graphframes po prostu nie skaluj (ale jest to w porządku dla płytkiego ruchu z jednym lub dwoma przeskokami). '

    Można spróbować ponownie podzielić vertices i edgesDataFrames przez id i src odpowiednio:

    val nPart: Int = ??? 
    
    GraphFrame(v.repartition(nPart, v("id")), e.repartition(e(nPart, "src"))) 
    

    co powinno pomóc w niektórych przypadkach.

Ogólnie rzecz biorąc, w obecnym stanie (grudzień 2016), Spark nie jest dobrym wyborem do intensywnej analizy wykresów.

+1

Doceń wgląd. Zauważyłem, że mogę zwiększyć wydajność, tworząc niestandardową kolumnę w krawędziowej ramce danych za pomocą GraphX ​​[schemat partycji] (http://note.yuhc.me/2015/03/graphx-partition-strategy/) i partycjonowanie na tym. – John

+0

@John Nie mogłem tego rozgryźć, czy masz przykład jak zrobić partycjonowanie na niestandardowej kolumnie? –

+0

@John Czy możesz udostępnić aktualizację w jaki sposób rozwiązałeś problem z wydajnością? –