2016-04-22 4 views
1

Gegeben ein Dataset von [K, V] und eine Notwendigkeit, basierend auf Schlüssel beizutreten, welche Methode die beste Methode zur Sicherstellung der Lokalität/Geschwindigkeit einer benutzerdefinierten Partition/Hash-Partitionierung bietet oder die SortBy() verwendet Methode gefolgt von der Join-Methode? Und warum ist eine Methode leistungsfähiger als die andere?Spark Custom Partioner vs SortByKey-Funktionalität

Zusätzlich, wenn Sie die Mehrheit der Schlüssel haben den gleichen Schlüssel beeinflusst dies die Methode Wahl?

Fall 1

val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3")) 

val sorted = rdd.sortBy(_._1) 

val joined = sorted.join(sorted) 

Fall 2

val rdd = sc.parallelize(Seq(("gh5", "id1"), ("gh4", "id1"), ("gh5", "id2"),("gh5", "id3"), ...) 

val custom_partitioned = rdd.partitionBy(100)).persist() 

val joined = custom_partitioned.join(custom_partitioned) 

Antwort

2

Wenn Sie nur join Leistung betrachten und gehen davon aus, dass beide sorted und custom_partitioned RDDs zwischengespeichert werden es auch immer praktische Unterschied sein sollte. Beide:

rdd.sortBy(_._1) 

und

rdd.partitionBy(somePartitione) 

führt in partitionierten RDDs und diese Aufteilung wird durch nachfolgende cogroup genutzt werden.

Wenn Sie einen ganzen Prozess einschließlich sortBy/partitionBy in Betracht ziehen, dann sollte die zweite Option billiger sein, da sie keine anfänglichen Statistiken und lokale Sortierung erfordert. Sorting-basierter Ansatz kann in einigen Fällen vorzuziehen sein, wenn Sie eine stark verdrehte Schlüsselverteilung erwarten, aber dies wird Ihnen im Falle einer sehr niedrigen Kardinalität nicht helfen. Wenn Sie erwarten, dass dies der Fall ist, können Sie ein kartesisches Produkt, gefolgt von einem Filter, in Erwägung ziehen, aber dies sollte als letztes Mittel verwendet werden.

+0

Wenn es zu einer stark verzerrten Verteilung kommt, ist SortBy der beste Weg, um die Datenlokalität/-leistung auf dem Join zu gewährleisten, oder gibt es tatsächlich eine bessere Möglichkeit, dieselbe Funktion auszuführen (anders als die vorgeschlagenen). – SChorlton

+1

Nach dem Mischen mit dem gleichen Partitionierer wird jede Operation per Definition lokal sein. Und die Wahl des Partitioners ('RangePartioner' wird zum Sortieren verwendet) hängt von Ihren Daten und der tatsächlichen Verteilung ab. Es gibt keine universelle Lösung. Wenn Sie wissen, dass Daten in einer bestimmten Weise organisiert sind, erstellen Sie einen benutzerdefinierten Partitionierer, der dies widerspiegelt. – zero323