Optimieren von funkenarmen Früchten, insbesondere Katalysatoroptimierer und Funkenkonfigurationen [geschlossen]

8

Ich benutze Spark 2.1.1, und ich benutze die Scala API, obwohl die Sprache weniger wichtig ist. Ich bin daran interessiert, Funkenabfragen / Pipelines effizient zu optimieren. Ich habe viel Material gelesen (einschließlich des großartigen "Learning Spark" -Buchs) und bin mit der Spark-Seite Jacek Laskowski Blog , und andere, und ich habe arbeitete fast zwei Jahre lang mit Funke.

Allerdings gibt es so viele Informationen und Konzepte, auf die man achten muss, und ich mache keine Optimierung genug, um sie alle zu kennen. Wenn alles zu 100% funktioniert, kann es leider nur noch wenige Tage oder sogar Stunden dauern, bis der Code geliefert werden muss. Ich muss die Fixes priorisieren, die ich anwenden kann. Ich habe den Arbeits-Spark-Code vorher optimiert, aber ich bin auf der Suche nach der besten Gesamtstrategie und versuche, mich mit den besten Low-Hanging-Fruits vertraut zu machen. Irgendwann werde ich mich an all die Knöpfe erinnern, die ich tun sollte, aber jetzt werden mindestens zehn sehr gute tun. Einige der Dinge, die ich momentan als wichtig erachte, sind (nicht wirklich geordnet, aber die ersten 4 sind zufällig die wichtigsten, die ich denke) ...

  1. Entwicklung - Reduzieren Sie Shuffle (Exchange), indem Sie das Dataset neu partitionieren oder aus einer Bucket-Hive-Tabelle abrufen.
  2. Strategie - Sehen Sie sich die Spark UI an, um zu sehen, welcher Job und welche Phase am längsten dauert, und schauen Sie sich diesen genauer an.
  3. Entwicklung - Filtern Sie Datensätze vor Joins so weit wie möglich, um zu vermeiden, dass viele N-Joins mit hoher Kardinalität erstellt werden und dass während Joins keine weiteren Daten gesendet werden.
  4. Konfigurieren - Richten Sie Executoren und Speicher ordnungsgemäß aus
  5. Entwicklung - Halten Sie sich so weit wie möglich von Cartesischen Produkten und Theta-Joins fern.
  6. Entwicklung - Verwenden Sie Spark-Bibliotheksfunktionen, bevor Sie nach Möglichkeit UDFs erstellen.
  7. Entwicklung - Versuchen Sie, einen Broadcast-Hash-Join zu erzwingen, wenn die Tabelle klein genug ist.
  8. Strategie - Verwenden Sie niemals die RDD-API anstelle von Dataset / Dataframe, es sei denn, es gibt einen bestimmten Grund (was bedeutet, dass ich nie die RDD-API verwende).
  9. Entwicklung - Erstellen Sie die Dataset-Filter, damit das Push-down-Prädikat mit ihnen zusammenarbeitet (machen Sie mehr und einfachere Filter anstelle von Multi-Condition-Filtern).
  10. Strategie & amp; Entwicklung - Lassen Sie den Quellcode immer offen, damit Typdeklarationen und andere Codeimplementierungen einfacher zu finden sind.
  11. Etwas, das ich vermisst habe ...

Die interessantesten Verbesserungen sind für mich jene, die sich aus einem Abfrageplan oder einer DAG-Visualisierung ergeben. Auch Binsenweisheiten, die Funke-Benutzer / Entwickler dazu gebracht haben, "Aha!" die du vielleicht teilen möchtest. Haftungsausschluss : Die obigen zehn Dinge sind für mich nicht unbedingt eine "Top Ten", wie die Verwendung von Spark Bibliotheksfunktionen anstelle von UDFs ist nicht super wichtig (sicherlich nicht Top Ten zumindest), aber ich wollte helfen Geben Sie mehrere Beispiele dafür, wie ein guter Tipp für jemanden aussehen könnte.

    
big_mike_boiii 06.12.2017, 02:05
quelle

0 Antworten