Ich erhalte denselben Fehler wie Fehlende Ausgabe Speicherort für Shuffle , wenn Sie in Spark SQL großen Datenfeldern beitreten. Die Empfehlung besteht darin, MEMORY_AND_DISK und / oder spark.shuffle.memoryFraction 0 festzulegen. Allerdings ist spark.shuffle.memoryFraction in Spark & gt; = 1.6.0 veraltet und die Einstellung MEMORY_AND_DISK sollte nicht helfen, wenn ich keine RDD oder Dataframe cache, oder? Außerdem bekomme ich viele andere WARN-Logs und Task-Wiederholungen, die mich glauben machen lassen, dass der Job nicht stabil ist.
Daher ist meine Frage:
Speziellere Fragen sind:
Bisher verwende ich dies ist die Antwort und dieses Kapitel als Ausgangspunkt. Und es gibt ein paar mehr stackoverflow-Seiten zu diesem Thema. Dennoch habe ich keine umfassende Antwort auf dieses beliebte Thema gefunden.
Vielen Dank im Voraus.
Das sind viele Fragen. Erlaube mir, diese eins nach dem anderen zu beantworten:
In einer Produktionsumgebung ist die Anzahl der Executoren meistens variabel. Dies hängt von den verfügbaren Ressourcen ab. Die Anzahl der Partitionen ist wichtig, wenn Sie Shuffles durchführen. Unter der Annahme, dass Ihre Daten jetzt verzerrt sind, können Sie die Belastung pro Aufgabe verringern, indem Sie die Anzahl der Partitionen erhöhen. Eine Aufgabe sollte idealerweise ein paar Minuszeichen enthalten. Wenn die Aufgabe zu lange dauert, ist es möglich, dass Ihr Container vorweggenommen wird und die Arbeit verloren geht. Wenn die Task nur wenige Millisekunden benötigt, wird der Overhead beim Starten der Task dominant.
Der Grad der Parallelität und die Optimierung Ihrer Executor-Größen, ich möchte auf den exzellenten Leitfaden von Cloudera verweisen: Ссылка
ORC und Parquet codieren nur die Daten im Ruhezustand. Wenn Sie den tatsächlichen Join ausführen, befinden sich die Daten in dem Speicherformat von Spark. Parkett wird immer populärer, seit Netflix und Facebook es angenommen haben und sich sehr viel Mühe gegeben haben. Parquet ermöglicht es Ihnen, die Daten effizienter zu speichern und hat einige Optimierungen (Prädikat Pushdown), die Spark verwendet.
Sie sollten den SQLContext anstelle des HiveContext verwenden, da der HiveContext veraltet ist. Der SQLContext ist allgemeiner und funktioniert nicht nur mit Hive.
Bei der Ausführung von registerTempTable
werden die Daten in SparkSession gespeichert. Dies hat keinen Einfluss auf die Ausführung des Joins. Es speichert nur den Ausführungsplan, der aufgerufen wird, wenn eine Aktion ausgeführt wird (z. B. saveAsTable
). Bei der Ausführung von saveAsTable
werden die Daten im verteilten Dateisystem gespeichert.
Hoffe, das hilft. Ich würde auch vorschlagen, dass wir unseren Vortrag auf dem Spark Summit über das Treffen von Joins verfolgen: Ссылка . Dies könnte Ihnen einige Einblicke geben.
Prost, Fokko
Tags und Links performance join apache-spark spark-dataframe apache-spark-sql