AresDB-Demo: Uber GPU-basiertes Open Source-Echtzeitanalysetool

Dank der Echtzeitanalyse erhalten wir als Uber-Mitarbeiter eine Vorstellung vom Stand der Dinge und der Arbeitseffizienz. Auf der Grundlage der Daten entscheiden wir, wie die QualitĂ€t der Arbeit auf der Uber-Plattform verbessert werden kann. Das Projektteam ĂŒberwacht beispielsweise die Marktlage und identifiziert potenzielle Probleme auf unserer Plattform. Software, die auf maschinellen Lernmodellen basiert, prognostiziert Passagierangebote und die Nachfrage nach Fahrern; Datenverarbeitungsspezialisten verbessern Modelle fĂŒr maschinelles Lernen, um die QualitĂ€t der Prognosen zu verbessern.



In der Vergangenheit haben wir fĂŒr Echtzeitanalysen Datenbanklösungen anderer Unternehmen verwendet, aber keine hat alle unsere Kriterien hinsichtlich FunktionalitĂ€t, Skalierbarkeit, Effizienz, Kosten und Betriebsanforderungen erfĂŒllt.


AresDB wurde im November 2018 veröffentlicht und ist ein Open-Source-Echtzeitanalysetool. Es verwendet ein unkonventionelles Netzteil, Grafikprozessoren (GPU), mit denen Sie den Umfang der Analyse erhöhen können. Die GPU-Technologie, ein vielversprechendes Echtzeit-Analysetool, hat in den letzten Jahren erhebliche Fortschritte gemacht und ist daher ideal fĂŒr paralleles Echtzeit-Computing und Datenverarbeitung geeignet.


In den folgenden Abschnitten beschreiben wir die Struktur von AresDB und wie diese interessante Lösung fĂŒr die Echtzeitanalyse es uns ermöglichte, Uber-Datenbanklösungen fĂŒr die Echtzeitanalyse effizienter und rationaler zu vereinheitlichen, zu vereinfachen und zu verbessern. Wir hoffen, dass Sie nach dem Lesen dieses Artikels AresDB als Teil Ihrer eigenen Projekte ausprobieren und auch dessen NĂŒtzlichkeit sicherstellen!


Uber Echtzeit-Analyseanwendungen


Die Datenanalyse ist entscheidend fĂŒr den Erfolg von Uber. Unter anderem werden Analysewerkzeuge verwendet, um die folgenden Aufgaben zu lösen:


  • Erstellen von Dashboards zur Überwachung von GeschĂ€ftsmetriken.
  • Treffen automatischer Entscheidungen (z. B. Ermittlung der Reisekosten und Ermittlung von BetrugsfĂ€llen ) auf der Grundlage der gesammelten zusammenfassenden Messdaten.
  • Erstellen Sie zufĂ€llige Abfragen zur Diagnose, Fehlerbehebung und Fehlerbehebung von GeschĂ€ftsvorgĂ€ngen.

Wir kategorisieren diese Funktionen mit unterschiedlichen Anforderungen wie folgt:



Dashboards und Entscheidungssysteme verwenden Echtzeitanalysesysteme, um Ă€hnliche Abfragen fĂŒr relativ kleine, aber sehr wichtige Teilmengen von Daten (mit der höchsten Datenrelevanz) mit hohem QPS und geringer Latenz zu erstellen.


Benötigen Sie ein anderes Analysemodul


Das hĂ€ufigste Problem, das Uber mithilfe von Echtzeitanalyse-Tools löst, ist die Berechnung von Zeitreihenpopulationen. Diese Berechnungen geben eine Vorstellung von Benutzerinteraktionen, damit wir die QualitĂ€t der Dienste entsprechend verbessern können. Basierend darauf fordern wir Indikatoren fĂŒr bestimmte Parameter (z. B. Tag, Stunde, Stadtkennung und Reisestatus) fĂŒr einen bestimmten Zeitraum fĂŒr zufĂ€llig gefilterte (oder manchmal kombinierte) Daten an. Im Laufe der Jahre hat Uber mehrere Systeme eingesetzt, um dieses Problem auf verschiedene Weise zu lösen.


Hier sind einige Lösungen von Drittanbietern, mit denen wir diese Art von Problem gelöst haben:


  • Apache Pinot , eine in Java geschriebene verteilte Open-Source-Analysedatenbank, eignet sich fĂŒr umfangreiche Datenanalysen. Pinot verwendet eine interne Lambda-Architektur, um Paketdaten und Echtzeitdaten im Spaltenspeicher abzufragen, einen invertierten Bitindex zum Filtern und einen Sternbaum, um aggregierte Ergebnisse zwischenzuspeichern. Es unterstĂŒtzt jedoch keine schlĂŒsselbasierte Deduplizierung, Aktualisierung oder EinfĂŒgung, ZusammenfĂŒhrung oder erweiterte Abfragefunktionen wie die Geodatenfilterung. Da Pinot eine JVM-basierte Datenbank ist, ist das Abfragen im Hinblick auf die Speichernutzung sehr teuer.
  • Elasticsearch wird von Uber verwendet, um verschiedene Streaming-Analyseaufgaben zu lösen. Es basiert auf der Apache Lucene- Bibliothek, in der Dokumente gespeichert sind, fĂŒr die Volltext-SchlĂŒsselwortsuche und einen invertierten Index. Das System ist weit verbreitet und erweitert, um aggregierte Daten zu unterstĂŒtzen. Ein invertierter Index bietet Filterung, ist jedoch nicht fĂŒr das Speichern und Filtern von Daten basierend auf Zeitbereichen optimiert. DatensĂ€tze werden in Form von JSON-Dokumenten gespeichert, was zusĂ€tzliche Kosten fĂŒr den Zugriff auf das Repository und die Anforderungen verursacht. Wie Pinot ist Elasticsearch eine JVM-basierte Datenbank und unterstĂŒtzt dementsprechend die Join-Funktion nicht, und die AusfĂŒhrung von Abfragen nimmt viel Speicherplatz in Anspruch.

Obwohl diese Technologien ihre StĂ€rken haben, fehlten ihnen einige der fĂŒr unseren Anwendungsfall erforderlichen Funktionen. Wir brauchten eine einheitliche, vereinfachte und optimierte Lösung, und bei der Suche arbeiteten wir in einer nicht standardmĂ€ĂŸigen Richtung (genauer gesagt innerhalb der GPU).


Verwendung der GPU fĂŒr die Echtzeitanalyse


FĂŒr ein realistisches Rendern von Bildern mit einer hohen Bildrate verarbeiten GPUs gleichzeitig eine große Anzahl von Formen und Pixeln mit hoher Geschwindigkeit. Obwohl die Tendenz, die Taktfrequenz von Datenverarbeitungseinheiten in den letzten Jahren zu erhöhen, abgenommen hat, hat die Anzahl der Transistoren im Chip nur nach dem Moore'schen Gesetz zugenommen. Infolgedessen steigt die GPU-Rechengeschwindigkeit, gemessen in Gigaflops pro Sekunde (Gflops / s), schnell an. Abbildung 1 zeigt einen Vergleich des theoretischen Geschwindigkeitstrends (Gflops / s) der NVIDIA-GPU und der Intel-CPU ĂŒber die Jahre:



Abbildung 1. Vergleich der Gleitkomma-CPU- und GPU-Leistung mit einfacher Genauigkeit ĂŒber mehrere Jahre. Bild aus dem CUDA C-Programmierhandbuch von Nvidia.


Bei der Entwicklung des Echtzeitanalyseanforderungsmechanismus war die Entscheidung zur Integration der GPU selbstverstÀndlich. In Uber erfordert eine typische Echtzeitanalyseanforderung, dass Daten in wenigen Tagen mit Millionen oder sogar Milliarden von DatensÀtzen verarbeitet, dann gefiltert und in kurzer Zeit zusammengefasst werden. Diese Rechenaufgabe passt perfekt in das Allzweck-GPU-Parallelverarbeitungsmodell, weil sie:


  • Sie verarbeiten Daten parallel mit sehr hoher Geschwindigkeit.
  • Sie bieten eine höhere Rechengeschwindigkeit (Gflops / s), wodurch sie sich hervorragend fĂŒr die AusfĂŒhrung komplexer Rechenaufgaben (in Datenblöcken) eignen, die parallelisiert werden können.
  • Sie bieten eine höhere Leistung (ohne Verzögerung) beim Datenaustausch zwischen der Recheneinheit und dem Speicher (ALU und globale Speicher-GPU) im Vergleich zu Zentraleinheiten (CPUs), was sie ideal fĂŒr die Verarbeitung von parallelen Speicher-E / A-Aufgaben macht, die erfordert eine erhebliche Datenmenge.

Wir konzentrierten uns auf die Verwendung einer GPU-basierten Analysedatenbank und bewerteten - vom Standpunkt unserer Anforderungen aus - mehrere vorhandene Analyselösungen, die GPUs verwenden:


  • Kinetica , ein GPU-basiertes Analysetool, kam 2009 auf den Markt, zunĂ€chst fĂŒr den Einsatz in der US-Armee und bei Geheimdiensten. Obwohl es das hohe Potenzial der GPU-Technologie in der Analytik demonstriert, haben wir festgestellt, dass fĂŒr unsere Nutzungsbedingungen viele SchlĂŒsselfunktionen fehlen, einschließlich Ändern des Schemas, teilweises EinfĂŒgen oder Aktualisieren, Datenkomprimierung, Festplatten- und Speicherkonfiguration auf Spaltenebene und Verbindung durch rĂ€umliche Beziehungen.
  • OmniSci , ein Open-Source-SQL-Abfragemodul, schien eine vielversprechende Option zu sein. Bei der Bewertung des Produkts stellten wir jedoch fest, dass einige wichtige Funktionen fĂŒr die Verwendung in Uber fehlten, z. B. die Deduplizierung. Obwohl OminiSci 2017 den Open-Source-Code seines Projekts einfĂŒhrte, kamen wir nach der Analyse der auf C ++ basierenden Lösung zu dem Schluss, dass eine Änderung oder Verzweigung der Codebasis praktisch nicht möglich ist.
  • GPU-basierte Echtzeit-Analysetools wie GPUQP , CoGaDB , GPUDB , Ocelot , OmniDB und Virginian werden hĂ€ufig in Forschungs- und Bildungseinrichtungen eingesetzt. Angesichts ihrer akademischen Ziele konzentrieren sich diese Entscheidungen jedoch eher auf die Entwicklung von Algorithmen und Testkonzepten als auf die Lösung realer Probleme. Aus diesem Grund haben wir sie nicht berĂŒcksichtigt - unter den Bedingungen unseres Volumens und Umfangs.

Im Allgemeinen zeigen diese Systeme den enormen Vorteil und das Potenzial der Datenverarbeitung mithilfe der GPU-Technologie und haben uns dazu inspiriert, eine eigene Echtzeit-Analyselösung auf Basis der GPU zu entwickeln, die an die Anforderungen von Uber angepasst ist. Basierend auf diesen Konzepten haben wir den Quellcode fĂŒr AresDB entwickelt und geöffnet.


AresDB-ArchitekturĂŒbersicht


Auf hoher Ebene speichert AresDB die meisten Daten im Hostspeicher (RAM, der mit der CPU verbunden ist), verwendet die CPU zur Verarbeitung empfangener Daten und Festplatten zur Wiederherstellung von Daten. WĂ€hrend des Anforderungszeitraums ĂŒbertrĂ€gt AresDB Daten vom Hostspeicher zum GPU-Speicher zur parallelen Verarbeitung in der GPU. Wie in Abbildung 2 unten gezeigt, enthĂ€lt AresDB Speicher, Metadatenspeicher und Festplatte:



Abbildung 2. Die einzigartige Architektur von AresDB umfasst Speicher-, Festplatten- und Metadatenspeicher.


Tabellen


Im Gegensatz zu den meisten relationalen Datenbankverwaltungssystemen (RDBMS) verfĂŒgt AresDB nicht ĂŒber einen Datenbank- oder Schemabereich. Alle Tabellen gehören zum selben Bereich in einem Cluster / einer Instanz von AresDB, sodass Benutzer direkt darauf zugreifen können. Benutzer speichern ihre Daten in Form von Faktentabellen und Dimensionstabellen.


Faktentabelle


Die Faktentabelle speichert einen endlosen Strom von Zeitreihenereignissen. Benutzer verwenden eine Faktentabelle, um Ereignisse / Fakten zu speichern, die in Echtzeit auftreten. Jedes Ereignis ist mit dem Zeitpunkt des Ereignisses verknĂŒpft, und die Tabelle wird hĂ€ufig zum Zeitpunkt des Ereignisses abgefragt. Als Beispiel fĂŒr die Art der Informationen, die in der Faktentabelle gespeichert sind, können wir Reisen benennen, bei denen jede Reise ein Ereignis ist, und die Zeit der Reiseanforderung wird hĂ€ufig als die Zeit des Ereignisses bezeichnet. Wenn einem Ereignis mehrere Zeitstempel zugeordnet sind, wird nur ein Zeitstempel als Uhrzeit des Ereignisses angezeigt und in der Faktentabelle angezeigt.


Messtabelle


In der Messtabelle werden die aktuellen Merkmale der Einrichtungen (einschließlich StĂ€dte, Kunden und Fahrer) gespeichert. Beispielsweise können Benutzer Informationen ĂŒber die Stadt, insbesondere den Namen der Stadt, die Zeitzone und das Land, in der Messtabelle speichern. Im Gegensatz zu Faktentabellen, die stĂ€ndig wachsen, sind Dimensionstabellen immer in ihrer GrĂ¶ĂŸe begrenzt (beispielsweise ist bei Uber die Stadttabelle durch die tatsĂ€chliche Anzahl von StĂ€dten auf der Welt begrenzt). Maßtabellen erfordern keine spezielle Zeitspalte.


Datentypen


Die folgende Tabelle zeigt die aktuellen Datentypen, die von AresDB unterstĂŒtzt werden:



In AresDB werden Zeichenfolgen automatisch in AufzĂ€hlungen konvertiert, bevor sie in die Datenbank eingegeben werden, um das Speichern und die Abfrageeffizienz zu vereinfachen . Dies ermöglicht die ÜberprĂŒfung der Gleichheit zwischen Groß- und Kleinschreibung, unterstĂŒtzt jedoch keine erweiterten VorgĂ€nge wie Verkettung, Teilzeichenfolgen, Masken und den Abgleich regulĂ€rer AusdrĂŒcke. In Zukunft beabsichtigen wir, die Volllinien-Support-Option hinzuzufĂŒgen.


Hauptfunktionen


Die AresDB-Architektur unterstĂŒtzt die folgenden Funktionen:


  • Spaltenbasierter Speicher mit Komprimierung zur Steigerung der Speichereffizienz (weniger Speicher in Byte zum Speichern von Daten) und der Abfrageeffizienz (weniger Datenaustausch zwischen CPU-Speicher und GPU-Speicher bei der Verarbeitung einer Anforderung)
  • Echtzeit-Aktualisierung oder EinfĂŒgung mit PrimĂ€rschlĂŒsseldeduplizierung , um die Datengenauigkeit und Echtzeit-Datenaktualisierungen in wenigen Sekunden zu verbessern
  • GPU-Anforderungsverarbeitung fĂŒr hochparallele GPU -Datenverarbeitung mit geringer Anforderungslatenz (von Sekundenbruchteilen bis zu mehreren Sekunden)

Spaltenspeicherung


Vektor


AresDB speichert alle Daten in einem Spaltenformat. Die Werte jeder Spalte werden als Spaltenwertvektor gespeichert. Der Konfidenz- / Unsicherheitsmarker der Werte in jeder Spalte wird in einem separaten Nullvektor gespeichert, wÀhrend der Konfidenzmarker jedes Werts als ein Bit dargestellt wird.


Aktiver Speicher


AresDB speichert unkomprimierte und unsortierte Spaltendaten (aktive Vektoren) im aktiven Speicher. DatensĂ€tze im aktiven Speicher werden in (aktive) Pakete eines bestimmten Volumes unterteilt. Beim Empfang von Daten werden neue Pakete erstellt, wĂ€hrend alte Pakete nach der Archivierung von DatensĂ€tzen gelöscht werden. Der PrimĂ€rschlĂŒsselindex wird zum Auffinden von Deduplizierungs- und AktualisierungsdatensĂ€tzen verwendet. Abbildung 3 unten zeigt, wie wir aktive DatensĂ€tze organisieren und den PrimĂ€rschlĂŒsselwert verwenden, um ihren Speicherort zu bestimmen:



Abbildung 3. Wir verwenden den PrimĂ€rschlĂŒsselwert, um den Speicherort des Pakets und die Position jedes Datensatzes innerhalb des Pakets zu bestimmen.


Die Werte jeder Spalte im Paket werden als Spaltenvektor gespeichert. Der ZuverlĂ€ssigkeits- / Unsicherheitsmarker von Werten in jedem Wertvektor wird als separater Nullvektor gespeichert, und der ZuverlĂ€ssigkeitsmarker jedes Werts wird als ein Bit dargestellt. In Abbildung 4 unten bieten wir ein Beispiel mit fĂŒnf Werten fĂŒr die Spalte city_id :



Abbildung 4. Wir speichern Werte (Istwert) und Nullvektoren (Konfidenzmarker) von nicht komprimierten Spalten in der Datentabelle.


Archivspeicher


AresDB speichert auch fertige, sortierte und komprimierte Spaltendaten (Archivvektoren) im Archivspeicher ĂŒber Faktentabellen. DatensĂ€tze im Archivspeicher werden ebenfalls stapelweise verteilt. Im Gegensatz zu aktiven Paketen speichert das Archivpaket DatensĂ€tze pro Tag gemĂ€ĂŸ der koordinierten Weltzeit (UTC). Ein Archivpaket verwendet seit Unix Epoch die Anzahl der Tage als Paketkennung.


DatensĂ€tze werden in sortierter Form gemĂ€ĂŸ einer benutzerdefinierten Spaltensortierreihenfolge gespeichert. Wie in Abbildung 5 unten gezeigt, sortieren wir zuerst nach der Spalte city_id und dann nach der city_id :



Abbildung 5. Wir sortieren alle Zeilen nach city_id, dann nach state und komprimieren dann jede Spalte nach Gruppencodierung. Nach dem Sortieren und Komprimieren erhÀlt jede Spalte einen Abrechnungsvektor.


Das Ziel beim Festlegen der Benutzersortierreihenfolge fĂŒr Spalten lautet wie folgt:


  • Maximierung des Komprimierungseffekts durch Sortieren von Spalten mit einer kleinen Anzahl von Elementen. Die maximale Komprimierung verbessert die Speichereffizienz (zum Speichern von Daten sind weniger Bytes erforderlich) und die Abfrageeffizienz (weniger Bytes werden zwischen dem CPU-Speicher und dem GPU-Speicher ĂŒbertragen).
  • Bereitstellen einer bequemen bereichsbasierten Vorfilterung fĂŒr gĂ€ngige Ă€quivalente Filter, z. B. city_id = 12. Durch die Vorfilterung wird die Anzahl der Bytes minimiert, die zum Übertragen von Daten zwischen dem CPU-Speicher und dem GPU-Speicher erforderlich sind, wodurch die Abfrageeffizienz maximiert wird.

Eine Spalte wird nur komprimiert, wenn sie in der vom Benutzer angegebenen Sortierreihenfolge vorhanden ist. Wir versuchen nicht, Spalten mit einer großen Anzahl von Elementen zu komprimieren, da dies wenig Speicherplatz spart.


Nach dem Sortieren werden die Daten fĂŒr jede qualifizierte Spalte mithilfe einer bestimmten Gruppencodierungsoption komprimiert. ZusĂ€tzlich zum Wertvektor und zum Nullvektor fĂŒhren wir einen Abrechnungsvektor ein, um denselben Wert erneut darzustellen.


Echtzeit-Datenempfang mit UnterstĂŒtzung fĂŒr Aktualisierungs- und EinfĂŒgefunktionen


Clients erhalten Daten ĂŒber die HTTP-API, indem sie ein Service Pack veröffentlichen. Ein Service Pack ist ein speziell geordnetes BinĂ€rformat, das die Speicherplatznutzung minimiert und gleichzeitig den zufĂ€lligen Zugriff auf Daten gewĂ€hrleistet.


Wenn AresDB das Service Pack empfĂ€ngt, schreibt es zuerst das Service Pack in das Wiederherstellungsvorgangsprotokoll. Wenn ein Service Pack am Ende des Ereignisprotokolls hinzugefĂŒgt wird, identifiziert und ĂŒberspringt AresDB spĂ€te EintrĂ€ge in den Faktentabellen zur Verwendung im aktiven Speicher. Ein Datensatz wird als "spĂ€t" betrachtet, wenn die Ereigniszeit vor der archivierten Zeit des Trennungsereignisses liegt. FĂŒr DatensĂ€tze, die nicht als "spĂ€t" eingestuft werden, verwendet AresDB den PrimĂ€rschlĂŒsselindex, um das Paket im aktiven Speicher zu suchen, in den Sie sie einfĂŒgen möchten. Wie in Abbildung 6 unten gezeigt, werden neue DatensĂ€tze (die zuvor aufgrund des PrimĂ€rschlĂŒsselwerts nicht gefunden wurden) in den leeren Bereich eingefĂŒgt und vorhandene DatensĂ€tze direkt aktualisiert:



Abbildung 6. Wenn Daten empfangen werden, werden nach dem HinzufĂŒgen des Service Packs zum Ereignisprotokoll die „spĂ€ten“ EintrĂ€ge zur umgekehrten Warteschlange und andere EintrĂ€ge zum aktiven Speicher hinzugefĂŒgt.


Archivierung


Wenn Daten empfangen werden, werden DatensĂ€tze entweder im aktiven Speicher hinzugefĂŒgt / aktualisiert oder der umgekehrten Warteschlange hinzugefĂŒgt und warten auf die Platzierung im Archivspeicher.


Wir starten regelmĂ€ĂŸig einen geplanten Prozess, der als Archivierung bezeichnet wird, in Bezug auf die DatensĂ€tze des aktiven Speichers, um neue DatensĂ€tze (DatensĂ€tze, die noch nie archiviert wurden) an den Archivspeicher anzuhĂ€ngen. Der Archivierungsprozess verarbeitet nur die DatensĂ€tze im aktiven Speicher mit der Ereigniszeit im Bereich zwischen der alten Abschaltzeit (Abschaltzeit vom letzten Archivierungsprozess) und der neuen Abschaltzeit (neue Abschaltzeit basierend auf dem Parameter fĂŒr die Archivierungsverzögerung im Tabellenlayout).


Die Datensatzereigniszeit wird verwendet, um zu bestimmen, in welchen ArchivpaketdatensĂ€tzen kombiniert werden sollen, wenn Archivdaten in tĂ€gliche Pakete gepackt werden. Die Archivierung erfordert keine Deduplizierung des Index des PrimĂ€rschlĂŒsselwerts wĂ€hrend des ZusammenfĂŒhrens, da nur DatensĂ€tze im Bereich zwischen der alten und der neuen Abschaltzeit archiviert werden.


Abbildung 7 unten zeigt ein Diagramm nach dem Zeitpunkt des Ereignisses eines bestimmten Datensatzes.



Abbildung 7. Wir verwenden die Ereigniszeit und die Auslösezeit, um die DatensĂ€tze als neu (aktiv) und alt zu definieren (die Ereigniszeit ist frĂŒher als die archivierte Zeit des Auslöseereignisses).


In diesem Fall ist das Archivierungsintervall das Zeitintervall zwischen den beiden Archivierungsprozessen, und die Archivierungsverzögerung ist der Zeitraum nach dem Zeitpunkt des Ereignisses, jedoch bis zur Archivierung des Ereignisses. Beide Parameter sind in den Einstellungen des AresDB-Tabellenschemas definiert.


VerfĂŒllung


Wie in Abbildung 7 oben gezeigt, werden alte DatensĂ€tze (deren Ereigniszeit vor der archivierten Zeit des Herunterfahrereignisses liegt) fĂŒr Faktentabellen zur umgekehrten Warteschlange hinzugefĂŒgt und schließlich als Teil des AuffĂŒllprozesses verarbeitet. Die Auslöser dieses Prozesses sind auch die Zeit oder GrĂ¶ĂŸe der umgekehrten Warteschlange, wenn sie einen Schwellenwert erreicht. Im Vergleich zum HinzufĂŒgen von Daten zum aktiven Speicher ist das AuffĂŒllen asynchron und im Hinblick auf CPU- und Speicherressourcen relativ teuer. Das AuffĂŒllen wird in den folgenden Szenarien verwendet:


  • Verarbeitung zufĂ€lliger, sehr spĂ€ter Daten
  • Manuelle Erfassung historischer Daten aus einem vorgelagerten Datenstrom
  • Eingabe historischer Daten in kĂŒrzlich hinzugefĂŒgte Spalten

Im Gegensatz zur Archivierung ist der Backfill-Prozess idempotent und erfordert eine Deduplizierung basierend auf dem Wert des PrimĂ€rschlĂŒssels. FĂŒllbare Daten sind letztendlich fĂŒr Abfragen sichtbar.


Die umgekehrte Warteschlange wird mit einer vordefinierten GrĂ¶ĂŸe im Speicher gehalten, und bei einer großen Menge an AuffĂŒllung wird der Prozess fĂŒr den Client blockiert, bis die Warteschlange durch Starten des AuffĂŒllprozesses gelöscht wird.


Anfrage bearbeiten


In der aktuellen Implementierung muss der Benutzer die von Uber erstellte Ares Query Language (AQL) verwenden, um Abfragen in AresDB auszufĂŒhren. AQL ist eine effektive Sprache fĂŒr analytische Zeitreihenabfragen und folgt nicht der Standard-SQL-Syntax wie "SELECT FROM WHERE GROUP BY" wie andere SQL-Ă€hnliche Sprachen. Stattdessen wird AQL in strukturierten Feldern verwendet und kann in JSON-, YAML- und Go-Objekten enthalten sein. Anstelle der /SELECT (*) /FROM /GROUP BY city_id, /WHERE = «» /AND request_at >= 1512000000 wird die entsprechende AQL-Variante in JSON wie folgt geschrieben:


 { “table”: “trips”, “dimensions”: [ {“sqlExpression”: “city_id”} ], “measures”: [ {“sqlExpression”: “count(*)”} ], ;”> “rowFilters”: [ “status = 'completed'” ], “timeFilter”: { “column”: “request_at”, “from”: “2 days ago” } } 

Im JSON-Format bietet AQL Entwicklern eines Dashboards und eines Entscheidungsfindungssystems einen bequemeren Programmabfragealgorithmus als SQL, mit dem sie Abfragen einfach erstellen und mithilfe von Code bearbeiten können, ohne sich um Dinge wie SQL-Injection kĂŒmmern zu mĂŒssen. Es fungiert als universelles Abfrageformat fĂŒr typische Architekturen von Webbrowsern, externen und internen Servern bis zur Datenbank (AresDB). DarĂŒber hinaus bietet AQL eine praktische Syntax zum Filtern nach Zeit und Batching mit UnterstĂŒtzung fĂŒr die eigene Zeitzone. DarĂŒber hinaus unterstĂŒtzt die Sprache eine Reihe von Funktionen, z. B. implizite Unterabfragen, um hĂ€ufige Fehler bei Abfragen zu vermeiden, und erleichtert Entwicklern der internen Schnittstelle das Analysieren und Umschreiben von Abfragen.


Trotz der vielen Vorteile, die AQL bietet, sind wir uns bewusst, dass die meisten Ingenieure mit SQL besser vertraut sind. Die Bereitstellung einer SQL-Schnittstelle zum AusfĂŒhren von Abfragen ist einer der nĂ€chsten Schritte, die wir im Rahmen unserer BemĂŒhungen zur Verbesserung der Interaktion mit AresDB-Benutzern betrachten werden.


Das Flussdiagramm fĂŒr die AusfĂŒhrung von AQL-Abfragen ist in Abbildung 8 dargestellt:



Abbildung 8. Das AresDB-Abfrageflussdiagramm verwendet unsere eigene AQL-Abfragesprache, um Daten schnell und effizient zu verarbeiten und abzurufen.


Abfragekompilierung


Eine AQL-Abfrage wird in den internen Abfragekontext kompiliert. AusdrĂŒcke in Filtern, Messungen und Parametern werden in abstrakten SyntaxbĂ€umen (AST) zur weiteren Verarbeitung durch einen Grafikprozessor (GPU) analysiert.


Laden von Daten


AresDB verwendet Vorfilter, um Archivdaten kostengĂŒnstig zu filtern, bevor sie zur parallelen Verarbeitung an die GPU gesendet werden. Da archivierte Daten nach der konfigurierten Spaltenreihenfolge sortiert sind, können einige Filter diese Sortierreihenfolge und die binĂ€re Suchmethode verwenden, um den geeigneten Übereinstimmungsbereich zu bestimmen. Insbesondere können Ă€quivalente Filter fĂŒr alle anfĂ€nglich sortierten X-Spalten und ein optionaler Bereichsfilter fĂŒr sortierte Spalten X + 1 als vorlĂ€ufige Filter verwendet werden, wie in Abbildung 9 unten gezeigt.



Abbildung 9. AresDB filtert die Spaltendaten vor, bevor sie zur Verarbeitung an die GPU gesendet werden.


Nach der Vorfilterung sollten nur grĂŒne Werte (die die Filterbedingung erfĂŒllen) zur parallelen Verarbeitung an die GPU gesendet werden. Eingabedaten werden in die GPU geladen und jeweils paketweise verarbeitet. Dies umfasst sowohl aktive Pakete als auch Archivpakete.


AresDB verwendet CUDA-Streams fĂŒr Pipelining und Datenverarbeitung. FĂŒr jede Anforderung werden zwei Ströme abwechselnd zur Verarbeitung in zwei ĂŒberlappenden Stufen angewendet. In Abbildung 10 unten bieten wir ein Diagramm an, das diesen Prozess veranschaulicht.



Abbildung 10. In AresDB ĂŒbertragen und verarbeiten zwei CUDA-Threads abwechselnd Daten.


AbfrageausfĂŒhrung


Der Einfachheit halber verwendet AresDB die Thrust-Bibliothek zum Implementieren von AbfrageausfĂŒhrungsprozeduren, die Blöcke eines fein abgestimmten parallelen Algorithmus fĂŒr die schnelle Implementierung von Abfragen im aktuellen Tool bietet.


In Thrust werden Eingabe- und Ausgabevektordaten unter Verwendung von Iteratoren mit wahlfreiem Zugriff ausgewertet. Jeder GPU-Thread sucht an seiner Arbeitsposition nach Eingabe-Iteratoren, liest die Werte und fĂŒhrt Berechnungen durch und schreibt das Ergebnis an die entsprechende Position im Ausgabe-Iterator.


Zur Auswertung von AresDB-AusdrĂŒcken folgt das OOPK-Modell (One Operator Per Core).


In Abbildung 11 unten wird diese Prozedur anhand des AST-Beispiels demonstriert, das aus dem Dimensionsausdruck request_at – request_at % 86400 in der Phase der Anforderungskompilierung generiert wurde:



Abbildung 11. AresDB verwendet das OOPK-Modell zur Auswertung von AusdrĂŒcken.


Im OOPK-Modell umgeht die AresDB-Abfrage-Engine jeden Blattknoten des AST-Baums und gibt einen Iterator fĂŒr den Quellknoten zurĂŒck. Wenn der Wurzelknoten ebenfalls endlich ist, wird die Wurzelaktion direkt auf dem Eingabe-Iterator ausgefĂŒhrt.


FĂŒr jeden Nicht-Root-Nicht-End-Knoten (in diesem Beispiel Modulo-Operation ) wird ein temporĂ€rer Arbeitsbereichsvektor zugewiesen, um das Zwischenergebnis zu speichern, das aus dem Ausdruck request_at% 86400 . Mit Thrust wird eine Kernelfunktion gestartet, um das Ergebnis dieser Anweisung in der GPU zu berechnen. Die Ergebnisse werden im Arbeitsbereich-Iterator gespeichert.


Bei einem Root-Knoten wird die Kernelfunktion auf dieselbe Weise ausgefĂŒhrt wie bei einem nicht-root-Knoten, der nicht endlich ist. AbhĂ€ngig von der Art des Ausdrucks, der im Folgenden ausfĂŒhrlich beschrieben wird, werden verschiedene Ausgabeaktionen ausgefĂŒhrt:


  • Filtern, um die Anzahl der Eingabevektorelemente zu reduzieren
  • Aufzeichnen von Messausgangsdaten in einem Messvektor fĂŒr die anschließende ZusammenfĂŒhrung von Daten
  • Notieren Sie die Ausgabe der Parameter im Parametervektor fĂŒr die anschließende ZusammenfĂŒhrung der Daten

Nach der Auswertung des Ausdrucks werden Sortierung und Transformation durchgefĂŒhrt, um die Daten endgĂŒltig zu kombinieren. Bei Sortier- und Transformationsoperationen verwenden wir die Werte des Dimensionsvektors als SchlĂŒsselwerte fĂŒr das Sortieren und Transformieren und die Werte des Parametervektors als Werte zum Kombinieren von Daten. Somit werden Zeilen mit Ă€hnlichen Dimensionswerten gruppiert und kombiniert. Abbildung 12 zeigt diesen Sortier- und Konvertierungsprozess.



Abbildung 12. Nach der Auswertung des Ausdrucks sortiert und konvertiert AresDB die Daten gemĂ€ĂŸ den SchlĂŒsselwerten der Messvektoren (SchlĂŒsselwert) und Parameter (Wert).


AresDB unterstĂŒtzt auch die folgenden erweiterten Abfragefunktionen:



Ressourcenmanagement


Als Datenbank, die auf internem Speicher basiert, muss AresDB die folgenden Arten der Speichernutzung verwalten:



Beim Start von AresDB wird das konfigurierte Budget fĂŒr gemeinsam genutzten Speicher verwendet. Das Budget ist in alle sechs Speichertypen unterteilt und sollte auch genĂŒgend Platz fĂŒr das Betriebssystem und andere Prozesse lassen. Dieses Budget enthĂ€lt auch eine statisch konfigurierte ÜberlastungsschĂ€tzung, einen vom Server ĂŒberwachten aktiven Datenspeicher und archivierte Daten, die der Server je nach verbleibendem Speicherbudget herunterladen und löschen möchte.
Abbildung 13 zeigt das AresDB-Hostspeichermodell.



Abbildung 13. AresDB verwaltet seine eigene Speichernutzung so, dass das konfigurierte Gesamtprozessbudget nicht ĂŒberschritten wird.


Mit AresDB können Benutzer Preload-Tage und PrioritĂ€ten auf Spaltenebene fĂŒr Faktentabellen festlegen und archivierte Daten nur an Preload-Tagen vorab laden. Daten, die zuvor nicht heruntergeladen wurden, werden bei Bedarf von der Festplatte in den Speicher geladen. Beim AuffĂŒllen löscht AresDB auch archivierte Daten aus dem Hostspeicher. Die Prinzipien der AresDB-Entfernung basieren auf den folgenden Parametern: Anzahl der Tage des Vorladens, PrioritĂ€ten der Spalten, Tag der Kompilierung des Pakets und GrĂ¶ĂŸe der Spalte.


AresDB verwaltet auch mehrere GPU-GerĂ€te und simuliert GerĂ€teressourcen als GPU-Threads und GerĂ€tespeicher, um die Verwendung des GPU-Speichers fĂŒr die Verarbeitung von Anforderungen zu verfolgen. AresDB verwaltet GPU-GerĂ€te ĂŒber einen GerĂ€te-Manager, der GPU-GerĂ€teressourcen in zwei Dimensionen (GPU-Threads und GerĂ€tespeicher) modelliert und die Speichernutzung bei der Verarbeitung von Anforderungen verfolgt. Nach dem Kompilieren der Anforderung können Benutzer mit AresDB die Menge an Ressourcen schĂ€tzen, die zum Abschließen der Anforderung erforderlich sind. Die Speicheranforderungen des GerĂ€ts mĂŒssen erfĂŒllt sein, bevor die Anforderung gelöst wird. Wenn auf einem GerĂ€t derzeit nicht genĂŒgend Speicher vorhanden ist, sollte die Anforderung warten. Derzeit kann AresDB eine oder mehrere Anforderungen gleichzeitig auf demselben GPU-GerĂ€t ausfĂŒhren, wenn das GerĂ€t alle Ressourcenanforderungen erfĂŒllt.


In der aktuellen Implementierung speichert AresDB keine Eingaben im GerĂ€tespeicher fĂŒr die Wiederverwendung in mehreren Anforderungen. AresDB zielt darauf ab, Abfragen fĂŒr DatensĂ€tze zu unterstĂŒtzen, die stĂ€ndig in Echtzeit aktualisiert und schlecht zwischengespeichert werden. In zukĂŒnftigen Versionen von AresDB beabsichtigen wir, Funktionen zum Zwischenspeichern von Daten im GPU-Speicher zu implementieren, um die Abfrageleistung zu optimieren.


Anwendungsbeispiel: Uber Übersicht Dashboard


Bei Uber verwenden wir AresDB, um Dashboards zum Abrufen von GeschĂ€ftsinformationen in Echtzeit zu erstellen. AresDB ist dafĂŒr verantwortlich, primĂ€re Ereignisse mit stĂ€ndigen Aktualisierungen zu speichern und kritische Metriken in Sekundenbruchteilen zu berechnen, dank GPU-Ressourcen zu geringen Kosten, sodass Benutzer Dashboards interaktiv verwenden können. Beispielsweise werden anonymisierte Reisedaten mit einer langen GĂŒltigkeitsdauer im Data Warehouse von mehreren Diensten aktualisiert, darunter unser Versandsystem, Zahlungs- und Preissysteme. Um Reisedaten effizient zu nutzen, teilen Benutzer Daten in verschiedene Dimensionen auf und teilen sie auf, um Einblicke in Echtzeitlösungen zu erhalten.


Bei Verwendung von AresDB ist das Uber-Dashboard ein weit verbreitetes Analyse-Dashboard, das von Teams im Unternehmen verwendet wird, um relevante Metriken und Echtzeitantworten zur Verbesserung der Benutzererfahrung zu erstellen.



Abbildung 14. Im Stundenmodus verwendet das Uber-Dashboard AresDB, um Echtzeitdatenanalysen fĂŒr bestimmte ZeitrĂ€ume anzuzeigen.


, , :


( )



( )



AresDB


, , AresDB :



, , , , , .


AresDB , Apache Kafka , , Apache Flink Apache Spark .


AresDB


, « » « ». , -. 24 AQL:



:
, , .



, AresDB , , . AresDB , , .



AresDB Uber , . , , AresDB .


:


  • : AresDB, , , .
  • : AresDB 2018 , , AresDB .
  • : , , , .
  • : , (LLVM) GPU.

AresDB Apache. AresDB .


, .


Danksagung


(Kate Zhang), (Jennifer Anderson), (Nikhil Joshi), (Abhi Khune), (Shengyue Ji), (Chinmay Soman), (Xiang Fu), (David Chen) (Li Ning) , !

Source: https://habr.com/ru/post/de440072/


All Articles