2016-08-26 4 views

Antwort

1

Die kurze Antwort: Nein, es gibt keine Möglichkeit, die Tatsache zu nutzen, dass zwei Eingabe-RDDs bereits sortiert sind, wenn die Sortierfunktionen von Apache Spark verwendet werden.

Die lange Antwort: Unter bestimmten Bedingungen könnte es einen besseren Weg geben als sortBy oder sortByKey.

Der offensichtlichste Fall ist, wenn die Eingangs-RDDs bereits sortiert sind und verschiedene Bereiche darstellen. In diesem Fall ist die einfache Verwendung von rdd1.union(rdd2) die schnellste (praktisch null Kosten) Möglichkeit zum Kombinieren der Eingabe-RDDs unter der Annahme, dass alle Elemente in rdd1 vor allen Elementen in rdd2 stehen (entsprechend der gewählten Reihenfolge).

Wenn die Bereiche der Eingangs-RDDs überlappen, wird es schwieriger. Unter der Annahme, dass die Ziel-RDD nur eine einzelne Partition haben soll, kann es effizient sein, toLocalIterator auf beiden RDDs zu verwenden und dann eine Zusammenführung manuell durchzuführen. Wenn das Ergebnis eine RDD sein muss, könnte man dies innerhalb der compute-Methode eines benutzerdefinierten RDD-Typs tun, die Eingabe-RDDs verarbeitet und die Ausgaben erzeugt.

Wenn die Eingänge groß sind und daher aus vielen Partitionen bestehen, wird es noch schwieriger. In diesem Fall möchten Sie möglicherweise auch mehrere Partitionen in der Ausgabe-RDD. Sie könnten die zuvor erwähnte benutzerdefinierte RDD verwenden, aber mehrere Partitionen erstellen (mit einer RangePartitioner). Jede Partition würde einen bestimmten Bereich von Elementen abdecken (im optimalen Fall würden diese Bereiche ungefähr gleich große Teile der Ausgabe abdecken).

Das schwierige Teil dabei ist es, die gesamte Eingabe RDDs mehrmals innerhalb compute zu verarbeiten. Dies kann effizient unter Verwendung von filterByRange von OrderedRDDFunctions vermieden werden, wenn die Eingangs-RDDs eine RangePartitioner verwenden. Wenn sie keine RangePartitioner verwenden, aber Sie wissen, dass Partitionen intern sortiert sind und auch eine globale Reihenfolge haben, müssten Sie zuerst die effektiven Bereiche herausfinden, die von diesen Partitionen abgedeckt werden, indem Sie tatsächlich in die Daten einsteigen.

Da der Fall mit mehreren Partitionen ziemlich komplex ist, würde ich prüfen, ob die benutzerdefinierte Sortierung wirklich schneller ist als einfach sortBy oder sortByKey zu verwenden. Die Logik für und sortByKey ist hinsichtlich des Shuffling-Prozesses (Übertragung von Daten zwischen Knoten) sehr optimiert. Aus diesem Grund kann es gut sein, dass diese Methoden in vielen Fällen schneller sind als die benutzerdefinierte Logik, obwohl die benutzerdefinierte Logik O (n) sein könnte, während /sortByKey O sein kann (n log (n)) bestenfalls.

Wenn Sie mehr über die von Apache Spark verwendete Shuffling-Logik erfahren möchten, finden Sie unter article das Grundkonzept.