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
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 APIGraphframe
. Jeśli używasz jednego z nich, prawdopodobnie lepiej jest użyć bezpośrednioGraphX
.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 przezGraphframes
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
iedges
DataFrames
przezid
isrc
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.
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
@John Nie mogłem tego rozgryźć, czy masz przykład jak zrobić partycjonowanie na niestandardowej kolumnie? –
@John Czy możesz udostępnić aktualizację w jaki sposób rozwiązałeś problem z wydajnością? –