2016-09-19 1 views
15

Ich versuchte mit Apache-Drill eine einfache Join-Aggregat-Abfrage ausführen und die Geschwindigkeit war nicht wirklich gut. Meine Testabfrage war:Apache Drill schlechte Leistung

Wo Fakten über 422.000 Zeilen und Produkt hat 600 Zeilen. Die Gruppierung kommt mit 4 Zeilen zurück.

Zuerst habe ich diese Abfrage auf SqlServer getestet und habe ein Ergebnis in etwa 150ms zurück.

Mit Drill habe ich zuerst versucht, eine Verbindung direkt zu SqlServer und führen Sie die Abfrage, aber das war langsam (ca. 5 Sekunden).

Dann habe ich versucht, die Tabellen in JSON-Dateien zu speichern und von ihnen zu lesen, aber das war noch langsamer, also versuchte ich Parkett-Dateien.

Ich habe das Ergebnis im ersten Lauf in etwa 3 Sekunden zurück. Der nächste Lauf war etwa 900 ms und dann war es etwa 500 ms.

Aus dem Lesen, macht dies keinen Sinn und Bohrer sollte schneller sein! Ich versuchte "REFRESH TABLE METADATA", aber die Geschwindigkeit änderte sich nicht.

Ich habe dies auf Windows ausgeführt, über die Drill-Befehlszeile.

Irgendeine Idee, wenn ich etwas zusätzliche Konfiguration oder etwas brauche?

Danke!

Antwort

5

Warum erwarten Sie, dass Apache Drill hier schneller ist? Drill ist sehr schnell, aber es ist für große verteilte Abfragen entwickelt, möglicherweise über mehrere verschiedene Datenquellen ... aber Sie verwenden keine verteilten Daten.

SQL Server verfügt über Jahrzehnte Code und Optimierungen, die es zu einer der schnellsten relationalen Datenbanken auf einem einzelnen Server machen. Ihre Daten werden effizient gespeichert, im Speicher zwischengespeichert und die Abfrage wird im selben Prozess ausgeführt, so dass der Scan und die Verknüpfung sehr schnell erfolgen, insbesondere bei so wenig Daten.

Apache Drill hat viel mehr Arbeit im Vergleich zu tun. Es muss Ihre Abfrage in einen verteilten Plan interpretieren und dann an alle Drillbit-Prozesse senden, die dann die Datenquellen suchen, auf die Rohdaten zugreifen, die Abfrage ausführen, die Ergebnisse an den ersten Knoten zurückgeben und Sie dann Ihre endgültige Ausgabe haben .

JSON-Dateien sind auch langsam, weil sie Zeile für Zeile geöffnet und analysiert werden müssen. Parquet ist viel schneller, weil es ein komprimiertes, spaltenorientiertes Speicherformat ist, das für das Scannen sehr effizient ist, aber Drill muss weiterhin viel tun, um die Abfrage wie oben beschrieben auszuführen. Abhängig von der Datenquelle muss Drill möglicherweise alle Daten lesen und separat filtern, wodurch noch mehr Zeit gewonnen wird.

Jede relationale Datenbank ist schneller als Drill auf einer Einzelmaschine. Die Tatsache, dass Drill Ihnen Ergebnisse in 500ms mit Parkett bringt, ist wirklich beeindruckend, wenn man bedenkt, wie viel mehr Arbeit es machen muss, um Ihnen die Flexibilität zu geben, die es bietet. Wenn Sie nur ein paar Millionen Zeilen haben, bleiben Sie bei SQL Server. Wenn Sie Milliarden von Zeilen haben, verwenden Sie die SQL Server-Columnstore-Funktion zum Speichern von Daten im Spaltenformat mit hoher Komprimierung und Leistung.

Verwenden Apache Drill, wenn Sie:

  • Have (10s) Milliarden von Zeilen oder mehr
  • haben Daten über viele Maschinen verteilt
  • Haben unstrukturierte Daten wie json in Dateien ohne Standardschema gespeichert
  • Möchten Sie die Abfrage auf viele Computer aufteilen, um sie zu parallelisieren und schneller auszuführen
  • Möchten Sie auf Daten aus verschiedenen Datenbanken und Dateisystemen zugreifen
  • Möchten Sie Daten über diese verschiedenen Datenquellen
2

Eine Sache, die Menschen über verstehen, müssen sich registrieren, wie Drill funktioniert, ist, wie Drill eine SQL-Abfrage an einen ausführbaren Plan übersetzt zu holen und Prozessdaten aus theoretisch jede Quelle Daten. Ich habe bewusst keine Datenquelle angegeben, damit die Leute nicht an Datenbanken oder ein softwarebasiertes Datenmanagementsystem denken.

Drill verwendet Speicher-Plugins, um Datensätze aus allen Daten zu lesen, die vom Speicher-Plug-in unterstützt werden.

Nach Drill diese Zeilen bekommt, beginnt er die Durchführung, was benötigt wird, um die Abfrage auszuführen, was das Filtern kann erforderlich sein, das Sortieren, Fügen, Projizieren (bestimmte Spalten auswählen) ... etc

Das Gleiche gilt für Bohrer nicht Verwenden Sie standardmäßig eine der Funktionen der Quelle zum Verarbeiten der abgefragten Daten. Tatsächlich unterstützt die Quelle möglicherweise keine solchen Fähigkeiten!

Wenn Sie die Datenverarbeitungsfunktionen der Quelle nutzen möchten, müssen Sie das Speicher-Plugin ändern, mit dem Sie auf diese Quelle zugreifen.

Eine Abfrage, die ich regelmäßig daran erinnern, wann ich über Drill Leistung denken, dies ist ein

Select a.CUST_ID, (Select count(*) From SALES.CUSTOMERS where CUST_ID < a.CUST_ID) rowNum from SALES.CUSTOMERS a Order by CUST_ID 

Nur wegen des > Vergleichsoperators, Bohrer hat die gesamte Tabelle laden (also eigentlich eine Parkett-Datei) , SORT IT, führen Sie dann den Join durch.

Diese Abfrage dauerte ungefähr 18 Minuten, um auf meiner Maschine zu laufen, die eine nicht so leistungsfähige Maschine ist, aber dennoch muss der Aufwand, den Drill zur Verarbeitung dieser Abfrage ausführen muss, nicht ignoriert werden.

Der Zweck von Drill ist nicht, schnell zu sein, sondern es besteht darin, große Datenmengen zu verarbeiten und SQL-Abfragen für strukturierte und semistrukturierte Daten auszuführen. Und wahrscheinlich andere Dinge, an die ich im Moment nicht denken kann, aber Sie können mehr Informationen für andere Antworten finden.