Frage Was ist eine optimierte Methode zum Verknüpfen großer Tabellen in Spark SQL?


Ich muss Tabellen über Spark SQL oder Dataframe API verbinden. Müssen Sie wissen, was wäre der optimierte Weg, um es zu erreichen.

Szenario ist:

  1. Alle Daten sind im Hive im ORC-Format (Base Dataframe und Reference Files) vorhanden.
  2. Ich muss eine Base-Datei (Dataframe) aus Hive mit 11-13 anderen Referenzdatei zu einer großen In-Memory-Struktur (400 Spalten) (ca. 1 TB groß) zu verbinden

Was kann der beste Ansatz sein, um dies zu erreichen? Bitte teilen Sie Ihre Erfahrung, wenn jemand ein ähnliches Problem hat.


5
2018-06-15 18:01


Ursprung


Antworten:


Meine Standardempfehlung zur Optimierung von Joins lautet:

  1. Verwenden Sie einen Broadcast-Join, wenn Sie können (siehe dieses Notizbuch). Aus Ihrer Frage scheint es, dass Ihre Tabellen groß sind und ein Broadcast-Join keine Option ist.

  2. Erwägen Sie die Verwendung eines sehr großen Clusters (es ist billiger, als Sie vielleicht denken). 250 € jetzt (6/2016) kauft rund 24 Stunden mit 800 Cores mit 6 TB RAM und vielen SSDs auf dem EC2-Spot-Instance-Markt. Wenn ich über die Gesamtkosten einer Big-Data-Lösung nachdenke, finde ich, dass Menschen dazu neigen, ihre Zeit erheblich zu unterbewerten.

  3. Verwenden Sie denselben Partitionierer. Sehen diese Frage für Informationen zu gemeinsam gruppierten Joins.

  4. Wenn die Daten riesig sind und / oder Ihre Cluster nicht so wachsen können, dass sogar (3) oben zu OOM führt, verwenden Sie einen Zwei-Durchlauf-Ansatz. Zuerst partitionieren Sie die Daten neu und verwenden Sie partitionierte Tabellen (dataframe.write.partitionBy()). Verbinden Sie dann die Unterpartitionen seriell in einer Schleife und "anhängen" an die gleiche Endergebnis-Tabelle.

Randnotiz: Ich sage "anhängen" oben, weil ich in der Produktion nie benutze SaveMode.Append. Es ist nicht idempotent und das ist eine gefährliche Sache. ich benutze SaveMode.Overwrite tief in den Teilbaum einer partitionierten Tabellenstruktur. Vor 2.0.0 und 1.6.2 müssen Sie löschen _SUCCESS oder Metadatendateien oder dynamische Partitionserkennung werden erstickt.

Hoffe das hilft.


6
2018-06-16 03:38



Partitionieren Sie die Quell-Hash-Partitionen oder Bereichspartitionen oder Sie können benutzerdefinierte Partitionen schreiben, wenn Sie die Verknüpfungsfelder besser kennen. Die Partition wird dazu beitragen, eine Neupartitionierung während Joins zu vermeiden, da Spark-Daten von derselben Partition über Tabellen hinweg am selben Speicherort vorhanden sind. ORC wird definitiv helfen. Wenn dies immer noch zu einem Überlauf führt, versuchen Sie es mit Tachyon, der schneller als die Festplatte ist


1
2018-06-15 23:20