Zum Hauptinhalt Zur Navigation

Presto: Wie Facebook 300 Petabyte in Echtzeit analysiert

Facebook hat Presto als Open Source veröffentlicht, eine interaktive SQL-Engine für Hadoop, mit der sich große Datenmengen in kurzer Zeit analysieren lassen. Presto soll dabei zehnmal schneller sein als das Gespann aus Hive und Mapreduce.
/ Jens Ihlenfeld
44 Kommentare News folgen (öffnet im neuen Fenster)
Nicht nur für Hadoop (Bild: Presto)
Nicht nur für Hadoop Bild: Presto

Facebook speichert nach eigenen Angaben mehr als 300 Petabyte an Daten und nutzt diese für verschiedene Applikationen. Dabei greift Facebook auf unterschiedliche Ansätze zur Datenanalyse zurück, von der Batch-Verarbeitung, um Verknüpfungen zwischen Nutzern zu modellieren, bis zu maschinellem Lernen und interaktiven Analysen, die in Echtzeit ablaufen. Gerade Letzteres ist bei Daten in der Größenordnung von Facebook eine enorme Herausforderung, denn je schneller die Systeme auf die Abfragen der Analysten antworten, desto besser lassen sich die Daten auch untersuchen.

Dazu hat Facebook ein Data-Warehouse aufgebaut, dessen Daten in einigen wenigen großen Hadoop-Clustern gespeichert sind und gewöhnlich mittels Mapreduce und Hive analysiert werden. Doch bei Datenmengen in Petabyte kommt dieser Ansatz an seine Grenzen, weshalb Facebook ein interaktives Analysesystem entwickelt hat(öffnet im neuen Fenster) , das für kurze Antwortzeiten optimiert ist: Presto(öffnet im neuen Fenster) .

Verteilte SQL-Query-Engine für Ad-hoc-Analysen

Bei Presto handelt es sich um eine verteilte SQL-Query-Engine, die für Ad-hoc-Analysen mit hoher Geschwindigkeit optimiert ist. Presto unterstützt Ansi SQL einschließlich komplexer Abfragen, Aggregationen, Joins und Fensterfunktionen. Dabei sendet der Client eine SQL-Abfrage an den Presto-Koordinator, der die Anfrage parst und analysiert und die Ausführung plant. Anschließend stellt ein Scheduler eine Ausführungspipeline zusammen, verteilt Aufgaben an die Nodes, die möglichst nah an den Daten liegen, und überwacht den Fortschritt. Der Client erhält dann Daten aus der Output-Stage, die wiederum von darunterliegenden Stages gefüllt wird.

Das Ausführungsmodell von Presto unterscheidet sich fundamental von Hive und Mapreduce: Hive übersetzt Abfragen in mehrere Stufen von Mapreduce-Tasks, die dann nacheinander ausgeführt werden. Dabei liest jede Task Daten von den Platten und schreibt Zwischenergebnisse zurück. Presto hingehen nutzt kein Mapreduce, sondern eine eigene Abfrage- und Ausführungsengine, die der SQL-Semantik folgt.

Um das Scheduling zu verbessern, werden alle Berechnungen im Speicher abgewickelt und zwischen verschiedenen Stages durchgereicht, um unnötiges I/O und die damit verbundenen Latenzen zu vermeiden. Dabei werden mehrere Stages parallel ausgeführt und Daten von einer Stage in die andere gestreamt, sobald sie zur Verfügung stehen. Das vermeidet Verzögerungen und sorgt für schnellere Antwortzeiten.

Umgesetzt wurde Presto in Java. Die Software kompiliert Teile des Query-Plans dynamisch in Byte-Code, aus dem die JavaVM optimierten nativen Maschinencode erzeugt.

Nicht nur für Hadoop

Presto ist erweiterbar, denn bei Facebook liegen nicht alle Daten in Hadoop. So werden auch HBase und einige proprietäre Systeme verwendet, beispielsweise für das Backend des Facebook News Feeds. Daher wurde Presto mit einer einfachen Storage-Abstraktion ausgestattet, so dass sich die SQL-Querys leicht mit unterschiedlichen Datenquellen abwickeln lassen. Dabei kommen Connectors genannte Storage-Plugins zum Einsatz, die nur eine Schnittstelle zum Lesen der Metadaten, den Speicherort der Daten und den Zugriff auf die Daten selbst bereitstellen müssen.

Derzeit stehen Connectors für HBase, Scribe und einige andere Facebook-eigene Systeme zur Verfügung.

Die Entwicklung von Presto begann im Herbst 2012, das erste Produktionssystem mit der Software lief Anfang 2013. Im Frühjahr wurde Presto unternehmensweit ausgerollt und hat sich laut Facebook zu einem der wichtigsten interaktiven Systeme für das eigene Data-Warehouse entwickelt. Es kommt in verschiedenen Regionen zum Einsatz, läuft mit 1.000 Nodes in einem Cluster und wird von mehr als 1.000 Mitarbeitern genutzt, die täglich mehr als 30.000 Querys damit abwickeln und dabei mehr als 1 Petabyte an Daten verarbeiten.

In Sachen CPU-Effizienz und Latenz ist Presto laut Facebook zehnmal so schnell wie das Gespann aus Hive und Mapreduce. Es unterstützt eine große Menge von Ansi SQL, einschließlich Joins, left/right Outer Joins, Subqueries und häufig genutzter Aggregator-Funktionen wie Distinct Count und Approximate Percentiles. Die größten Einschränkungen bestehen derzeit bei den Größenlimits der Join-Tabellen und der Kardinalität der Unique Keys sowie Gruppen. Zudem kann das System noch keine Daten in die Tabellen zurückschreiben.

Facebook arbeitet aber sowohl an neuen Funktionen als auch an Geschwindigkeitssteigerungen für Presto. So sollen die Limits für Joins und Aggregationen in den kommenden Monaten beseitigt und die Möglichkeit, Ergebnisse in die Tabellen zu schreiben, geschaffen werden. Zudem arbeiten die Facebook-Entwickler an einem Query-Beschleuniger: einem neuen Datenformat, das für die Query-Verarbeitung optimiert ist und unnötige Umwandlungen umgehen soll. Das soll es dann ermöglichen, Untermengen von Daten zu cachen und diese zur Beschleunigung zu nutzen. Auch an einem schnelleren HBase-Connector wird gearbeitet.

Presto ist ab sofort Open Source

Facebook hat Presto erstmals im Juni 2013 auf der Konferenz Analytics @ Webscale vorgestellt(öffnet im neuen Fenster) . Da sich viele andere Unternehmen für Presto interessierten, hat Facebook in den vergangenen Monaten begonnen, den Presto-Code und fertige Binarys an eine kleine Zahl an Unternehmen zu verteilen, die Presto auf eigenen Servern getestet haben.

Ab sofort steht Presto als Open Source unter prestodb.io(öffnet im neuen Fenster) allen zur Verfügung. Der Quellcode ist unter github.com/facebook/presto(öffnet im neuen Fenster) zu finden.


Relevante Themen