FernUniversität in Hagen Seminar 1912 im Sommersemester 2005: Neue Techniken der Anfragebearbeitung: ” Datenströme, kontinuierliche Anfragen und adaptive Auswertung“ Thema 7 STREAM: The Stanford Stream Data Manager Referent: Udo Werner Seite 1 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Inhaltsverzeichnis 1 Einleitung 1.1 Beispielszenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 Einführung in STREAM 2.1 Überblick Begriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 STREAM Überblick: Anforderungen an DSMS . . . . . . . . . . . . . . . . . 4 4 5 3 DSMS-Anfragesprache: CQL 3.1 Sprachkonzepte von CQL . . . . . . . 3.1.1 Strom-zu-Relation-Operatoren 3.1.2 Relation-zu-Strom-Operatoren 3.1.3 Beispiel-Anfragen . . . . . . . 3.2 Vereinfachungen und Standardwerte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 8 9 9 4 DSMS-Konzepte in STREAM 4.1 Anfrageplanung und -ausführung . . . 4.1.1 Komponenten der Anfragepläne 4.1.2 Scheduling . . . . . . . . . . . . 4.2 Ressourcen-Verwaltung . . . . . . . . . 4.2.1 Anfrageoptimierung . . . . . . . 4.2.2 Redundanz-Minimierung . . . . 4.2.3 Nutzung von Einschränkungen . 4.3 Näherungsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 10 11 14 15 15 16 17 5 Zusammenfassung und Ausblick 18 6 Abkürzungen 19 Abbildungsverzeichnis 1 2 3 4 5 6 Beispielszenario: Überwachung von Bank-Transaktionen . . . . . . Beispielszenario: identifizierte Datenströme . . . . . . . . . . . . . Beziehungen von Datentypen und Operatoren [ABW03, ABB+04] STREAM: Systemaufbau im Überblick [ABB+03] . . . . . . . . . Beispiel: Anfrageplan in STREAM . . . . . . . . . . . . . . . . . Beispiel: optmierter Anfrageplan in STREAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 5 12 16 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager 1 Seite 2 Einleitung In immer mehr Anwendungsbereichen spielen nicht mehr nur persistente Daten eine Rolle, sondern in zunehmendem Maße auch Datenströme und deren vielseitige Analyse. Beispiele dafür sind die Überwachung und das Management von Netzwerkverkehr, Börsenticker oder Sensornetze. Datenbank-Management-Systeme (DBMS) bieten trotz einiger Gemeinsamkeiten von üblichen relationalen Daten mit Datenströmen nicht die für die Verarbeitung von Datenströmen erforderlichen Funktionalitäten, da Datenströme eine Reihe von spezifischen Eigenschaften besitzen, die sie von den traditionell persistent gehaltenen relationalen Daten unterscheiden. So ist man bei DBMS-Systemen in den meisten Fällen eher an Anfragen interessiert, die den (endlichen) Zustand der gespeicherten Datensätze zu einem bestimmten Zeitpunkt wiederspiegeln, während bei Datenströmen eher kontinuierliche Anfragen über die Werte und ihre Veränderungen im Laufe der Zeit von Interesse sind. [ABB+04] Mit dem Stanford Stream Data Manager (STREAM) wird in dieser Ausarbeitung ein Vertreter einer neuen Klasse von Daten Management Systemen, den Datenstrom-ManagementSystemen (DSMS), vorgestellt. STREAM verfolgt das Ziel, möglichst universell verwendbar und gleichzeitig ohne großen Einarbeitungsaufwand bedienbar zu sein. Erreicht werden soll dies, indem sowohl für DBMS als auch für DSMS benötigte Funktionen nicht völlig neu entworfen werden. Stattdessen werden bereits existierende Konzepte einschließlich der Anfragesprache SQL um die für DSMS zusätzlich notwendigen Aspekte erweitert. Im Rahmen dieser Ausarbeitung wird nach einem kurzen Vergleich der Eigenschaften von Datenströmen und persistenten relationalen Daten gezeigt, wie STREAM konkret versucht, die daraus resultierenden besonderen Anforderungen für DSMS umzusetzen um beide Welten zu verbinden. Dabei wird speziell auf CQL, die im Zusammenhang mit STREAM als Erweiterung von SQL entwickelte Anfragesprache, und die weiteren für die Zielstellung von STREAM besonders wichtigen Konzepte eingegangen. Zu diesen Konzepten zählen die Erstellung von Anfrageplänen und deren Optimierung, sowie die Anpassung der Anfrageverarbeitung an veränderte Rahmenbedingungen zur Laufzeit. Abschließend werden der aktuelle Stand der Entwicklung sowie die zukünftig geplanten Erweiterungen und Verbesserungen beschrieben. 1.1 Beispielszenario Zur Verdeutlichung wird in den einzelnen Kapiteln jeweils auf ein beispielhaftes Anwendungsszenario Bezug genommen, welches in Abbildung 1 dargestellt ist: Entsprechend bestimmter Richtlinien ist eine Bank verpflichtet, die Transaktionen in Zusammenhang mit den Konten Ihrer Kunden überwachen zu können und speziell bestimmten Einrichtungen wie einem Geldwäschebeauftragten oder den Finanzämtern Zugriffsmöglichkeiten zur Verfügung zu stellen. Für das Beispiel wird angenommen, daß es bei einer Bank einen Zentralrechner gibt, der u.a. alle Überweisungen von Kunden der Bank bzw. an Kunden der Bank verarbeitet. Weiterhin gibt es Listen von Personen und Konten, die zu überwachen sind. Abbildung 2 zeigt nun, welche Datenströme es in diesem Szenario geben könnte: Da nie alle Kunden zum gleichen Zeitpunkt Überweisungen vornehmen werden, handelt es sich bei den Überweisungen jeweils um Datenströme. Auch bei der Überwachungsliste kann angenommen werden, daß sich der Inhalt dieser Liste ständig ändert, so daß diese Änderungen einen Datenstrom darstellen, der beim Zentralrechner eintrifft. Da Ermittlungsergebnisse sofort vorliegen sollen oder z.B. das Auftauchen von besonders großen Überweisungen sofort gemeldet werden soll, handelt es sich dabei auch um kontinuierliche Anfragen, die als Ergebniss einen Datenstrom von Werten liefern. Seite 3 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Abbildung 1: Beispielszenario: Überwachung von Bank-Transaktionen Abbildung 2: Beispielszenario: identifizierte Datenströme Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager 2 Seite 4 Einführung in STREAM Ziel dieses Kapitels ist es, STREAM als DSMS in groben Zügen vorzustellen. Dazu muß zunächst geklärt werden, wie bestimmte Begriffe im Kontext von STREAM definiert sind und was die bei der Entwicklung von STREAM relevanten Aspekte von DSMS sind. Daraus abgeleitet wird der Aufbau von STREAM in seiner Umgebung beschrieben. 2.1 Überblick Begriffe Abbildung 3: Beziehungen von Datentypen und Operatoren [ABW03, ABB+04] Wie in Abbildung 3 zu sehen ist, gibt es in STREAM zwei Arten von Daten, nämlich Datenströme und Relationen. Auf diese Datentypen können drei unterschiedliche Arten von Operatoren angewendet werden. Dies sind entweder Relation-zu-Relation-Operatoren, Strom-zu-Relation-Operatoren oder Relation-zu-Strom-Operatoren. Es gibt keine Strom-zuStrom-Operatoren. Die entsprechende Funktionalität lässt sich aber über den Umweg“ von ” Strom-zu-Relation nach Relation-zu-Strom realisieren. [ABB+04] Datenstrom: Ein Datenstrom ist eine kontinuierliche, unbegrenzte Sequenz von Wertepaaren. Diese Wertepaare bestehen jeweils aus Datentupeln und einem Zeitstempel, der die logische Ankunftszeit des Datentupels innerhalb des Datenstroms kennzeichnet. Die Reihenfolge, in der die Wertepaare tatsächlich eintreffen, ist nicht (immer) vorhersagbar. Relation: Eine Relation ist eine in Abhängigkeit der Zeit veränderliche Menge von Tupeln. Eine entsprechende Menge von Tupeln zu einem bestimmten Zeitpunkt wird unmittelbare Relation genannt. Relation-zu-Relation-Operator: Ein Relation-zu-Relation-Operator nimmt eine oder mehrere Relationen als Eingangsparameter an und gibt eine Relation als Ausgangsparameter aus. Diese Klasse von Operatoren entspricht den Operatoren von DBMS. Strom-zu-Relation-Operator Ein Strom-zu-Relation-Operator nimmt einen oder mehrere Datenströme als Eingangsparameter an und gibt eine Relation als Ausgangsparameter aus. Relation-zu-Strom-Operator: Ein Relation-zu-Strom-Operator nimmt einen oder mehrere Relationen als Eingangsparameter an und gibt einen Strom als Ausgangsparameter aus. Seite 5 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Kontinuierliche Anfrage: Eine kontinuierliche Anfrage ist ein Baum von Operatoren, wobei die Eingänge der Blätter die Eingangswerte der Anfrage darstellen und die Ausgabe der Wurzel die Ergebniswerte. Als Eingänge können sowohl Ströme als auch Relationen verwendet werden. Die Art des Ergebnisses wird vom Typ des Wurzeloperators bestimmt. 2.2 STREAM Überblick: Anforderungen an DSMS Abbildung 4: STREAM: Systemaufbau im Überblick [ABB+03] In Abbildung 4 ist das DSMS und seine Umgebung entsprechend dem Kontext von STREAM zu sehen. Aus diesem Systemaufbau, bei dem das DSMS als Blackbox dargestellt wird, lassen sich einige Anforderungen an die erforderliche Funktionalität und den inneren Aufbau der Box identifizieren. Auf den ersten Blick ist erkennbar, daß es ein DSMS ermöglichen soll, kontinuierliche Anfragen über Datenströme zu erstellen. Aus dem zuvor beschriebenen Wesen von Datenströmen und dem Aufbau der Anfragen für STREAM lassen sich bestimmte Eigenschaften ableiten, über die ein entsprechendes DSMS verfügen muß. Zunächst muß es in der Lage sein, mehrere potentiell unbegrenzte und sich über die Zeit verändernde Datenströme zu verarbeiten, ebenso aber auch gespeicherte Relationen. Es muß seinen Benutzern Möglichkeiten anbieten, Anfragen zu definieren, die wie bei DBMS bestimmte Teilmengen der Eingangswerte als Ergebnis liefern, dies aber sowohl für Relationen, als auch für Datenströme und bestimmte Verknüpfungen zwischen beiden Arten. Die Ergebnismenge muß aufgrund der geforderten Kontinuität permanent aktualisiert werden. Beispiel: Kommt eine Überweisung beim Zentralrechner an, deren Betrag über einem bestimmten registrierten Grenzwert liegt, muß die Warnungsliste“, die das Ergebnis einer Anfrage des ” Geldwäschebeauftragten ist, sofort aktualisiert werden. Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Seite 6 Aus der Langlebigkeit der Anfragen auf der einen Seite und der potentiell unbegrenzten Menge an einströmenden Daten auf der anderen Seite ergeben sich je nach Art der Ergebnisbildung eine Reihe von Problemen, die es bei DBMS in der Form nicht gibt [GTO03]: • Die Semantik und das Datenmodell der Operatoren sollten sowohl zeit- als auch reihenfolgeabhängige Anfragedefinitionen ermöglichen. • Während DBMS immer auf einem vollständigen, persistent gespeicherten Datenbestand operieren können, ist ein Speichern von Strömen auf Grund ihrer potentiellen Unendlichkeit nicht möglich. Ein DSMS muß also über Funktionalitäten verfügen, die das System in die Lage versetzen, auch nach dem Verwerfen eines Teils der Wertepaare wenigstens annhäherungsweise bestimmte Aussagen zur Gesamtheit aller Wertepaare treffen zu können. Dabei muß der Benutzer in Kauf nehmen, daß er nicht immer exakte Ergebnisse erhält. • Kontinuierliche Anfragen auf Ströme dürfen nur nicht-blockierend sein, da der Strom als unendlich betrachtet werden soll und die Anfrage deshalb auch unendlich lange aktiv ist. Würde sie blockieren, wäre das auch für einen unendlich langen Zeitraum möglich. • Wenn Anfragen permanent Ergebnisse liefern sollen, ist es in vielen Fällen aus Gründen der Reaktionszeit unmöglich, den kompletten vergangenen Strom bzw. größere Teile davon rückwirkend zu betrachten. Operatoren für solche Online-Anfragen müssen also eine Einweg-Verarbeitung von Wertepaaren vornehmen können. • Bei langer Laufzeit von Anfragen können sich die für die Ausführung relevanten Umgebungsbedingungen wie Durchsatz des Stroms, verfügbarer Arbeitsspeicher usw. grundlegend ändern. Die Ausführungsplanung des DSMS muß also in der Lage sein, dynamisch auf sich ändernde Rahmenbedingungen zu reagieren und Anpassungen vorzunehmen. 3 DSMS-Anfragesprache: CQL Bevor man die von STREAM umzusetzenden Konzepte und den inneren Aufbau genau betrachtet, sollte man die Art und Weise der Anfragedefinition kennen, denn dadurch wird festgelegt, welche Funktionalitäten zur Verarbeitung und Ausgabe umgesetzt werden müssen. Für STREAM ist die Anfragesprache Continuous Query Language (CQL) definiert worden, die nachfolgend näher betrachtet wird. 3.1 Sprachkonzepte von CQL Ein zentraler Aspekt beim Entwurf von STREAM sollte die Einfachheit der Anfragedefinition sein: Der Benutzer soll in die Lage versetzt werden, möglichst intuitiv und mit möglichst wenig zusätzlichem Lernaufwand Anfragen über Datenströme und etwaige gespeicherte Relationen erstellen zu können. Deshalb war es naheliegend, die im Bereich der DBMS etablierte Anfragesprache Structured Query Language (SQL) als Vorlage zu verwenden, da diese bereits die für die Verarbeitung von Relationen notwendigen Funktionen anbietet. Auf diese Art und Weise ist die in Kapitel 2.1 beschriebene Klasse der Relation-zu-Relation-Operatoren implementiert. Um zusätzlich dem Wesen von kontinuierlichen Anfragen auf Datenströme Seite 7 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager zu genügen, wurde SQL um Konstrukte für die Strom-zu-Relation- und Relation-zu-StromOperatoren erweitert. Das Ergebnis dieser Erweiterungen, die jetzt beschrieben werden, ist die Anfragesprache CQL. 3.1.1 Strom-zu-Relation-Operatoren In CQL arbeiten sämtliche Strom-zu-Relation-Operatoren nach dem Konzept der gleitenden Fenster (sliding windows). Konkret bedeutet dies, daß ein Fenster jeweils eine bestimmte begrenzte Menge von Wertepaaren enthält, die in der Vergangenheit im Strom aufgetreten sind. Es gibt derzeit drei verschiedene Typen von Fenstern: Zeitbasierte Fenster Zeitbasierte Fenster auf einen Datenstrom werden über einen Parameter T definiert, der festlegt, aus welchem vergangenen Zeitintervall Wertepaare verwendet werden. Relevant ist jedoch nicht die Echtzeit, sondern der Zeitstempel der Wertepaare, da von einem nach Zeitstempeln sortierten Strom ausgegangen wird. Daraus folgt, daß das Intervall vom aktuell gültigen Zeitstempel S bis zum Zeitstempel S’:=S-T reicht. Neben üblichen Zeiteinheiten wie Sekunden, Minuten oder Tagen, können für den Parameter T auch zwei Sonderfälle definiert werden: Now und Unbounded. Now legt dabei fest, daß nur diejenigen Wertepaare verwendet werden, die den aktuell gültigen Zeitstempel besitzen, während Unbounded festlegt, daß jedes bisher eingetroffene Wertepaar zum Fenster gehört. Folgende Beispiele zeigen mögliche Definitionen solcher Fenster: • eingehendeUeberweisungen [Range 10 Minutes] definiert ein Fenster, in dem alle Elemente des Datenstromes eingehendeUeberweisungen enthalten sind, die in den vergangenen 10 Minuten beim Zentralrechner registriert wurden. • ausgehenedeUeberweisungen [Range Now] definiert ein Fenster, in dem nur die Elemente des Datenstromes ausgehendeUeberweisungen enthalten sind, die mit dem gerade gültigen Zeitstempel beim Zentralrechner angekommen sind. • Ueberwachungsliste [Range Unbounded] definiert ein Fenster, in dem alle Elemente aufgeführt sind, die im Datenstrom Ueberwachungsliste vorgekommen sind, d.h. es handelt sich hier um die vollständige Überwachungsliste. Anzahlbasierte Fenster Anzahlbasierte Fenster auf einen Datenstrom werden über einen Parameter N definiert, der festlegt, wieviele der in der Vergangenheit auf dem Datenstrom aufgetretenen Wertepaare zum Fenster gehören. Bei N handelt es sich um einen ganzzahligen, positiven Wert. Das Fenster enthält dann genau die N Wertepaare, die den jeweils höchsten Zeitstempel aufweisen bzw. alle Wertepaare, solange noch keine N Wertepaare im Datenstrom aufgetreten sind. Haben mehrere Wertepaare den gleichen Zeitstempel, wird das Fenster trotzdem auf N Elemente beschränkt und etwaige überzählige Elemente werden abgeschnitten. Da es keine Regel gibt, nach welchem Schema bei Überschreitung von N Wertepaare mit gleichem Zeitstempel ausgewählt werden, sind anzahlbasierte Fenster indeterministisch, da man selbst bei gleichartigen Mustern von Wertepaaren zu bestimmten Zeitpunkten unterschiedliche Inhalte erhalten kann. Auch bei anzahlbasierten Fenstern gibt es den Sonderfall, bei dem N als Unbounded definiert werden kann. Die Semantik ist dann die gleiche wie für [Range Unbounded] bei zeitbasierten Fenstern. Folgende Beispiele zeigen Definitionen für anzahlbasierte Fenster: • eingehendeUeberweisungen [Rows 1000] definiert ein Fenster, in dem die letzten 1000 Elemente des Datenstromes eingehendeUeberweisungen enthalten sind. Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Seite 8 • Ueberwachungsliste [Rows Unbounded] definiert ein Fenster, zu dem wieder alle Elemente gehören, die je im Datenstrom Ueberwachungsliste aufgetreten sind. Unterteilte Fenster Unterteilte Fenster auf einen Datenstrom werden über einen Parameter N und eine Teilmenge der Attribute des Datenstroms definiert, wobei der Strom anhand der Attributmenge in entsprechende Teilströme unterteilt wird. Jedes der so entstandenen Teilfenster ist dann wie ein anzahlbasiertes Fenster auf N Wertepaare des Datenstroms begrenzt. Die Unterteilung in Teilströme kann man sich analog zur "GROUP BY"-Klausel bei SQL vorstellen: Die Zugehörigkeit zu einem Teilstrom wird durch das Auftreten gleicher Werte bei den angegebenen Attributen festgestellt, wobei die Fenster für jeden Teilstrom zunächst einzeln berechnet werden. Die Ergebnismenge des unterteilten Fensters ist dann die Vereinigung der Menge der Teilfenster. Folgende Beispiele zeigen mögliche Definitionen solcher Fenster: • eingehendeUeberweisungen [Partition By EmpKontoID Rows 5] definiert ein Fenster, das zu jeder EmpKontoID die letzten 5 Elemente enthält, die im Datenstrom eingehendeUeberweisungen aufgetreten sind. • ausgehendeUeberweisungen [Partition By AbsKontoID, EmpKontoID Rows 1] definiert ein Fenster, das zu jeder vorgekommenen Kombination von AbsKontoID und EmpKontoID (also jedem Paar von Absender- und Empfänger-Konto) das zuletzt auf dem Datenstrom ausgehendeUeberweisungen aufgetretene Element enthält. Zusätzlich zur Beschränkung der Größe eines Fensters auf einen Strom sieht CQL auch noch die optionale Möglichkeit vor, Fenster durch zufälliges Abtasten (sampling) zu befüllen anstatt den gesamten Datenstrom zu verwenden. Dazu wird zusätzlich der Operator Sample(N) anfügt. Der ganzzahlige Wert N legt fest, mit welcher Wahrscheinlichkeit ein Wertepaar in das Fenster aufgenommen wird. [Range 1000] Sample(50) definiert beispielsweise ein Fenster mit 1000 Wertepaaren, wobei im Durchschnitt nur jedes zweite Wertepaar, daß im Datenstrom auftritt, auch tatsächlich in das Fenster aufgenommen wird. Der Rest wird verworfen. [MWA+03] 3.1.2 Relation-zu-Strom-Operatoren In CQL werden drei verschiedene Relation-zu-Strom-Operatoren definiert: • Istream: Erzeugt einen input stream, d.h. die Folge aller Wertepaare, die zu einer Relation hinzugefügt werden, wobei der Zeitstempel des Wertepaares innerhalb des Istream dem Zeitpunkt entspricht, an dem das Wertepaar zur Relation zugefügt wurde. • Dstream: Erzeugt einen delete stream, d.h. die Folge aller Wertepaare, die aus einer Relation entfernt werden, wobei der Zeitstempel des Wertepaares innerhalb des Dstream dem Zeitpunkt entspricht, ab dem das Wertepaar nicht mehr zur Relation gehörte. • Rstream: Erzeugt einen relation stream, der zu jedem Zeitpunkt alle in einer Relation befindlichen Wertepaare enthält, d.h. alle Wertepaare, die zu einem bestimmten Zeitpunkt in der Relation vorkommen, treten mit dem entsprechenden Zeitstempel im Rstream auf. Wie man an den Definitionen erkennen kann, lassen sich sowohl Istream als auch Dstream durch Kombinationen von Rstream und zeitbasierten Fenstern sowie relationalen Operatoren ausdrücken. Im Vordergrund steht bei CQL und STREAM aber die Einfachheit der Sprache, weshalb die Funktionen direkt zugänglich gemacht wurden. [ABW03] Seite 9 3.1.3 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Beispiel-Anfragen Select Istream(*) From ausgehendeUeberweisungen [Range Unbounded] Where Betrag>15000 Diese Anfrage besteht aus drei Operatoren: einem zeitbasierten Fenster (Strom-zu-RelationOperator), das alle bis zum jeweils gültigen Zeitstempel in ausgehendeUeberweisungen vorgekommenen Wertepaare liefert, die allerdings durch den zum Relation-zu-Relation-Operator SELECT gehörenden Prädikat Betrag>15000 auf die Überweisungen mit einem Betrag größer 15000 eingeschränkt werden. Das Ergebnis der Anfrage wird über den Relation-zu-StromOperator Istream(*) kontinuierlich ausgegeben, d.h. bei Auftauchen einer Überweisung über diesem Grenzbetrag wird das entsprechende Wertepaar an den Ausgangsstrom geschickt. Das gleiche Verhalten kann aber auch mit folgender Anfrage erreicht werden: Select Rstream(*) From ausgehendeUeberweisungen [Now] Where Betrag>15000 Auch hier sind wieder drei Operatoren enthalten: aus dem Datenstrom der ausgehendenUeberweisungen werden wieder diejenigen ausgewählt, deren Wertepaare beim Attribut Betrag einen Wert über dem Grenzwert 15000 haben. Der Strom-zu-Relation-Operator [Now] beschränkt die Wertepaare allerdings zuvor in Form eines zeitbasierten Fensters auf die Wertepaare mit dem gerade gültigen Zeitstempel. Das Ergebnis wird als Rstream ausgegeben, d.h. es werden alle gerade auftretenden Überweisungen mit Betrag oberhalb des Grenzwertes ausgegeben. 3.2 Vereinfachungen und Standardwerte Wie beim vorhergehenden Beispiel gezeigt wurde, kann man in CQL mit unterschiedlichen Definitionen das gleiche Anfrageergebnis erhalten, indem man bestimmte Operatoren durch Kombinationen von anderen Operatoren ersetzt. Neben den Auswirkungen auf die Optimierung von Anfrageplänen, die dies haben kann und die zu einem späteren Zeitpunkt noch beschrieben werden, ermöglicht diese Eigenschaft von CQL eine möglichst intuitive Anfrageformulierung. CQL bietet darüber hinaus weitere Vereinfachungen durch sog. shortcuts und die Verwendung von Standardwerten, wenn kein Wert angegeben wird. So kann auf die explizite Aufführung von Fensterdefinitionen und Relation-zu-Strom-Operatoren in bestimmten Situationen verzichtet werden. [ABW03] Das zuvor bereits in zwei verschiedenen Varianten beschriebene Anfragebeispiel kann vereinfacht auch wie folgt geschrieben werden: Select * From ausgehendeUeberweisungen Where Betrag>150000 Wird in CQL ein Datenstrom referenziert, wie es im Beispiel bei ausgehendeUeberweisungen der Fall ist, wird standardmäßig ein unbegrenztes Fenster angenommen, weil dies der häufigste Anwendungsfall ist. Da die meisten kontinuierlichen Anfragen, wie auch im Beispiel, einen Datenstrom als Ausgabe erwarten, wird standardmäßig der Istream-Operator angewendet. Auch bei Unter-Anfragen wird für die weitere Verarbeitung in den meisten Fällen ein den üblichen Datenströmen entsprechendes montones Verhalten erwartet und deshalb der Istream-Operator als Standard verwendet. Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager 4 Seite 10 DSMS-Konzepte in STREAM In den vorhergehenden Kapiteln wurden die grundlegenden Begriffe aus der Welt der DatenstromManagement-Systeme aus Sicht des STREAM-Projektes erklärt und die für STREAM geschaffene Anfragesprache CQL vorgestellt. Dieses Kapitel soll nun einen tieferen Einblick in den inneren Aufbau von STREAM und die von STREAM implementierten Konzepte geben. 4.1 Anfrageplanung und -ausführung Wie auch bei Datenbank-Management-Systemen werden Anfragen in STREAM vom Benutzer in einer abstrakten Sprache definiert. Das System muß sich für die Ausführung der Anfrage selbst darum kümmern, einen entsprechenden Anfrageplan zu erstellen. Dieser wird zusammengesetzt aus den internen Operatoren, die die tatsächliche Verarbeitung übernehmen, sowie aus Warteschlangen, die Wertepaare oder Referenzen darauf zwischenspeichern, und Zustandsspeichern (sog. synopses). Am Ende ruft ein Scheduler die einzelnen Operatoren auf und übernimmt damit die Kontrolle über die Ausführung des Planes. [ABW03, ABB+04] 4.1.1 Komponenten der Anfragepläne Operatoren Die im zugrundeliegenden sprachlichen Modell vorgenommene Unterscheidung zwischen Datenströmen und Relationen wird bei der internen Verarbeitung von STREAM so nicht mehr vorgenommen. Stattdessen werden beide Typen als Sequenz von Wertepaaren implementiert, wobei jedes Wertepaar neben einem Zeitstempel auch noch über eine Markierung verfügt die anzeigt, ob das Wertepaar hinzugefügt (+) oder entfernt (-) wurde. Die Tripel (Wertepaar, Zeitstempel, Markierung) werden als Elemente bezeichnet. Bei Datenströmen wird es natürlich ausschließlich Elemente mit +-Markierungen geben, da nur neue Elemente auf den Strom gelangen können, aber deren Auftreten dort nicht rückwirkend rückgängig gemacht werden kann. Bei Relationen dagegen können beide Marker auftreten und so die Veränderungen der Relation über die Zeit dokumentieren. Elemente werden grundsätzlich in Warteschlangen gespeichert. Die Operatoren nehmen eine oder mehrere dieser Warteschlangen als Eingabe, verarbeiten sie und geben die Ergebnisse an eine andere Warteschlange aus. Einige Operatoren speichern relationale Ergebnisse in Zustandsspeichern zwischen, z.B. wenn Joins berechnet werden sollen, oder den Inhalt eines Fensters. In Tabelle 1 sind die derzeit von STREAM für Anfragepläne implementierten Operatoren aufgeführt. Auffällig ist, daß sämtliche Fensterarten durch den gleichen Operator implementiert werden und es somit nur einen einzigen Strom-zu-Relation-Operator gibt. Warteschlangen Warteschlangen enthalten eine bestimmte Sequenz von Elementen, die einen Teil eines Datenstromes oder einer Relation darstellen. Im Rahmen der Anfrageplanung verbindet eine Warteschlange jeweils den Operator, der sie befüllt mit dem Operator, der sie als Eingang benutzt. Die Elemente, die im Laufe der Zeit eine Warteschlange durchlaufen, entsprechen dem Strom bzw. der Relation, die vom Eingangsoperator erzeugt werden. Zustandsspeicher Einige Operatoren benötigen die Möglichkeit, Zwischenergebnisse zu speichern. Dafür gibt es Zustandsspeicher, die jeweils genau einem Operator zugeordnet sind. Zu den Operatoren mit Zustandsspeicher gehören die Join-Operatoren, die beispielsweise alle Elemente der aktuellen Fenster zweier Eingangsdatenströme kennen müssen, um die vereinigte Relation ausgeben zu können. Dagegen brauchen Operatoren wie select keinen Zwischenspeicher, da sie Entscheidungen immer nur bezogen auf das gerade verarbeitete Element treffen. Seite 11 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Name select project Typ des Operators Kurzbeschreibung Relation-zu-Relation Filtern von Elementen Relation-zu-Relation Projektion unter Beibehaltung von Duplikaten binary-join Relation-zu-Relation Join von zwei Eingabe-Relationen mjoin Relation-zu-Relation Mehrweg-Join union Relation-zu-Relation Mengen-Vereinigung except Relation-zu-Relation Mengen-Differenz intersection Relation-zu-Relation Schnittmenge antisemijoin Relation-zu-Relation Komplementärmenge aggregate Relation-zu-Relation Gruppierungen und Aggregationen duplicate-eliminate Relation-zu-Relation Entfernen von Duplikaten seq-window Strom-zu-Relation unterteilte, zeit- und anzahlbasierte Fenster i-stream Relation-zu-Strom Istream-Implementierung d-stream Relation-zu-Strom Dstream-Implementierung r-stream Relation-zu-Strom Rstream-Implementierung Tabelle 1: Operatoren in der Anfrageplanung [ABB+04] Beispiel Die nachfolgende Anfrage soll jeweils den Namen des Absenders und dessen Kontonummer für jede beim Zentralrechner innerhalb der vergangenen 14 Tage eingetroffene ausgehende Überweisung ausgeben, wenn der Betrag der Überweisung den Grenzbetrag von 15000 überschreitet und der Absender unter den letzten 1000 Eintragungen auf der Überwachungsliste vermerkt ist. Select Ueberwachungsliste.Name, ausgehendeUeberweisungen.AbsKontoID From ausgehendeUeberweisungen [Range 14 Days], Ueberwachungsliste [Rows 1000] Where ausgehendeUeberweisungen.Betrag>15000 And ausgehendeUeberweisungen.Absender = Ueberwachungsliste.Name Der Anfrageplan, wie er in STREAM aufgebaut sein könnte, wird in Abbildung 5 dargestellt. Ganz unten sind die beiden Datenströme ausgehendeUeberweisungen und Ueberwachungsliste als Eingänge dargestellt, die die beiden Warteschlangen W1 und W2 befüllen. Diese beiden Warteschlangen werden jeweils von einem "seq-window"-Operator als Eingänge benutzt, die den Zustand ihres Fensters, also die Menge der gerade zum Fenster gehörenden Elemente des Datenstromes am Eingang, in den Zustandsspeichern Z1 und Z2 speichern und jeweils die Warteschlange W3 und W4 befüllen, die die Eingänge des "binary-join"-Operators sind. Dieser speichert den Zustand beider Basisrelationen in den Zustandsspeichern Z3 und Z4 und befüllt seinerseits die Warteschlange W5 mit den Ergebnissen seiner Verarbeitung. W5 wird vom "select"-Operator als Eingang verwendet, der entsprechend den Filterkriterien die Ergebnisse seiner Arbeit in die Warteschlange W6 übergibt, die die Ausgabe der Anfrage darstellt. 4.1.2 Scheduling Wie bereits erwähnt wurde, übernimmt in STREAM ein Scheduler die Ausführung der Anfragepläne, d.h. er entscheidet, welcher Operator zu einem bestimmten Zeitpunkt arbeiten soll und ruft diesen dann auf. Grundsätzlich funktioniert dieser Scheduler also genauso wie Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Seite 12 Abbildung 5: Beispiel: Anfrageplan in STREAM ein Scheduler in Datenbank-Management-Systemen. Da das Ergebnis der Verarbeitung bei einem Operator nicht von einer Echtzeit abhängig ist, sondern nur von den Zeitstempeln der Elemente, wäre es prinzipiell unkritisch, in welcher zeitlichen Reihenfolge Operatoren abgearbeitet werden. Natürlich ist es aus anderen Gesichtspunkten wie Latenzzeiten und Ressourcenverwendung nicht unerheblich, welcher Operator zu einem bestimmten Zeitpunkt arbeitet. Nachfolgend werden deshalb kurz einige Scheduling-Algorithmen für DatenstromManagement-System vorgestellt, die beim STREAM-Projekt berücksichtigt wurden. [MWA+03, ABB+04, BBDM03] Round Robin: Round Robin ist einer der einfachsten Algorithmen. Jeder Operator kommt der Reihe nach einmal zur Ausführung, angefangen bei den Blattoperatoren. Wurde jeder Operator einmal ausgeführt, beginnt die Reihe von vorn. Dieser Algorithmus läßt sich einfach implementieren und nimmt zur Laufzeit keine wesentlichen Ressourcen in Anspruch. Dafür wird er nur in Ausnahmefällen die optimale Ausführungsreihenfolge treffen und ansonsten für die Verarbeitung in der Regel mehr Zeit und mehr Speicher verbrauchen, als andere Algorithmen. Hat ein bestimmter Operator beispielsweise gar keine neuen Elemente in seiner/seinen Eingangswarteschlange/n, so würde er trotzdem aufgerufen werden. Seite 13 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager FIFO: FIFO bedeutet First In First Out. Dieser Algorithmus richtet sich also nach dem Eingang von neuen Elementen. Für diese wird der komplette Teilbaum bis zur Ausgabe abgearbeitet, bevor eventuell zwischenzeitlich eingetroffene weitere Elemente verarbeitet werden können. Auch dieser Algorithmus läßt sich verhältnismäßig einfach implementieren und weist bezogen auf das einzelne Element die kürzeste Verarbeitungszeit innerhalb des Systems auf. Betrachtet man allerdings mehrere Ströme mit regelmäßig eingehenden Elementen, so kann dieser Algorithmus ineffizient sein, weil er keine Rücksicht auf die Leistungsfähigkeit der einzelnen Operatoren nimmt und keine Zusammenhänge zwischen einzelnen Elementen oder verschiedenen Strömen beachtet, die eventuell Optimierungspotentiale bei der Verarbeitung bieten könnten. Greedy: Der Greedy-Algorithmus verdankt seinen Namen dem gleichnamigen Adjektiv, das gefräßig bedeutet. Er arbeitet nach dem Prinzip, stets Operatoren mit höherer Datenreduktionsrate bevorzugt auszuführen. Dazu wird die Selektivität einzelner Operatoren herangezogen. Unter Selektivität versteht man in diesem Zusammenhang ähnlich wie beim Sampling die Quote von Elementen, die nach der Verarbeitung durch den Operator innerhalb einer Zeiteinheit von einer gegebenen Anzahl am Eingang des Operators noch auf dessen Ausgangswarteschlange gelegt werden. Je geringer die Selektivität eines Operators ist, desto weniger Warteschlangenplätze sind nach seiner Ausführung belegt (bezogen auf das gesamte System) und desto höher ist demnach seine Datenreduktionsrate. Der Greedy-Algorithmus sucht deshalb nach Operatoren mit möglichst hoher Datenreduktionsrate und priorisiert die Ausführung entsprechend. Dieser Algorithmus bedarf zusätzlicher Informationen über die Selektivität der Operatoren. Er ist damit deutlich komplexer als Round Robin oder FIFO, sorgt aber in vielen Fällen für eine bessere Leistungsfähigkeit des Systems. Allerdings wird jeder Operator einzeln betrachtet und nicht etwaige Zusammenhänge zwischen Operatoren, etwa den Pfad, den bestimmte Elemente im Ausführungsplan notwendiger Weise gehen müssten, und auch nicht den Zustand einzelner Warteschlangen. Hat man beispielsweise eine Anfrage mit einer Summenbildung über alle Elemente eines Outer-Joins, der sich aus zwei anzahlbasierten Fenstern zusammensetzt, so ergibt sich folgendes Bild: Die Summenbildung hat niedrigste Selektivität (nahe 0), weil sie lediglich einen Wert ausgibt, egal wie viele Werte am Eingang stehen. Der Outer-Join hat sicherlich die höchste Selektivität: Für jedes eingehende Element produziert er genau soviele Ausgangselemente, wie das andere Fenster jeweils Elemente enthält. Die Fenster-Operatoren haben annähernd eine Selektivität von 1, weil sie in der Regel genausoviele Elemente ausgeben wie am Eingang anliegen, es sei denn, es kommen mehr Einträge mit gleichem Zeitstempel an, als in das Fenster hineinpassen. Entsprechend der Selektivität würde der Greedy-Algorithmus für das Scheduling zuerst den Aggregat-Operator ausführen, dann die Fenster-Operatoren und dann den Join-Operator. Tatsächlich ist der Aggregat-Operator jedoch darauf angewiesen, daß der Join-Operator seine Eingangswarteschlange befüllt hat, damit er überhaupt etwas verarbeiten kann. Es kann also passieren, daß sich FIFO in bestimmten Situationen als effizienter erweist, weil sich logisch geordnete Gruppen von Operatoren nicht gegenseitig blockieren. Im genannten Beispielablauf sind Elemente, die am Eingang des Blocks ankommen, innerhalb von 4 Zeiteinheiten (jeweils eine pro Fenster, eine für den Join und eine für die Aggregation) aus dem System verschwunden, d.h. der Block hat eine durchschnittliche Datenreduktion von 0.25. Im anderen Fall würde der Aggregat-Operator u.U. umsonst gestartet, wenn gar keine Elemente zur Verarbeitung vorliegen. Dadurch braucht es in diesen Fällen 5 Zeiteinheiten Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Seite 14 zur Verarbeitung, bis die Elemente in keiner Warteschlange mehr vorhanden sind. Je nach Kontinuität des eingehenden Stromes wird sich für die Datenreduktionsrate ein Wert zwischen 0.2 und 0.25 ergeben. Kämen regelmäßig zu jeder Zeiteinheit neue Elemente, würde nur zum initialen Start der Aggregat-Operator einmal umsonst aufgerufen und sonst wie bei FIFO immer etwas zu verarbeiten haben. Weist ein Datenstrom aber eher ein burstartiges Verhalten auf, d.h. kommen Elemente eher stoßweise auf einmal als gleichmäßig verteilt, könnten die Lücken zwischen den Bursts dazu führen, daß dies öfter vorkommt, während FIFO grundsätzlich eingangsgesteuert arbeitet. Chain: Der Chain-Algorithmus versucht den Nachteil von Greedy zu umgehen, indem zusammengehörige Operatoren-Gruppen zu sog. Blocks zusammengefaßt werden. Grundsätzlich wird dann wie bei FIFO immer der erste Operator im Plan ausgewählt. Anschließend wird analog zu Greedy der Block mit der höchsten Datenreduktionsrate gesucht, der sich an diesen Operator anschließt. Entsprechend diesem Muster werden alle Blöcke in die Ausführungsreihenfolge gebracht. Dieser Algorithmus versucht die Vorteile von FIFO und Greedy zu vereinen und die jeweiligen Nachteile zu minimieren. Entsprechend erhöht sich aber auch die Komplexität der Ausführung, denn es müssen sowohl die Zusammensetzung einzelner Blöcke bekannt sein, als auch ihre Selektivität. Beides kann sich jedoch zur Laufzeit auf Grund veränderter Anfragen oder Unregelmäßigkeiten bei den Datenströmen ändern. Geht man im Beispielszenario davon aus, daß bestimmte Großkunden ihre Überweisungen auch immer gesammelt an die Bank übergeben, so wird man z.B. einem Join-Operator, der diese Überweisungen mit der Überwachungsliste verknüpft, eine schwankende Selektivität haben: Ist der gerade Überweisungen übertragende Großkunde auf der Überwachungsliste, steigt die Selektivität sprunghaft an, ist er es nicht, sinkt sie ab. Würde man stets den Mittelwert annehmen, würde man weder derartige Bursts optimal verarbeiten, noch die anderen Teile des Stroms außerhalb solcher Bursts. Es wäre also vorteilhaft, wenn statistische Erhebungen permanent durchgeführt werden würden und entsprechend zu dynamischen Anpassungen beim Scheduling führen würden. Im Abschnitt 4.2.1 wird beschrieben, wie STREAM versucht diese Anforderung umzusetzen. 4.2 Ressourcen-Verwaltung Elemente von Datenströmen sind zunächst immer nur auf flüchtigen Speichern wie Kommunikationskanälen vorhanden. Zur Verarbeitung in einem DSMS werden sie in Warteschlangen und Zustandsspeichern festgehalten. Im Gegensatz zu den klassischen, persistent gespeicherten Relationen in DBMS wird bei STREAM derzeit aber noch nicht mit Sekundärspeicher gearbeitet. Das bedeutet, daß die zur Verfügung stehenden Speicherressourcen sehr begrenzt sind und diese je nach den Volumina, die auf den verschiedenen eingehenden Datenströmen transportiert werden, auch schnell erschöpft sein können, wenn komplexe und umfangreiche Anfragen, z.B. mit großen Joins, berechnet werden. Außerdem wächst auch der Anspruch an die Rechenleistung für die Verarbeitung der Elemente in den einzelnen Operatoren mit zunehmender Frequenz der Eingänge von Elementen auf den Datenströmen. Viele Anwendungen haben jedoch den Anspruch, Auswertungsergebnisse in Echtzeit zur Verfügung zu haben, was auch einer der Gründe war, bisher auf Einbindung von Sekundärspeicher zu verzichten. STREAM legt deshalb spezielles Augenmerk auf die Verwaltung der Systemressourcen, die noch mehr als bei DBMS von Bedeutung ist. Seite 15 4.2.1 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Anfrageoptimierung Da CQL eine Erweiterung von SQL darstellt, können viele Mechanismen der Optimierung von rein relationalen Anfragen mit keinem oder verhältnismäßig geringem Anpassungsaufwand übernommen werden. Durch die Möglichkeit, gleiches Verhalten unterschiedlich zu beschreiben, ergeben sich durch äquivalente Umformungen oft Möglichkeiten, die Anfrage aus Sicht des Systems optimiert umzuformulieren. So können beispielsweise Heuristiken wie Selections below Joins“ verwendet werden, um schon vor dem tatsächlichen Scheduling ” Optimierungen bezüglich des zu erwartenden Aufwands für die Verarbeitung einer Anfrage vorzunehmen. Ausserdem ist es häufig möglich, Zustandsspeicher innerhalb eines Anfrageplans nicht immer exklusiv von einem Operator nutzen zu lassen, sondern bei entsprechender Eignung mehrere Operatoren gemeinsam darauf zugreifen zu lassen. [ABW03] Da sich der Zustand des Systems insgesamt ständig ändern kann, wenn beispielsweise neue Anfragen gestellt werden oder bereits bestehende gelöscht oder verändert werden, gibt es in STREAM neben dem Optimierer, der die Pläne entsprechend der verschiedenen Regeln untersucht und umschreibt, auch Monitore, die Veränderungen am System und der Systemumgebung feststellen. Überwacht werden speziell Speicherbedarf und -verfügbarkeit für einzelne Anfragen, Durchsatz von Datenströmen sowie statistische Eigenschaften von Datenströmen, die zum Beispiel für die Bestimmung der Selektivität von Operatoren und damit für das Scheduling ausschlaggebend sind. Die Infrastruktur dazu nennt sich StreaMon. Sie verfügt über drei unterschiedliche Komponenten [ABB+04]: • einen Executor, der Anfragepläne entgegennimmt, diese ausführt und die Ergebnisse zurückliefert • einen Profiler, der Eigenschaften von Datenströmen und Anfrageplänen ermittelt • einen Reoptimizer, der Anfragepläne und Speicherverwaltung optimiert 4.2.2 Redundanz-Minimierung Wie schon im Zusammenhang mit der Anfrageoptimierung angedeutet, gibt es verschiedene Punkte, an denen Redundanzen im Anfrageplan auftreten können. Dies kann bereits innerhalb einer einzelnen Anfrage der Fall sein. Aber speziell bei der Betrachtung aller Anfragen, die gerade an das System gestellt werden, können weitere Redundanzen auftreten, beispielsweise wenn in zwei Anfragen das gleiche Fenster auf einen Datenstrom definiert ist. Im Beispiel aus Abbildung 5 könnte der binary-join Operator beispielsweise die Zustandsspeicher Z1 und Z2 mit nutzen, weil diese den gleichen Inhalt wie die ihm direkt zugeordneten Zustandsspeicher Z3 und Z4 haben. Da Operatoren aber nicht zum gleichen Zeitpunkt auf den Zustandsspeicher zugreifen, kann es passieren, daß es Elemente gibt, die von einem Operator schon verarbeitet wurden, vom anderen aber noch nicht. STREAM löst dieses Problem, indem der eigentliche Speicherort der Elemente eines Zustandsspeichers von dessen Zugriffseinheit getrennt wird. Der Zustandsspeicher selbst wird als sog. stub implementiert, der mit einem store (Speicher) verknüpft ist, der die Elemente tatsächlich enthält. Der Speicher hält dabei die Informationen über den Zustand der einzelnen Stubs und liefert ihnen zu jedem Zeitpunkt einen korrekten View auf die Menge der Elemente. Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Seite 16 Beispiel Zum Anfrageplan vom Beispiel aus Abschnitt 4.1.1, das in Abbildung 5 dargestellt ist, wird nun folgende Anfrage hinzugefügt: Select AbsKontoID, SUM(Betrag) From ausgehendeUeberweisungen [Range 14 Days] Sie soll zu jedem Konto die Summe der Beträge der Überweisungen der letzten 14 Tage ermitteln. Da das Fenster auf den Datenstrom ausgehendeUeberweisungen das gleiche ist, wie bei der ersten Anfrage, könnte hier der Speicher gemeinsam genutzt werden. Abbildung 6 zeigt, wie der Anfrageplan mit der Nutzung von Stubs und gemeinsam genutztem Speicher aussieht. Man kann leicht erkennen, daß Speicher 1 von drei Operatoren über deren Stubs genutzt wird. Abbildung 6: Beispiel: optmierter Anfrageplan in STREAM 4.2.3 Nutzung von Einschränkungen Viele Datenströme unterliegen Einschränkungen (constraints) bezüglich des Auftretens von bestimmten Elementen. So gibt es Anwendungsgebiete, in denen Elemente immer in bestimmten Abhängigkeiten von einander oder in periodisch wiederkehrenden Mustern auftreten. Wenn solche Einschränkungen bekannt sind, könnte man bei verschiedenen Anfragen unter Umständen auf bestimmte Informationen in den Zustandsspeichern verzichten und so Speicherplatz und Rechenzeit sparen. STREAM bietet Möglichkeiten, Constraints entweder gleich mit der Anbindung eines Datenstroms zu definieren oder auf Basis statistischer Methoden zur Laufzeit ermitteln zu lassen. Seite 17 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Beispiel Die Kommunikation mit anderen Banken erfolgt in vielen Fällen über sog. Batchläufe, d.h. Überweisungen werden zunächst auf einem eigenen Server zwischengelagert und dann zu bestimmten Zeiten alle auf einmal an einen Server einer anderen Bank übermittelt, wobei stets nur eine Bank zur selben Zeit angebunden wird. Für das Beispiel wird angenommen, daß jede Bank nur einen Batchlauf pro Tag ausführt, dessen Datenübertragung bis zu 5 Minuten dauert. Folgende Anfrage summiert die Beträge aller eingehendenUeberweisungen pro Absenderkonto im Zeitraum der vergangenen 5 Minuten und gibt Kontonummer und Summe der Beträge aus, wenn der Grenzwert von 15000 überschritten wird. Select AbsKontoID, Sum(Betrag) From eingehendeUeberweisungen [Range 5 Minutes] Group By AbsKontoID Having Sum(Betrag) > 15000 Betrachtet man die bekannte Einschränkung, daß ein bestimmtes Absenderkonto nur im Rahmen des Batchlaufes der zugehörigen Bank auf dem Strom auftaucht, kann der entsprechende Eintrag eigentlich schon aus dem Fenster entfernt werden, sobald eine Überweisung mit einer anderen Absenderbankleitzahl auf dem Datenstrom entdeckt wurde. Somit müssen für die Batchläufe anderer Banken, die danach stattfinden, keine weiteren Einträge der vorhergehenden Bank gespeichert werden. Das reduziert den Speicherbedarf für das zeitbasierte Fenster auf eingehendeUeberweisungen, wenn die einzelnen Batchläufe im weniger als 5 Minuten lang sind, wovon im Regelfall auszugehen wäre. 4.3 Näherungsverfahren Besonders bei langlebigen Anfragen können sich Eigenschaften von Datenströmen ändern, so daß bestimmte Annahmen, die zum Zeitpunkt der Erstellung getroffen wurden, nicht mehr gelten. Die in Abschnitt 4.2.1 beschriebenen Möglichkeiten, Anfragen nicht nur bei der ersten Planerstellung, sondern auch dynamisch zu optimieren, reichen hier nicht in allen Fällen aus. Es kann trotzdem dazu kommen, daß Datenströme aufgrund einer besonders hohen Datenrate entweder die CPU oder den Speicher überlasten. Hierführ gibt es in STREAM zwei Arten von Näherungsverfahren [ABB+04]: Annäherung bei CPU-Überlastung: Da häufig nicht vorhersehbar ist, wie lange die Überlastung anhalten wird, viele Anwendungen aber Echtzeitanforderungen haben oder zumindestens den Anspruch, in angemessener Zeit“ Ergebnisse zu bekommen, setzt STREAM ” ein Verfahren namens load-shedding ein. Load-shedding ( Last-Abwurf“ als Analogie zum ” Ballonfahren) bedeutet, daß in Abhängigkeit von der Überlastsituation nur noch Teile eines Datenstroms zur Verarbeitung herangezogen werden. Zunächst wird ermittelt, in welchem Bereich die geringsten Abweichungen durch das Ignorieren von Elementen zu erwarten sind. Ist dort noch kein Sampling-Operator gesetzt, wird dieser automatisch intern eingefügt, ansonsten wird der Wert für das Sampling angepaßt. Dieser Vorgang wird wiederholt, bis die Überlast bewältigt ist. Sollten die Überwachungsmechanismen nach einer Weile ein Absinken der Datenrate feststellen, wird die Rate der verworfenen Elemente schrittweise auf den Ausgangswert zurück gesetzt. Annäherung bei Speicher-Überlastung: Wenn es viele, sehr komplexe Anfragen gibt oder Anfragen mit zeitbegrenzten Fenstern bei hoher Datenrate, dann kann der Primärspeicher zu voll werden, um noch alle neuen Elemente bei Beibehaltung der notwendigen alten Elemente aufnehmen zu können. Auslagerungsvorgänge sind aus Leistungsgründen meist Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Seite 18 nicht praktikabel. STREAM arbeitet hier ähnlich wie bei CPU-Überlastung, nur werden keine Werte direkt verworfen. Stattdessen werden Anpassungen an Fenstergrößen vorgenommen, um die Größe der Zwischenspeicher gezielt zu reduzieren. 5 Zusammenfassung und Ausblick In den vorangegangenen Kapiteln wurde STREAM als ein Vertreter der Datenstrom-Management-Systeme vorgestellt. Dabei wurde zunächst erläutert, welche Zielstellungen das Projekt verfolgt, wie das System eingesetzt werden soll und wie sich darauf ausgerichtet die Begriffe aus der Welt der DSMS definieren. Ein wichtiges Ziel wurde mit der danach vorgestellten Anfragesprache CQL erreicht - eine möglichst einfache und intuitive Möglichkeit für Benutzer, Anfragen zu definieren. Nach der Vorstellung der einzelnen Sprachelemente wurde deren Implementierung im System beschrieben. Neben der reinen Sprachumsetzung verfügt STREAM über viele für die generische Verarbeitung von Datenströmen wichtige Mechanismen, wobei sich zeigt, daß STREAM den Schwerpunkt auf eine hohe Leistungsfähigkeit des Systems gesetzt hat. Die entsprechenden Konzepte zur Ressourcenverwaltung und zur dynamischen Anpassung des Systems wurden abschließend beschrieben. Die Ziele des Projektes für die Zukunft gehen größtenteils in eine andere Richtung: Neben Verbesserungen bei den Näherungsverfahren zur Überlastbewältigung sind vor allem Möglichkeiten zur verteilten Verarbeitung von Datenströmen, Publish-Subscriber-Verfahren zur Optimierung der Ergebnisrückführung, sowie Wiederherstellungsmechanismen nach einem Systemabsturz, die Garantien analog zu den von Datenbank-Management-Systemen bekannten ACID-Bedingungen der Transaktionsverarbeitung ermöglichen sollen. Seite 19 6 Udo Werner, Thema 7: STREAM: The Stanford Stream Data Manager Abkürzungen ACID Atomicity, Consistency, Isolation, Durability CQL Continuous Query Language DBMS Datenbank-Management-System DSMS Datenstrom-Management-System SQL Structured Query Language STREAM Stanford Stream Data Manager Literaturverzeichnis [ABB+03] Arvind Arasu, Brian Babcock, Shivnath Babu, Mayur Datar, Keith Ito, Rajeev Motwani, Itaru Nishizawa, Utkarsh Srivastava, Dilys Thomas, Rohit Varma, und Jennifer Widom. STREAM: The Stanford Stream Data Manager. IEEE Data Eng. Bull., 26(1): Seiten 19-26, 2003. [ABB+04] A. Arasu, B. Babcock, S. Babu, J. Cieslewicz, M. Datar, K. Ito, R. Motwani, U. Srivastava, J. Widom. STREAM: The Stanford Data Stream Management System. Erscheint in M. Garofalakis, J. Gehrke, and R. Rastogi, editors, Data Stream Management: Processing High-Speed Data Streams, Springer-Verlag, 2004. [ABW03] Arasu, Arvind; Babu, Shivnath; Widom, Jennifer. The CQL Continuous Query Language: Semantic Foundations and Query Execution. Technical Report, The Stanford University Database Group, 2003, URL: http://dbpubs.stanford.edu/pub/2003-67 . [BBDM03] Babcock, Brian; Babu, Shivnath; Datar, Mayur; Motwani, Rajeev. Chain: Operator Scheduling for Memory Minimization in Data Stream Systems, Proc. of the ACM Intl Conf. on Management of Data (SIGMOD 2003) [GTO03] Lukasz Golab und M. Tamer Ozsu. Issues in Data Stream Management. In SIGMOD Record, Volume 32, Number 2, Juni 2003, Seiten 5-14. [GOL03] Lukasz Golab. Querying Sliding Windows over On-Line Data Streams. Proc. ICDE/EDBT Ph.D. Workshop, Seiten 1-10, März 2004. [MWA+03] Rajeev Motwani, Jennifer Widom, Arvind Arasu, Brian Babcock, Shivnath Babu, Mayur Datar, Gurmeet Singh Manku, Chris Olston, Justin Rosenstein, und Rohit Varma. Query processing, approximation, and resource management in a data stream management system. In CIDR, 2003.