Ist Spark SQL schneller als Hive?


Beste Antwort

In jedem möglichen Benchmark ist Spark SQL „viel“ schneller als Hive. Obwohl Facebook Presto erfunden hat – eine billige Kopie von Sparks Design, das unter die Haube von Hive gestellt wurde, und es gibt auch eine neuere Version von Hive auf Tez -, deren Missgeschick mit DAGs hier gut dokumentiert ist The Tragödie von Tez , aber in allen SQL-bezogenen Aufgaben (z. B. Map-seitige sqls => Filter-, Datenmutations- oder Reduce-Side-Sqls => Sortier- / Aggregat- / Fensterfunktionen) leuchtet Spark immer noch hell.

Da die Frage nicht nach dem Warum fragt, würde ich nicht viel auf diese technischen Details eingehen. Um Ihnen einen Eindruck zu vermitteln, stellen Sie sich ein verteiltes Datenverarbeitungsmodell vor, bei dem jede Aufgabe vor dem Abschluss den gesamten Datensatz (mit Replikation) schreiben muss, in dem die Anwendung die Ressourcennutzung nicht selbst beurteilen kann und in dem sich die Anwendung befindet Die Gnade des Cluster-Managers beim Starten der Aufgabe / Ausführungsphase und beim Vergleich mit einem anderen verteilten Datenverarbeitungsmodell, bei dem Aufgaben die meiste Zeit im Speicher gespeichert werden können, bei dem Ressourcen von der Engine intelligent zugewiesen werden können und bei dem das Framework sitzen kann an der Spitze eines Cluster-Managers und hängt für nichts vom Cluster-Manager ab – außer für die Containerzuweisung (und ein wenig De / Serialisierung, die sogar umgangen werden kann)

(und um es kurz zu machen, nicht Erwähnen Sie sogar, dass Spark 1.6 / 2.x das Spiel mit Wolfram oder einer Simd-Implementierung zur Abfrageoptimierung verstärkt.

Welches Modell würde Ihrer Meinung nach den Kampf um die Latenz gewinnen?

Antwort

Beginnen wir mit Ihrer Abfrage : Hive implementiert eine Teilmenge von SQL – die Hive-Sprache ( LanguageManual – Apache Hive – Apache Software Foundation ), die für die Funktionen von Hive und Hadoop spezifisch ist. Ihre übermittelte Abfrage ist in Teile, Prädikate unterteilt, die in Vorgängen oder Phasen implementiert werden können. Die SELECT col1 , col2 , … coln gibt an, welche Spalten jeder zurückgegebenen Zeile im Lösungssatz beibehalten und zurückgegeben werden. Ebenso würde ein LINKS- oder RECHTS-Join in einem bestimmten Zustand implementiert, wahrscheinlich in einer Map-Reduce-Phase (M\_R). Sobald Ihre Abfrage in Teile unterteilt wurde, die bestimmten Vorgängen entsprechen, verwendet der kostenbasierte Optimierer (Cost-Based Optimizer, CBO) gesammelte und gespeicherte Statistiken, um intelligente Entscheidungen darüber zu treffen, wie jede dieser Phasen ausgeführt wird. Beispielsweise kann eine WHERE-Klausel als Tabellenscan implementiert werden, wenn sie nicht sehr spezifisch ist (niedrige Kardinalität) oder wenn eine Tabelle nicht partitioniert ist, oder sie kann zur Eliminierung von Partitionen führen, wenn die Tabelle partitioniert ist und die WHERE-Klausel Partitionsspalten angibt mit hoher Spezifität. Wenn eine Abfrage mehrere Verknüpfungen angibt, wird jede Verknüpfung als Map-Reduce-Stufe implementiert. Wenn eine der Join-Tabellen sehr klein ist, kann ein Map-Join zur Ausführung durch den CBO ausgewählt werden, um eine bessere Leistung zu erzielen.

Sobald der CBO einen Ausführungsplan erstellt, werden die Phasen normalerweise geplant und ausgeführt als mehrere MR-Stufen. Sie können den Ausführungsplan untersuchen, den der CBO zum Ausführen einer bestimmten Abfrage verwenden würde, indem Sie eine EXPLAIN für die Abfrage ausführen.

Ich hatte einen Client in der Videoindustrie, der Statistiken über die Anzeigegewohnheiten seiner Benutzer sammelte. Diese Statistiken wurden in einer sehr großen Tabelle (100 TiB) zusammengefasst, die der Kunde zusammen mit etwa 20 relativ kleinen Tabellen zusammenstellen wollte, die Daten zu jedem Video, den Akteuren im Video, der Handlung jedes Videos, den Produktionsdaten usw. enthielten. Ich habe Ansichten erstellt, die nacheinander die kleineren Tabellen, die schließlich mit der Anzeigetabelle verbunden wurden, zu einer Ergebnisansicht zusammenfügten, die dann in eine Ausgabetabelle geschrieben wurde. Als ich eine einfache Abfrage zur Auswahl aus der Ergebnisansicht in die Ausgabetabelle übermittelte (CREATE TABLE-Ausgabe (…) AS SELECT * FROM results\_view), erstellte Hive eine 25-stufige Abfrage, die alle Zwischenansichten in die endgültige Ansicht materialisierte, die dann geschrieben wurde zur Ausgabetabelle. Da jede Phase ein M-R-Job (für YARN) war und die Rüstzeit für einen M-R-Job für diesen Cluster ungefähr 30 Sekunden betrug, wurden etwa 12 bis 14 Minuten für die M-R-Rüstzeit aufgewendet. Die meisten M-R-Stufen wurden in 5 Sekunden ausgeführt, 2/3 davon waren M-R-Einrichtungszeit und 1/3 der tatsächlichen Ausführung. Die endgültige Verknüpfung der kleineren Tabellen mit der Viewer-Statistik-Tabelle dauerte weitere 20 Minuten. Durch das Erstellen einer Reihe von Ansichten, die nacheinander zu einer Ergebnistabelle zusammengefügt wurden, konnte ich eine Pipeline erstellen, die aus einer Reihe relativ einfacher Abfragen zusammengesetzt war, anstatt zu versuchen, eine massive Abfrage zu erstellen, mit der versucht wurde, mehr als 20 Tabellen in einer Abfrage zusammenzuführen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.