Veröffentlicht am

Data Engineering Lifecycle

Data Engineering Lifecycle

Der Data Engineering Lifecycle

Daten sind das Gold des 21. Jahrhunderts und Data Scientist is the sexiest job of the century. Diese plakativen Aussagen setzen voraus, dass überhaupt Daten vorhanden sind. Data Engineers pflegen den Data Engineering Lifecycle. Wir beleuchten die Etappen des Datenlebenszyklus und Aufgaben der Data Engineers.

Data Scientist is the sexiest job of the 21st century. So titelte 2012 der Harvard Business Review.

Plötzlich wollte jeder Data Scientist sein, schrieb es auf seine Visitenkarte und belegte vielleicht sogar einen der inflationär entstandenen Lehrgänge.

Die Ernüchterung war groß: Viele Algorithmen und noch mehr Mathematik. Wahre Data Science ist nicht jedermanns Sache.

Doch auch die Erfolge waren und sind groß – künstliche Intelligenz wird immer besser und sinnvoll anwendbar für alle.

Und jetzt mausert sich eine neue Job-Bezeichnung: Data Engineer.  Ist das der “real sexiest Job“?

Was macht ein Data Engineer überhaupt?

Der Data Engineering Lifecycle beantwortet diese Frage am besten. Verfolgen wir also den ‘Lebenszyklus’ von Business-Daten.

Data Engineering Lifecycle schmatisch

Daten generieren

Jede App, jeder Sensor, jede Enterprise Anwendung, jeder Server – alle erzeugen Daten. Am Ursprung tippt vielleicht ein Mensch Daten ein oder eine Maschine generiert Daten. Daten fallen auf den unterschiedlichsten Endgeräten und in den unterschiedlichsten Formaten an.

Daten sind nicht Selbstzweck. Der Rohstoff ‘Daten’ muss also gewonnen und zusammengeführt werden, um daraus wichtige Erkenntnisse abzuleiten, die zu Business-Entscheidungen führen. Dazu gehört die Überwachung der Server genauso wie die Überwachung der Umsatzzahlen.

Der Data Engineering Lifecycle beschreibt die Schritte von der Datenquelle bis hin zur geschäftsrelevanten Kennzahl.

Daten speichern

Das Gold des 21. Jahrhunderts sind Daten. Werden die Daten nicht dauerhaft gespeichert, dann gehen sie sofort verloren und mit ihnen das vermeintliche Gold. Es werden immer mehr Daten und so benötigen wir immer größere Datenspeicher.

Daten sollen verlustfrei gespeichert werden. “Speicherplatz kostet ja nichts”, das ist eine oft gehörte Aussage und sie ist mit Vorsicht zu genießen. Sicher auch in einer Zeit, in der das Thema Energieknappheit immer lauter diskutiert wird.

Mit dem Speicherplatz geht die Datenübertragung einher, sowohl eingehend als auch ausgehend. Wer Daten speichert, kümmert sich um die Formatierung, Kompression, Sicherung, und Organisation der Daten.

Je nach Datenmengen stehen unterschiedliche Technologien zur Verfügung, die vertikal oder horizontal  skalieren. Lohnt sich Big-Data-Technologie – die Frage wird sorgfältig abgeklärt. Dazu gehört die Frage, ob die Daten auf einem Filesystem wie HDFS oder in einem Event Hub wie Apache Kafka aufzubewahren sind.

Daten abholen

Die Daten werden von ihrer Quelle in den Speicher geleitet. Der Fachausdruck ist ‘Ingestion’. Dabei darf nichts verloren gehen und nichts sollte verdoppelt werden.

Die Möglichkeiten reichen von Batch-Verarbeitung bis zur Echtzeitverarbeitung.

  • Export aus dem Quellsystem und Import im Datenspeicher.
  • Echtzeit-Daten gewinnen, on the fly transformieren und speichern.

Die Daten können in zeilenorientierten Formaten vorliegen oder auch spaltenorientiert. Sie können komprimiert sein und sie können in einem beliebigen Zeichensatz angeliefert werden.

Sie können in unregelmäßigen Abständen, beispielsweise ein Mal pro Monat oder kontinuierlich angeliefert werden.

Quelle kann ein Fremdsystem sein oder auch eine Eigenentwicklung.

Daten transformieren

Daten werden in nahezu beliebigen Formaten erzeugt und werden zur Weiterverarbeitung bereinigt und transformiert. Detailarbeit manchmal, jedoch mit großer Verantwortung verbunden. Relevantes ist von irrelevantem zu trennen und die Transformation darf keinen Sachverhalt verfälschen.

Datenformate werden erkannt, Veränderungen in den Datenformaten nachvollzogen, Ausreißer gefunden und Duplikate entfernt. Zeichensätze bereinigt und überflüssige Informationen entfernt.

Spätestens bei diesem Schritt werden Daten gesetzeskonform anonymisiert.

Daten ausliefern

Die Daten werden bereitgestellt für die Data Scientisten und Datenanalysten. Dazu gehören auch die Beschreibung der Daten, der Fileformate, der Datenquelle, und der Semantik der Daten,  genauso wie die Bestimmung der Wertebereiche.

Die Daten können in Dateien ausgeliefert werden oder auch in Echtzeit. Die Zugriffsrechte auf die Daten und die Zuständigkeiten müssen klar sein.

Aufgaben der Data Engineers

Data Engineers planen, implementieren und betreuen den gesamten Data Engineering Lifecycle. Dazu wählen sie Tools und Technologien aus, stellen Infrastruktur bereit, holen die Daten von der Quelle ab und stellen sie bereit für die Analyse.

Ohne Data Engineer sind die Data Scientists und Analysten ohne Rohmaterial. Dank der Data Engineers schürfen sie das Datengold.

Data Engineers sind also “systemrelevant”. Und wie die meisten systemrelevanten Jobs werden sie oft als selbstverständlich hingenommen.

Ausbildung des Data Engineers

Ein Data Engineer verfügt über eine solide Informatiker-Ausbildung. Am besten mit einigen Jahren Erfahrung als Software-Engineer. Er muss nicht nur eng mit den Software-Engineers zusammenarbeiten, sondern oftmals auch Code entwickeln.

Ein Data Engineer hat nicht nur den Überblick über die Tool-Landschaft, sondern kennt auch die Funktionsweise der Tools. Dazu gehören auch die Open-Source  Tools einer Real-Time Data Pipeline.
Bei den wachsenden Datenmengen sind das oft Big-Data-Tools und diese basieren auf verteilten Systemen.
Die Orchestrierung verteilter Systeme ist anspruchsvoll und die Data Engineers sind dafür verantwortlich.
Vielleicht klickt sie dazu letztendlich in der Cloud etwas zusammen. Es wäre fatal zu behaupten, dass Data Engineers deswegen kein Verständnis für die eingesetzten Tools benötigen.

Abgrenzung zu Data Scientist und Analyst

Data Scientists und Analysts benötigen also ab die Zuarbeit der Data Engineers.

Beide Tätigkeitsgebiete gab es schon lange, bevor sie so bezeichnet wurden. Und es wird sie noch geben, auch wenn sie nicht mehr so genannt werden. Auch die Trennung ist nicht immer ganz klar, Grenzen verwischen, gerade wenn es um Transformation der Daten und Auswahl von Tools geht.

Data Engineering, Cloud und Big Data

Die Tätigkeiten der Data Engineers sind unabhängig von den Datenmengen. Für überschaubare Mengen werden Data Engineers ebenso die geeigneten Tools und Infrastrukturen auswählen wie für sehr große Datenmengen.

Gute Data Engineers kennen sich also aus mit der Big-Data-Tool-Landschaft. Diese Tools basieren auf verteilten Systemen, deren Verwaltung viel komplexer ist als bei nicht-verteilten Systemen.

Unabhängig von der Datenmenge werden Data Engineers bei  der Entscheidung mitwirken, ob die Daten in der Cloud zu halten sind. Diese strategische Entscheidung muss unternehmensweit getragen werden. Ein Data Engineer wird das Pro und Contra für Cloud-Lösungen abwägen können.

Fazit

Data Engineering ist eine vielfältige und anspruchsvolle Tätigkeit. Der beschriebene Lifecycle wird Bestand haben, die Benennungen ändern sich mit der Zeit, die Tool-Landschaften werden weiterentwickelt und die Data Engineers werden mit den Entwicklungen Schritt halten.

  • Data Engineering ist ja nicht Selbstzweck. Vielmehr dient es dazu, aus Daten Nutzen zu ziehen. Künstliche Intelligenz wurde möglich, dank sorgfältigem Data Engineering.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Chatbot als Lernassistent
  • Prompt Engineering Personas und Wiederholungen
  • AI-Engineering-Fachglossar
  • EBook Tutorial: Cluster aus virtuellen Maschinen
  • Ebook: Apache ZooKeeper
  • Ebook: Realtime Streaming Pipelines
  • LSM-Trees: Log Structured Merge Trees
  • Aufbau einer Enterprise Search
  • Zeit Stream Analytics
  • B-Tree-Index in Datenbanken
  • Ordering Guarantee in Apache Kafka
  • CAP Theorem
  • MapReduce Funktionale Programmierung
  • Konzepte des HDFS
  • Optimistisches Concurrency Control
Veröffentlicht am

Das CAP Theorem wird 20

CAP Theorem

CAP Theorem nach 20 Jahren

Eric Brewer sprach im Jahr 2000 anläßlich seiner Keynote an der PODC Konferenz aus, was vor ihm schon andere beobachteten: Ein verteiltes Datenbanksystem kann nicht gleichzeitig hochverfügbar und ausfallsicher sein und auch noch konsistente Daten garantieren. Eine der drei Eigenschaften bleibt immer auf der Strecke.

Im Juni 2002 veröffentlichten Nancy Lynch und Seth Gilbert ihren theoretischen Beweis von Brewers Vermutung. Damit entstand das CAP Theorem und es begleitet uns seither auf Schritt und Tritt.

Wer sich mit der Verarbeitung und Analyse massiver Datenmengen befasst, also mit Big Data, ist täglich mit dem CAP Theorem konfrontiert. Wir untersuchen das CAP Theorem 20 Jahre nach dessen Beweis.

Big Data Cluster – physisch und logisch

Massive Datenmengen werden in verteilten Systemen gehalten. Und auch die Verarbeitung und Analyse erfolgt verteilt: die Programme werden zu den Daten geschickt, auf die einzelnen Server, wo die Daten lagern. Und jeder Server nimmt die Verarbeitung für diejenigen Daten vor, die dort lagern.

Die Abbildung veranschaulicht links ein Big-Data-Cluster, also einen Rechnerverbund, wie er physisch in einem Rechenzentrum aufgebaut wird.

Rechts sehen wir als Beispiel eine Master-Worker-Architektur. Sowohl Master als auch Worker sind Daemon-Prozesse, die auf einzelnen physischen oder virtuellen Servern laufen. Die Kommunikation erfolgt zwischen Master und Worker und im Rechenzentrum erfolgt sie entlang der physischen Netzwerkverbindungen zwischen den betroffenen Servern.

Kommunikation und Transaktion

Die Server kommunizieren ständig untereinander und befolgen dabei vorgegebene Protokolle. Sollen beispielsweise neue Daten geschrieben werden, dann erfolgt dies in einer Transaktion. Eine Transaktion hat einen wohldefinierten Start und ein wohldefiniertes Ende.

Und oft muss in einer Transaktion auf mehrere Server geschrieben werden. Was soll jetzt passieren, wenn zwei der beteiligten Server nicht mehr miteinander kommunizieren können?

Cluster pyhsisch und logisch

Partition Tolerance

Wir erwarten Partitionstoleranz: Das Gesamtsystem soll weiter funktionieren, und zwar auch dann, wenn zwei Systemkomponenten gerade nicht miteinander kommunizieren können.

Die schreibende Transaktion aus unserem Beispiel soll also trotzdem fertig durchgeführt werden. Denn so kann das System als Ganzes weiter arbeiten und das erwarten wir heutzutage.

Doch diese schöne Eigenschaft kommt mit einem Preis: Der Preis ist entweder die Konsistenz oder die Hochverfügbarkeit. Beides ist nicht möglich, wenn wir Partitionstoleranz erwarten.

Hochverfügbarkeit

Wir erwarten gerne auch Hochverfügbarkeit des Gesamtsystems. Jede Anfrage ans Gesamtsystem erhält eine fehlerfreie Antwort. Die Transaktionen sollen nicht mit Rollback beendet werden, so wie wir das aus relationalen Systemen kennen.

Jede Transaktion, sei sie lesend, sei sie schreibend, soll ohne Fehler beendet werden. Die User sollten nicht warten müssen.

Eine Super-Eigenschaft eines verteilten Datensystems. Doch sie kommt mit einem Preis: die Daten können nicht gleichzeitig immer konsistent sein und die Partitionstoleranz kann auch nicht gleichzeitig sichergestellt sein. Nur eines geht gleichzeitig mit der Hochverfügbarkeit.

Konsistenz

Eine Selbstverständlichkeit, eigentlich: Jeder Lesebefehl erhält das Ergebnis des jüngsten Schreibbefehls oder eine Fehlermeldung.

Ein Szenario zur Erläuterung:

Partition Tolerance CAP Theorem

Das CAP Theorem filt im Fehlerfall

Das CAP Theorem ist irrelevant in einem nicht verteilten System und es ist auch irrelevant in einem ausnahmslos fehlerfrei funktionierenden verteilten System.

In der Abbildung sehen wir rechts ein typisches Szenario des Normalbetribs:

  • Client1 kann einen Schreibbefehl nur an einen Master schicken.
  • Der Master schreibt die Daten auf sein eigenes System und repliziert sie zu einem Worker.
  • Der Worker schreibt die Daten auf sein eigenes System.
  • Und erst jetzt wird die Transaktion Client1 gegenüber als erfolgreich bestätigt.

Client2 kann in diesem System die Daten auch vom Replikat lesen und erhält nur bestätigte Daten. So wird die Leselast im Gesamtsystem verteilt. Ein typisches Szenario.

Doch: Hardware fällt aus. Software auch. Wir müssen mit diesen Fehlern leben.

Wie soll das System reagieren im Fehlerfall? Jetzt kommt das CAP Theorem ins Spiel:

Soll das System hochverfügbar sein?

Dieser Fall ist in der Abbildung in der Mitte dargestellt. Wir nehmen an, der Master könne die Daten nicht zum Worker replizieren.

Hochverfügbarkeit steht in dem Fall vor Konsistenz der Daten und so leben wir damit, dass Client2 veraltete Daten liest.

Ein gutes verteiltes System wird bemerken, wenn die ausgefallene Verbindung wiederbelebt wird und wird die Replikation selbstständig nachholen. Die Daten werden also in hoffentlich nicht allzu ferner Zukunft konsistent werden.

Aber für oft kurze Zeit ist diese Konsistenz nicht garantiert – weil Hochverfügbarkeit vorgeht.

Konsistenz geht vor

Dieser Fall ist in der Abbildung rechts dargestellt. Wiederum kann der Master die Daten nicht replizieren.

Um jetzt die Datenkonsistenz jederzeit zu garantieren, muss der Master den Schreibbefehl zurückweisen. Das System ist also nicht mehr hochverfügbar, denn dann würden wir ja keine zurückgewiesenen Befehle sehen. Dafür garantiert das System jederzeit konsistente Daten.

Tunable Consistency

Seit Nancy Lynch und Setz Gilbert das CAP Theorem 2002 mit Hilfe der theoretischen Informatik bewiesen, wurde viel geforscht und manches wurde relativiert.

Lange wurden Big-Data-Systeme klassifiziert nach CA, AP, CP – je nachdem, welche der beiden Eigenschaften der drei Eigenschaften des Theorem sie aufwiesen.

Doch zwanzig Jahre sind in der IT eine sehr lange Zeit – die Entwicklungen überstürzen sich. Und so ist diese Klassifizierung der Systeme aus heutiger Sicht wenig sinnvoll.

Mit ‘tunable Consistency’ lassen moderne Big-Data-Systeme dem Anwender die Wahl für jede Transaktion:

Was ist wichtiger: Konsistenz des Systems in Bezug auf die betroffenen Daten oder Hochverfügbarkeit des Systems in Bezug auf die betreffende Transaktion.

Erfahre mehr über die Eigenschaften von Big Data Systemen im E-Mail Kurs:

  • Data Engineering ist ja nicht Selbstzweck. Vielmehr dient es dazu, aus Daten Nutzen zu ziehen. Künstliche Intelligenz wurde möglich, dank sorgfältigem Data Engineering.

  • Chatbot als Lernassistent
  • Prompt Engineering Personas und Wiederholungen
  • AI-Engineering-Fachglossar
  • EBook Tutorial: Cluster aus virtuellen Maschinen
  • Ebook: Apache ZooKeeper
  • Ebook: Realtime Streaming Pipelines
  • LSM-Trees: Log Structured Merge Trees
  • Aufbau einer Enterprise Search
  • Zeit Stream Analytics
  • B-Tree-Index in Datenbanken
  • Ordering Guarantee in Apache Kafka
  • CAP Theorem
  • MapReduce Funktionale Programmierung
  • Konzepte des HDFS
  • Optimistisches Concurrency Control
  • Data Engineering ist ja nicht Selbstzweck. Vielmehr dient es dazu, aus Daten Nutzen zu ziehen. Künstliche Intelligenz wurde möglich, dank sorgfältigem Data Engineering.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

Veröffentlicht am

Zeit im Big Data Stream Processing

https://tirsus.com/wp-content/uploads/2023/10/Zeit-im-Big-Data-Stream-Processing.jpg

Zeit im Big Data Stream Processing

Event-Time, Ingestion-Time, Processing-Time? Und was bedeutet da Real-Time? Der Artikel beleuchtet spezielle Herausforderungen der Echtzeitanalyse großer Datenströme besonders im Hinblick auf den Faktor Zeit.

Typische Anwendungsfälle des Data Stream Processings

Real-Time Analytics - Use Cases
Anwendungsfälle der Real-Time Stream Analytics: Eine Analyse-Pipeline verarbeitet als Quelle (Source) unbounded Datasets und leitet die Ergebnisse an die geeignete Senke (Sink) weiter.

Streams sind überall:

  • Logdaten zur Überwachung von Servern
  • Sensordaten aus Endgeräten, wie Smartphones (IoT)
  • Sensordaten aus Fahrzeugen und Geräten (IoT, Predictive Maintenance)
  • Überwachungsdaten- z.B. Webcams
  • Social Media Daten
  • Echtzeitanalysen in Data Warehouses, resp. Data Lakes
  • und viele andere mehr

Statt von ‘Records’ ist die Rede von ‘Events’ oder auch von ‘Messages’ oder ‘Nachrichten’. Die Events werden ununterbrochen generiert und gelangen in einem fortwährenden Strom in die Analytics-Pipeline.

Unaufhörlich treffen neue Events ein. Stream Processing verarbeitet und analysiert ‘unbeschränkten’ Datasets (engl. unbounded Datasets). Eigentlich sind es Warteschlangen (Queues) und die Events.

Zeitkritische Verarbeitung von Data Streams

Sollen beispielsweise Herzpatienten von Ferne überwacht werden, dann ist eine sehr zeitnahe Verarbeitung und Analyse gefordert.

Verläßt der Puls eine gewisse Toleranzschwelle, dann wird ein Alarm ausgelöst. Diagramme werden zusätzlich erstellt und ermöglichen die Diagnose und Überwachung.

Ein konstruiertes Beispiel erleichtert die Erläuterung: Bei einem Herzpatienten soll der Puls gemessen werden. Für jeden Pulsschlag wird via Internet ein Event an die Real-Time Data Pipeline in einem entfernten Rechenzentrum gesandt.
Ein konstruiertes Beispiel erleichtert die Erläuterung: Bei einem Herzpatienten soll der Puls gemessen werden. Für jeden Pulsschlag wird via Internet ein Event an die Real-Time Data Pipeline in einem entfernten Rechenzentrum gesendet.

Das Szenario ist stark vereinfacht:

Ein kleines Gerät erhebt den Puls bei einem Herzpatienten. Für jeden Herzschlag schickt es ein Event via Internet zu einer Real-Time-Pipeline.

Nicht jedes Event nimmt denselben Weg durchs Internet – und so treffen die Events in nahezu beliebiger Reihenfolge in der Analytics Pipeline ein.

Wird jetzt der Puls unseres fiktiven Patienten ausgewertet, dann dürfen keine Events verloren gehen und es dürfen keine Events mehrfach verarbeitet werden.

Dies zu garantieren, ist in Big Data Systemen eine besonders komplexe Aufgabe. Immerhin sollen diese Systeme ja horizontal skalieren.

Vorkehrungen bei der Konfiguration des Gesamtsystems und bei der Programmierung Analyse sind notwendig, um die geforderte Exactly-Once Verarbeitung zu erreichen.

Zeitfenster (Windows) in der Data Stream Processing

Für eine Echzteit-Analyse werden die laufend eintreffenden Events typischerweise nach Zeitintervallen zusammengefasst (aggregiert) und das Ergebnis wurd als Zeitreihe dargestellt.

Beispiel Histogram als Ergebnis einer Aggregatsfunktion
Das Ergebnis einer Real-Time Analyse ist typischerweise eine Zeitreihe. Die Events werden in sinnvollen Zeitintervallen aggregiert.

Dazu teilt die verwendete Stream Analytics Engine  die Events in Zeitfenster (engl. Windows) ein.

Man unterscheidet die folgenden Window-Typen:

Typen verschiedner Zeitfenster
Schematische Verdeutlichung der verschiedenen Typen von Zeitfenstern. Nicht jede Analytics Engine bietet alle Typen an.

Fixed Windows (heißen auch hopping Windows) unterteilen die Zeit in gleichmäßige Intervalle. Die klassische Batch-Verarbeitung mit den typischen nächtlichen Verarbeitungen, macht eigentlich genau das gleiche. In der real-time Verarbeitung sind die Intervalle jedoch sehr viel kleiner und die Analyse erfolgt sehr zeitnah zum Eintreffen der Daten.

Sliding Windows haben Überlappungen. Dies erlaubt es, einen Einblick in die eintreffenden Daten zu erhalten noch bevor die Verarbeitung eines Window fertig abgeschlossen ist.

Sessions sind auch Zeitfenster. Diese haben jedoch unterschiedliche Länge und überlappen. Selbst die Aktionen in einer Web-Session oder in einer Datenbank-Session bilden einen Event-Stream.

Die Herzschläge unseres fiktiven Patienten analysieren wir mit Fixed Windows – der Puls eines Patienten wird ja pro Minute erhoben.

Typen des Data Stream Processing

Typen Stream Analytics Operationen
Schematische Darstellung verschiedener Typen von Real-Time Analytics Operationen.

Immer häufiger werden klassische ETL-Prozesse durch Data Stream Processing abgelöst. Hier kommt elementweise Verarbeitung zum Zuge, beispielsweise, um Daten zu bereinigen (Datumstransformation und ähnliches).

Gerade für Analysen sind Aggregationen interessant. In SQL entsprechen diese einem Group By.

Oft werden auch Daten aus verschiedenen Quellen zu einem Stream vereint – in SQL entspricht dies einem Join.

Machine Learning auf Streams wird immer beliebter. Anwendungsfälle sind Predictive Maintenance oder Fraud Detection.

Im Beispiel unseres fiktiven Herzpatienten aggregieren wir die Events und zählen sie pro Minute.

Zeitversatz (Time Skew)

Konzentrieren wir uns auf die Zeit. Der Zeitpunkt eines einzelnen Herzschlags des Patienten ist die Event-Time. Trifft das Event bei der Pipeline ein, dann spricht man von Ingestion-Time.

Präziserweise würden wir von Timestamp statt von Time sprechen.

Zwischen diesen beiden Zeitpunkten kann theoretisch beliebig viel Zeit verstreichen. Und möglicherweise befindet sich der Patient gerade in einer anderen Zeitzone als die Streaming Pipeline.

Event-Time vs. Processing-Time
Event-Time vs. Processing-Time

Auch innerhalb der Pipeline wird es eine gewisse Zeit dauern, bis das Event verarbeitet wird. Der Zeitpunkt wird Processing Time genannt.

Die Abweichung zwischen der Processing Time und der Event Time bezeichnen wir als Zeitversatz (engl. Time Skew).

Der Begriff “Real-Time” suggeriert, dass der Zeitversatz gleich Null ist. Doch das ist unrealistisch. Eigentlich sollte von “Near-Real-Time” gesprochen werden.

Beispiel Event-Time vs. Processing-Time
Darstellung der Abweichung zwischen Event-Time (x-Achse) und Processing-Time (y-Achse). Jeder schwarze Punkt markiert ein einzelnes Event. Der zeitliche Versatz der beiden Zeitpunkte wird als Abweichung von der Diagonalen. Die Ideallinie bedeutet Real-Time im wörtlichen Sinn.

Das hervorgehobene Event wurde um 12:00:xx generiert und wird ist erst um 12:05:yy von der Pipeline verarbeitet.

Soll nach Processing-Time analysiert werden, dann fällt das Event ins Zeitintervall der Minute 12:05 -12:06.

Soll hingegen nach Event-Time analysiert werden, dann gehört das Event ins Zeitintervall zwischen 12:00 und 12:01.

Die Diagonale  zeigt den nie eintreffenden Idealfall: die Verarbeitungszeit ist gleich der Event-Zeit – das wäre Echtzeit im wörtlichen Sinn. Der zeitliche Versatz von der Ideallinie ist sowohl in der x-Achse als auch in der y-Achse sichtbar.

Dieser zeitliche Versatz nicht konstant sondern hängt von vielen technischen Faktoren ab:

  • Vom Zustand der Systeme außerhalb der Stream-Analytics-Pipeline, beispielsweise von der Übertragungsgeschwindigkeit im Internet.
  • Vom Zustand der Stream-Analytics-Pipeline.

Auswirkungen des zeitlichen Versatzes

Bedeutet “Real-Time” jetzt Verarbeitungszeit – dann verarbeitet die Analytics Engines die Events in der Reihenfolge ihres Eintreffens. Ganz unabhängig davon, wie lange die Events unterwegs und welchen Weg sie durchs Internet eingeschlagen haben.

Auswertung nach Processing-Time
Auswertung des Beispiels nach Processing-Time. Hier werden die Pulsschläge pro Minute gezählt. Berücksichtigt wird die Processing-Time.

Das Histogramm zeigt die Anzahl der Events pro Minute. Window-Länge ist also eine Minute. Wir betrachten die Achse “Processing Time” und zählen pro Minute die jeweils Events. Das Ergebnis zeichnen wir im Histogramm auf.

Anders sieht es aus, wenn mit “Real-Time” an die Event-Zeit gemeint ist, wie bei unserem Herzpatienten.

Rechnen wir das Ergebnis der Event-Time Analyse in unserem Beispiel aus:  Diesmal zählen wir die Events pro Minute auf der Achse Event-Time. Dabei entsteht das folgende Histogramm:

Auswertung nach Event-Time
Auswertung derselben Daten, doch diesmal werden die Pulsschläge pro Minute nach Event-Time gezählt.

Legen wir beide Histogramme übereinander, dann sehen wir große Abweichungen zwischen den beiden Analysen. Je nach Anwendungsfall sind solche Abweichungen nicht tragbar.

Bei unserem Beispiel: die beiden Analysen des Pulses unseres fiktiven Patienten weichen sehr stark voneinander ab.

Vergleich der Auswertung nach Event-Time und nach Processing-Time
Vergleich der Auswertung nach Event-Time (schwarz) und nach Processing-Time (orange).

Der Zeitversatz zwischen Processing-Time und Event-Time stellt hohe Anforderungen an die Stream Analytics Engine. Diese arbeitet ja auf dem Zeitstrahl der Processing-Time, erhält die Events in beliebiger Reihenfolge mit beliebigen Versatz und ist gefordert in Echtzeit nach Event-Time auszuwerten.

Analysen nach Event-Zeit

Untersuchen wir das Phänomen genauer.

Zur Verdeutlichung färben wir die Events, die in derselben Minute anfielen (Event-Zeit) mit je einer Farbe.

Beispiel der zeitkritischen Real-Time Analyse nach Minute Event-Time
Beispiel der zeitkritischen Real-Time Analyse - die Events einer Minute sind jeweils gleich eingefärbt.

Daraus leiten wir den Event-Stream ab in der Reihenfolge der Processing-Time. In der Reihenfolge verarbeitet die Analytics Engine die Events ja in jedem Fall.

Processing-Stream
Die Events sortiert nach Processing-Time - in dieser Reihenfolge treffen die Events bei der Analytics-Pipeline ein.

Die Analyse nach Minute ist für die Überwachung unseres Herzpatienten unbrauchbar.

Die Analytics Engine stellt jetzt die Reihenfolge wieder her, in der die Events ursprünglich angefallen ist.

Wir ergänzen das Diagramm durch den Event-Stream nach Event-Time. Die Pfeile zeigen, wie die Stream Analytics Engine die laufend verarbeiteten Events intern in die Zeitfenster der Event-Zeit zuordnet und so die urspüngliche Reihenfolge wieder herstellt.

Dabei reicht die Zuordnung zum Zeitfenster aus – immerhin werden die Daten anschließend pro Zeitfenster ausgewertet. Pro Zeitfenster verwaltet die Analytics Engine also einen internen Puffer.

Event-Stream - rekonstruiert
Die Analytics Pipeline rekonstruiert den Stream nach Event-Time.

Man beachte, dass es sich bei einem Stream nicht um ein abgeschlossenes Dataset handelt, das einfach umsortiert werden kann. Bei dem unbounded Dataset des Streams treffen laufend neue Events ein.

Moderne Real-Time Analytics Systeme sind in der Lage, diese Zuordnung vorzunehmen.

Watermark

Bleibt die Frage, wie lange diese internen Puffer bestehen bleiben. Immerhin läuft die Pipeline ununterbrochen und potenziell unendlich lange. Diese Puffer verbrauchen Platz im Memory, der Platz ist endlich und muss frei gegeben werden.

Beispiel für ein spät eintreffendes Event
Das hervorgehobene Event wurde kurz nach 12:00 generiert, trifft aber erst nach 12:05 in der Pipeline ein.

Der zeitliche Versatz liegt in der Natur der Pipeline. Die Abweichung zwischen Event-Time und Processing-Time sollte für die meisten Events vergleichbar sein. Es wird immer Ausreisser geben, die mit erheblicher Verspätung eintreffen.

Als Watermark bezeichnet man die Toleranzgrenze für verspätetes Eintreffen. Setzen wir in unserem Beispiel die Watermark auf zwei Minuten, dann wird der Pupper für das erste Intervall, das ja um 12:01 endet, um 12:03 abgeschlossen, also zwei Minuten nach Ende des Zeitfensters.

Später eintreffende Events werden für die Analyse nicht mehr berücksichtigt.

Trigger

Wir sprechen von Echtzeit und wollen sofort Ergebnisse sehen und nicht warten, bis das Zeitfester plus die Wassermarke verstrichen sind. In unserem Beispiel mit einem Zeitfenster von einer Minute un der Watermark von zwei Minuten, würde das ja bedeuten, dass wir drei Minuten warten müssen, um Ergebnisse zu sehen.

Nach drei Minuten werden wird das Endergebnis sehen. In einer gut funktionierenden Pipeline, sollten in den meisten Fällen ja relativ wenig verspätete Events eintreffen, so dass meistens die Auswertung für ein Zeitfenster unmittelbar aktuell ist.

Doch gerade bei längeren Zeitfenstern wäre es interessant, auch schon vorher einen Einblick zu erhalten und ein vorläufiges Ergebnis zu sehen.

Triggers dienen genau dazu.

Early Trigger bestimmen den Zeitpunkt, du dem ein Einblick in die Entwicklung der Analyse bei einem offenen Zeitfenster erlaubt. Der Zeitpunkt wird relativ zum Beginn des Zeitfensters bestimmt.

Ontime Trigger bestimmen den Einblick in die Analyse nach Abschluss des Zeitfensters.

Late Trigger bestimmen die Watermark, also die Zeitspanne, die nach dem Ontime Trigger noch durchlaufen wird, bevor die Ergebnisse der Auswertung für das betroffene Zeitfenster abschließend vorliegen und der betreffende Puffer im Memory frei gegeben wird.

In der Animation wurden die folgenden Werte angenommen:

  • Ontime Trigger = Dauer eines Zeitfensters = 1 Minute
  • Early Trigger nach 20 Sekunden (diese Wahl passt zum Beispiel und ist nicht praktischer Natur)
  • Late Trigger = Watermark = 2 Minuten
Real-Time Auswertung nach Event-Time
Animierte Darstellung der Entwicklung der Real-Time Auswertung nach Event-Zeit. Early-Trigger nach 20 sec, Ontime Trigger nach 1 Minute (=Window), Late Trigger nach 2 Minuten (=Watermark).

Als Anwender der Data Stream Processing Engine

Auf der Reise von der Quelle bis zur Verarbeitung durchläuft ein Event viele Stationen. Jede kann theoretisch einen Zeitstempel auf das Event schreiben und nach jedem dieser Zeitstempel könnte eine Auswertung erfolgen. Die Aussage des Ergebnisses wäre jedes Mal eine andere.

Als Anwender eines Real-Time Systems sorgen wir dafür, dass wir die Events nach dem richtigen Zeitstempel auswerten. Je nach Anwendungsfall berücksichtigen wir auch unterschiedliche Zeitzonen.

Jedes Real-Time Analytics System löst die in diesem Artikel ganannten Herausforderungen. Jedes System hat ein eigenes API und ein eigenes Wording. So wird beispielsweise der Trigger nicht in jedem System so benannt.

Die Darstellung in diesem Artikel beziehen sich auf  das allgemeine Data Flow Model. Und mit Apache Beam ist auch eine Art Standard in Arbeit, um dem Endanwender die Einarbeitung zu erleichtern.

In den meisten Anwendungsfällen wird eine Auswertung nach Event-Time notwendig sein. Wir müssen also dafür sorgen, dass der Event-Timestamp auf den Events vorhanden ist.

Das unterliegende System kann dem Anwender die komplexe Handhabung der Zuordnung der Events zu den passenden Windows ab.

Moderne Big Data Stream Analytics Systeme ermöglichen dies für Datenströme, die so groß sind, dass sie auf einem verteilten System analysiert werden müssen. Und so werden auch die Data-Buffers die für diese Zuordnung notwendig sind, auf mehrere Systeme verteilt.

Weiterführende Quelle:

Akidau et. al: The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale Unbounded, Out-of-Order Data Processing, 2015, Proceedings of the VLDB Endowment

  • Data Engineering ist ja nicht Selbstzweck. Vielmehr dient es dazu, aus Daten Nutzen zu ziehen. Künstliche Intelligenz wurde möglich, dank sorgfältigem Data Engineering.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Chatbot als Lernassistent
  • Prompt Engineering Personas und Wiederholungen
  • AI-Engineering-Fachglossar
  • EBook Tutorial: Cluster aus virtuellen Maschinen
  • Ebook: Apache ZooKeeper
  • Ebook: Realtime Streaming Pipelines
  • LSM-Trees: Log Structured Merge Trees
  • Aufbau einer Enterprise Search
  • Zeit Stream Analytics
  • B-Tree-Index in Datenbanken
  • Ordering Guarantee in Apache Kafka
  • CAP Theorem
  • MapReduce Funktionale Programmierung
  • Konzepte des HDFS
  • Optimistisches Concurrency Control
Veröffentlicht am Schreib einen Kommentar

Garantierte Reihenfolge in Apache Kafka

Kafka Ordering Guarantee

Garantierte Reihenfolge in Apache Kafka

Event Hubs wie Apache Kafka geben eine Ordering Guarantee und versprechen damit, dass die Events in derselben Reihenfolge gelesen werden, wie sie in die Queue geschrieben wurde. Dieser Blog-Post beleuchtet die Details und zeigt die Einschränkungen der garantierten Reihenfolge in Event Hubs im Real-Time Big Data.

1 Reihenfolge in Topics

Sei es als Message Queue, sei es als Event Hub Apache Kafka ist sehr beliebt. Apache Kafka kommt in Realtime Big Data Stream Processing Systemen zum Einsatz. Als verteiltes System ist Kafka jedoch sehr komplex. Das folgende Bild verdeutlicht die Grundidee:

High-Level-Betrachung eines Kafka-Topics
Das Producer-API sendet Events auf ein Topic. Das Consumer API liest Events von einem Topic. Ein Topic hat die Datenstruktur einer Queue, die Events haben eine Offsetnummer.

Der Producer schreibt laufend Nachrichten auf eine Topic, also eine Message Queue. Der Consumer holt diese bei Bedarf dort ab.

Zusammen mit der Aussage der Ordering Guarantee, also der garantierten Reihenfolge, suggeriert das Bild, dass der Consumer die Nachrichten in genau der Reihenfolge erhält, wie der Producer sie schreibt. Eine Queue, also Wartschlange, befolgt ja das FIFO-Prinzip – first in first out.

Das folgende Video geht mit einem simplen Test dieser Behauptung nach. Bald stellen wir fest, dass sie einen Trugschluss birgt.

Im ersten Durchlauf des Versuchs sendet der Producer die Events im Abstand von einer Sekunde an das Topic. Der Consumer erhält – wie erwartet – die Events in derselben Reihenfolge, in der der Producer sie versendet hat.

Im zweiten Durchlauf sendet der Producer die Events ohne Wartezeit und der Consumer erhält sie in einer abweichenden Reihenfolge.

Die Erklärung für das Phänomen ist einfach und basiert auf der Tatsache, dass das Topic eine verteilte Message Queue darstellt. Es wurde ja zu Beginn des Experiments mit fünf Partitionen definiert. Der Befehl im Video lautet ja:

kafka-topics.sh --create --topic nugget02 --partitions 5  --replication-factor 2 --bootstrap-server kafka-1:9092

Für das Experiment ist die Angabe –partitions 5 ausschlaggebend. Der Effekt des Experiments ist vergleichbar, wenn das Topic mit 2 oder mehr Partitionen definiert wird.

Apache Kafka ist ein komplexes System. Um das einfache API für den jeweiligen Anwendungsfall korrekt einzusetzen, benötigt man ein solides Verständnis des unterliegenden Systems.

2 Topics und Partitionen

Als Big-Data-System ist Apache Kafka ein verteiltes System. Die Daten der Topics werden also auf mehrere Broker verteilt, so dass insgesamt sehr große Datenmengen gehandhabt werden können. Je mehr Partitionen ein Topic umfasst, umso mehr Events kann das Topic enthalten.

Bei den Überlegungen zur Partitionierung ist zu berücksichtigen, dass eine Partition nicht über mehrere Festplatten hinweg gehalten werden kann. Der Festplattenplatz beschränkt also die Größe einer einzelnen Partition. Apache Pulsar ist ein Event-Hub, der diese Beschränkung nicht aufweist.

Bei der Entscheidung, wie viele Partitionen für ein Topic definiert werden sollen, spielt auch die Anzahl der vorhandenen Kafka-Broker eine Rolle. Die Partitionen sollten ja auf unterschiedliche Broker verteilt werden, um mehr Events halten zu können. Im Code oben wurden weder retention.ms noch retention.bytes definiert. Die Retention Time bestimmt die Dauer, während der ein Event in der Message Queue verbleibt, bevor es von Kafka automatisch gelöscht wird. Analog bestimmt die retention.bytes wie gross eine Partition maximal werden kann, bevor Kafka, die ältesten Events löscht, um diese Maximalgröße nicht zu überschreiten.

Topic Partitonen
Topics werden partitioniert. Die Events werden auf die einzelnen Partitionen verteilt.

3 Partitionen und Reihenfolge

Topics in Event Hubs sind ja (unbeschränkte) unbounded Datasets. Das bedeutet nicht, dass sie selbst unendlich groß werden – denn der Platz auf der Harddisk ist ja immer beschränkt und auch die Anzahl der Broker ist beschränkt. ‘Unbeschränkt’ bedeutet in dem Fall, dass die Event Queue theoretisch unendlich lang laufen kann – ältere Events werden ja gelöscht, wie oben beschrieben. Bei passender Konfiguration und Pflege wird eine unbeschränkte Laufzeit erreicht.

Jede Topic Partition ist eine Queue, also eine Warteschlange, die nach dem FIFO-Prinzip funktioniert. Damit ist ja die Reihenfolge gegeben: die Events werden in derselben Reihenfolge aus der Queue gelesen, in der sie in die Queue geschrieben wurden.

In einer verteilten Queue verteilt der Producer die Events auf die einzelnen Partitionen. Ein Event wird in genau einer Partition gespeichert. Innerhalb einer Partition werden also die Events in genau derjenigen Reihenfolge aufbewahrt, in der sie geschrieben wurden.

In unserem Experiment werden die Events also auf fünf Partitionen verteilt. Welches Event in welcher Partition landen wird, ist nicht vorhersehbar.

Doch warum stimmt die Reihenfolge im ersten Durchlauf des Experiments und im zweiten Durchlauf nicht mehr?

Der Unterschied war die Geschwindigkeit, in der der Producer die Events auf die Topic-Partitionen schickte. Um den Effekt zu verstehen, schauen wir den Partitioner genauer an.

4 Der Partitioner

Das Kafka-Partitioner API ist einfach bedienbar. Der Python Code im Experiment sah wie folgt aus:

producer = KafkaProducer(bootstrap_servers='kafka-1')
....
producer.send(topic="nugget02", value=data)

Damit wurde das Default-Verhalten von Kafka aufgerufen. Dieses setzt Vieles voraus, was vielleicht gar nicht gewünscht ist. Auch die Wahl des Partitioners.

Es stehen mehrere Partitioner-Algorithmen zur Auswahl.

Der Partitioner definiert einen Buffer für jede Partition, auf die er schreiben soll. Die eintreffenden Events verteilt er nach dem gewählten Algorithmus auf die Partitionen. Beim Round-Robin-Partitioner beispielsweise, werden die Events der Reihe nach auf die einzelnen Buffer verteilt.

Ist ein Buffer voll oder ist eine gewisse Zeit verstrichen, dann werden die Events an die jeweilige Partition gesendet. Beide Parameter können konfiguriert werden.

Dieser Timeout ist natürlich viel kürzer als die eine Sekunde, die wir im ersten Durchlauf des Experiments definiert hatten. Somit wird jedes Event einzeln an die jeweilige Partition gesandt. Im zweiten Durchlauf des Experimants wurden dann mehrere Events gleichzeitig an die Partition gesandt.

Das ist nur ein Teil der Erklärung für die abweichende Reihenfolge, in der der Consumer in den beiden Durchläufen die Events geliefert bekam. Der zweite Teil der Erklärung ist beim Consumer zu suchen.

Dieser pollt die einzelnen Partitionen in einer bestimmten (ebenfalls konfigurierbaren) Frequenz und erhält jeweils höchstens so viele Events geliefert, wie im vorgesehenen Buffer Platz finden (auch diese Parameter in konfigurierbar).

Im ersten Durchlauf des Experiments trafen die Events so langsam in den Partitionen ein, dass sie einzeln ausgeliefert wurden und so die scheinbar richtige Reihenfolge einhalten konnten. Im zweiten Durchlauf des Experiments war das nicht mehr der Fall und die globale Reihenfolge der Events geriet beim Consumer durcheinander.

Kafka Partitioner
Der Round-Robin-Partitioner verteilt die Events abwechslungsweise auf die Partitionen. Ist der Buffer voll, oder ist eine konfigurierte Zeitspanne verstrichen, dann werden die Events aus dem Buffer auf die Partition geflushed.

5 Partition beeinflussen

Bei all diesen Betrachtungen dürfen wir eins nicht außer Acht lassen: Auch beim Consumer wird es sich meistens um ein verteiltes System handeln, beispielsweise um Apache Spark, oder ein anderes Tool zur Real-Time Analyse von Kafka-Topics.

Sollte für diese Verarbeitung oder Analyse der Daten die Reihenfolge eine Rolle spielen, dann wird sich die Analyse-Komponente in ihrer Rolle als Consumer darum kümmern. So wird Apache Spark für Real-Time Analysen die Events in Zeitfenster einteilen und auswerten (siehe Zeit im Big Data Stream Processing).

Verlangt unser Use Case, dass gewisse Events in der richtigen Reihenfolge aus der Queue gelesen werden, dann haben wir bei Apache Kafka die folgenden Möglichkeiten:

5.1 Beim Senden der Events die Partition angeben

Diese Variante sollte mit Bedacht angewendet werden. Immerhin gibt es eine ganze Reihe verschiedener Partitioner-Algorithmen, die genau für diesen Zweck geschrieben wurden.

5.2 Mit nur einer Partition arbeiten

Damit sind wir auf der sicheren Seite: Wo nichts aufgeteilt wird, gerät nichts durcheinander. Doch wir verlieren die Möglichkeit, die Daten auf mehrere Broker zu verteilen und damit die Menge insgesamt zu skalieren.

5.3 Mit Keys arbeiten

Im Code-Beispiel oben, enthielt der Send-Befehl nur ein Value um die Variable zu benennen, in der die zu sendenden Daten hinterlegt sind. Der Send-Befehl kann auch einen Key enthalten. Dabei handelt es sich nicht um einen Primary-Key, sondern lediglich um ein Merkmal, das den Value indentifiziert.

Der Primary-Key könnte beispielsweise eine Konto-Nummer sein. Der zugehörende Value könnte die Veränderungen auf dem Konto enthalten. Für jede Veränderung auf dem Konto wird ein Event ins Topic geschrieben. So können wir die Veränderungen nachverfolgen – immerhin haben sie alle denselben Key, werden in dieselbe Partition geschrieben und erscheinen demnach in der historischen Reihenfolge.

Der Partitioner serialisiert zuerst den Key und bildet danach einen Hash-Wert bilden, dessen Ergebnis die Partition bezeichnet. Damit erwirken wir, dass alle Events mit demselben Key auf ein und dieselbe Partition geschrieben werden und das unter Einhaltung der Reihenfolge ihres Eintreffens. Eine Partition kann für mehrere Keys zuständig sein.

Damit erreichen wir eine sinnvolle Reihenfolge in Bezug auf ein Kriterium: Beispielsweise in Bezug auf die Messdaten eines einzelnen Sensors, wenn die SensorID als Kafka-Key dient.

Die Gefahr besteht, dass die Partitionen ungleichmäßig ausgelastet werden und damit die Consumer der nachfolgenden Komponente (z.B. Apache Spark) ungleichmäßig ausgelastet werden.

Mit Keys arbeiten ist auch sinnvoll, wenn zusätzlich die Topic Partitionen compacted werden. Bei der Compaction bleibt jeweils das jüngste Element eines Keys erhalten und die älteren werden gelöscht. Eine sinnvolle Art Daten mit relativ wenigen unterschiedlichen Keys in Topics zu verwalten.

6 Fazit

Apache Kafka gibt eine Ordering Guarantee ab. Gleich wie andere verteilte Event-Hubs kann diese Garantie nur in Bezug auf eine Partition abgegeben werden.

Durch die Wahl eines Keys kann die Reihenfolge der Events im Topic in Bezug auf den Key garantiert werden.

  • Data Engineering ist ja nicht Selbstzweck. Vielmehr dient es dazu, aus Daten Nutzen zu ziehen. Künstliche Intelligenz wurde möglich, dank sorgfältigem Data Engineering.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Chatbot als Lernassistent
  • Prompt Engineering Personas und Wiederholungen
  • AI-Engineering-Fachglossar
  • EBook Tutorial: Cluster aus virtuellen Maschinen
  • Ebook: Apache ZooKeeper
  • Ebook: Realtime Streaming Pipelines
  • LSM-Trees: Log Structured Merge Trees
  • Aufbau einer Enterprise Search
  • Zeit Stream Analytics
  • B-Tree-Index in Datenbanken
  • Ordering Guarantee in Apache Kafka
  • CAP Theorem
  • MapReduce Funktionale Programmierung
  • Konzepte des HDFS
  • Optimistisches Concurrency Control

[easy-social-share]

Credits:

(c) Video und Quiz: Tirsus GmbH / Ursula Deriu

Veröffentlicht am Schreib einen Kommentar

Evaluation: Ab wann lohnt sich Big Data?

Evaluation-Big-Data

Evaluation: Ab wann lohnt sich Big Data?

Die Antwort auf die Frage muss differenziert erfolgen. Dieser Artikel erläutert die wichtigsten Eigenschaften von “Big Data” und zeigt wichtige Kriterien, um zu entscheiden, ob eine Big-Data-Evaluation sinnvoll ist. Eine Liste minimaler Skills, um Big Data zielgerichtet evaluieren zu können, rundet den Katalog ab.

Eines sei vorweggenommen: Big-Data Technologien funktionieren bestens auch für überschaubare Datenbestände.

1 Begriffsklärung: Was ist Big Data überhaupt?

Seit Jahren dominiert die folgende Definition:

Recherche-Ergebnis bei Google am Ende März 22. Auch 20 Jahre nach dem Aufkommen der Definition 'Big Data = 3V' ist diese noch immer allgegenwärtig.

Eigentlich ist das keine Definition sondern ein Vergleich: Datensätze, die größer und komplexer sind und vor allem aus neuen Datenquellen stammen.

Natürlich drängen sich jetzt die folgenden Fragen auf:

  • Wie groß muss ein Datensatz sein, damit ich mich mit Big Data befassen muss?
  • Wie komplex muss ein Datensatz sein, um auf Big Data zu setzen?
  • Und was sind schon ‘neue Datenquellen’?

Diese Definition stammt aus einem Blog-Post bei Gartner aus dem Jahr 2002 und seither ist die Definition: ‘Big Data – das sind die 3V’ überall anzutreffen. Doch sie definiert nicht, sie verwirrt.

Als die Definition entstand, standen die damit gemeinten ‘neuen Datenquellen’ und ‘innovativen Technologien’ noch ganz am Anfang. 

Jetzt, nach 20 Jahren, wissen wir mehr: Ich definiere den Begriff Big-Data neu:

Der Begriff ‘Big Data’ bezeichnet Methoden zur Speicherung, Abfrage, Verarbeitung und Analyse von Daten mit Hilfe von verteilten und horizontal skalierbaren Systemen.

2 Was ist ein verteiltes, horizontal skalierbares System?

Wikipedia bringt es auf den Punkt:

Horizontale Skalierung bedeutet die Steigerung der Leistung eines Systems durch das Hinzufügen zusätzlicher Rechner/Knoten. Die Effizienz dieser Art der Skalierung ist jedoch stark von der Implementierung der Software abhängig, da nicht jede Software gleich gut parallelisierbar ist.

Wir brauchen also speziell geschriebene, parallelisierbare Software, um überhaupt horizontal skalieren zu können. Big Data Tools weisen genau diese Eigenschaft auf. Reicht der Festplattenplatz nicht mehr, dann erweitern wir das Cluster um weitere Rechner.

Die eingangs gestellten Fragen formulieren wir um:

  • Wie groß muss ein Datensatz sein, damit sich ein horizontal skalierendes System zu dessen Analyse lohnt?
  • Wie komplex muss ein Datensatz dazu sein?
Big Data Systeme skalieren horizontal

Ausgehend von einem einzelnen System (links) werden weitere Systeme hinzugefügt, so dass ein Cluster von drei (Mitte) resp. sechs (rechts) Rechnern entsteht. Jeder der Rechner besteht aus CPU, RAM, Festplatte etc. Das Cluster als Gesamtsystem verhält sich dem Anwender gegenüber nicht anders, als das Ausgangssystem links. So wird Daten- und Rechenlast auf mehrere Rechner verteilt.

3 Evaluationskriterium: Größe der Datasets

Die erste Frage ist einfach zu beantworten:

Es gibt keine Grenze nach unten und es gibt keine Grenze nach oben:

Horizontal skalierbare Analytics-Systeme funktionieren auf einem Cluster aus Raspberry Pi genauso wie auf einem Cluster, der ein ganzes RZ füllt.

Um die Frage der Größe der Datasets zu beantworten, müssen wir zwischen OLAP-Systemen und OLTP-Systemen, also zwischen Online Analytical Processing und Online Transaction Processing.

3.1 Big Data OLTP-Systeme

OLTP-Systeme sind Datenbank-Systeme, und übernehmen dabei sowohl die Organisation der Datenhaltung als auch die Organisation des schnellen Schreibens und Lesens. Die Antwortzeiten liegen im ms-Bereich.

NoSQL-Datenbanken werden gerne eingesetzt und viele sind in der Lage, in Bezug auf die Datenhaltung auf mehrere Nodes zu skalieren.

Bei OLTP-Systemen stellt sich zusätzlich die Frage nach der Art der Transaktionen. Skaliert das System horizontal, dann verändert sich das Transaktionsverhalten.

Besonders heikel ist dabei oft der Trade-Off zwischen Hochverfügbarkeit, Konsistenz und Fehlertoleranz des Systems.

Wer relationale Datenbanken gewohnt ist, und in einem horizontal skalierbaren System nach den ACID-Transaktionseigenschaften sucht, muss eine bittere Pille schlucken: diese Systeme sind nicht gefeit vor einem Teilausfall. Fällt also ein einzelner Node im Cluster aus, dann wird unter Umständen das Gesamtsystem blockiert.

Für die horizontale Skalierbarkeit müssen die Transaktionseigenschaften gelockert werden. Moderne horizontal skalierbare Datenbanken erlauben oft die Wahl der Art der Transktionseigenschaften für einzelne Transaktionen. Sicher ein Evaluationskriterium, wenn es um Big-Data-OLTP-Systeme geht.

Wann lohnt es sich überhaupt ein OLTP-Big Data weiter zu evaluieren? 

Da gibt es sicher eine Schmerzgrenze: nämlich da, wo das bisher eingesetzte System wegen zu großer Datenlast seinen Dienst versagt.

Die Datenlast kann daraus resultieren, dass das Volumen der Daten das eingesetzte System überfordert oder aber auch daran, dass das eingesetzte System für die Struktur der Daten nicht geeignet ist. Beispielsweise eignen sich relationale Datenbanken nicht für effizientes Handhaben von Graph-Daten. Dazu wird man spezielle Graph-Datenbanken evaluieren.

Die Menge der Daten ist von der Struktur der Daten unabhängig zu evaluieren. Liegen die Daten in unserem Beispiel nicht nur in Form von Graphen vor sondern zusätzlich auch in sehr großen Mengen, dann evaluieren wir horizontal skalierbare Graph-Datenbanken.

3.2 Big Data OLAP-Systeme

Wichtig ist: Big-Data-Technologien eignen sich nicht, für die Verwaltung vieler kleiner Files. Beispielsweise für viele Word-Dokumente. Sie wurden gebaut, um sehr große Files zu speichern und zu analysieren.

Nur zu Ausbildungs- und Testzwecken ist die Analyse kleiner Files sinnvoll. In der Produktion aber nicht. Hintergrund: Ein verteiltes Filesystem, wie das Hadoop Distributed Filesystem (HDFS), unterteilt einzelne Files in Blöcke von 128MB (der Wert wird konfiguriert und soll hier zur Illustration dienen). Ein Big-Data-File sollte also viele solcher Blöcke umfassen. Man beachte, dass durchaus auch Blockgrößen von 256MB oder gar 512MB konfiguriert werden, oder auch 64MB.

Das Evaluationskriterium umformuliert:

OLAP Big-Data-Technologien sind geeignet für Files, die in viele Blöcke von 128MB aufgeteilt werden.

Beispiele für solche Files:

  • Suchmaschinenindexe (der Ursprung der Big-Data-Technologien bei Google)
  • Die Menge aller Messungen in einer IoT-Anwendung
  • Log-Files einer Serverfarm
  • Daten eines Data Warehouses

Wann lohnt es sich überhaupt ein OLAP-Big Data weiter zu evaluieren? 

Da gibt es sicher eine Schmerzgrenze: nämlich da, wo das Data Warehouse zu langsam wird. Oder die bisherige Datenanalyse einfach zu lange läuft.

In einem neuen Projekt würde ich abwägen, ob eine derartige Datenmenge erwartet wird. Falls ja, dann würde ich Big-Data-Tools evaluieren.

4 Evaluationskriterium: Kosten-Nutzen

Die Frage nach der Größe der Datensätze wird jetzt also umgemünzt in die Frage nach dem Einsatz der Tools und der Art der Infrastruktur.

  • Wann lohnen sich Big-Data-Tools?
  • Wann lohnt sich Big-Data-Infrastruktur?

Die Kosten-Nutzen Analyse möchte ich nicht beantworten, sondern einen Katalog an typischen Kostenfaktoren zusammenstellen, die beim Bau und Betrieb eines Big-Data-Systems besonders relevant sind:

Liste typischer Kostenfaktoren:

4.1 Evaluationskriterium: Art der Lizenz

Keine Lizenzkosten zahlen ist natürlich verlockend. Wer A sagt muss auch B sagen: Sich 100% auf Open Source zu verlassen, bedeutet die Software 100% selbst in Betrieb zu nehmen und zu warten.

Hinter vielen Open-Source Tools steht eine Community von Software-Engineers, die diese Projekte weiterentwickeln. Gerade bei der ASF (Apache Software Foundation) wird großer Wert darauf gelegt, dass die Projekte von einer aktiven Community betreut werden.

Doch wie werden diese Software-Engineers bezahlt? Die Frage stellt sich, gerade weil sie das Ergebnis ihrer Arbeit kostenlos zur Verfügung stellen. Wir beobachten verschiedene Muster:

  • Bezahlter Day-Job bei einem Unternehmen und Entwicklung am Open Source Projekt in der Freizeit. Das ist wahre Leidenschaft.
  • Bezahlter Day-Job bei einem Unternehmen, das den Entwicklern die Möglichkeit bietet, zu einem Open Source Projekt beizutragen, ohne dass dem Unternehmen ein Nutzen entsteht. Förderung der Mitarbeiterzufriedenheit.
  • Das Big-Data-Tool wird von einem Unternehmen für eigene Zwecke entwickelt und eingesetzt. Später spendet das Unternehmen die Software der Open-Source Community gespendet. Das Unternehmen selbst entwickelt das Tool mit eigenen Leuten weiter und begrüßt auch externe Entwickler in der Community. Damit fließt weiteres Know-How ein.
  • Gerade beim vorherigen Muster ist zu beobachten, dass sich eine Gruppe der Entwickler im bestem Einvernehmen mit dem ursprünglichen Unternehmen als eine Art Spin-Off selbständig macht und das Projekt mit der neuen eigenen Firma und der erweiterten Community weiterentwickelt. Zusätzlich entstehen dann kommerzielle Ergänzungen zum Open Source Tool und eine rege Beratertätigkeit. Das trifft beispielsweise zu auf Apache Kafka (heute Confluent – ursprünglich LinkedIn), Apache Spark (heute Databricks, ein Spin-Off der University of California at Berkeley).

Gerade bei diesem letzten Modell sehen wir, dass die Frage ‘Open Source vs kommerzielle Software’ nicht einfach mit ja oder nein zu beantworten ist. Die Ergänzungen zum Open Source Tool könnten ja durchaus ihren Wert für unser Projekt haben. Meistens handelt es sich um zusätzliche Features, die das Leben erleichtern.

4.2 Evaluationskriterium: Personalkosten


Letztendlich ist das eine strategische Frage:

  • Eigenes Personal muss rekrutiert oder ausgebildet werden (siehe Skill-Liste).
  • Die Neueingestellten müssen erst gefunden und dann eingearbeitet werden – ein Kostenfaktor.
  • Das bestehende Personal muss erst ausgebildet werden – ebenfalls ein Kostenfaktor.
  • Auch der Dienstleister muss sich zuerst mit dem Projekt vertraut machen – ebenfalls ein Overhead.
  • Der Dienstleister kann auch als Berater und Trainer für das eigene Personal hinzugezogen werden. Möglicherweise eine lohnenswerte Option.

4.3 Evaluationskriterium: Art der Infrastruktur

Der zweite Aspekt der Kosten-Nutzen-Frage bezieht sich auf den Ort der Infrastruktur. Mittlerweile haben wir die Wahl: On-Premises bedeutet, wir bauen die Infrastruktur in den eigenen Räumen auf, oder wir schließen einen Vertrag mit einem RZ-Dienstleister ab, oder wir profitieren von einem Cloud-Angebot. Im folgenden werden die drei Möglichkeiten näher vorgestellt.

4.3.1 On Premises

Entscheiden wir uns für On-Prem, dann bauen wir ein eigenes RZ auf.  Vielleicht sind die Daten derart sensibel, dass kein Weg daran vorbei führt. Dabei kaufen wir nicht nur die Rechner selbst ein, installieren und unterhalten diese, sondern wir sorgen auch für die passenden Räumlichkeiten. Diese können wir auch bei einem RZ-Dienstleister beziehen.

4.3.2 RZ-Dienstleister

Statt ein eigenes RZ aufzubauen, kann ja ein Anbieter für RZ-Dienstleistungen Hilfe erbringen. Diese übernehmen den Aufbau des RZ selbst. Beispiele aus dem Dienstleistungskatalog

  • Gebäude,
  • Sicherheit des Gebäudes,
  • Brandschutz,
  • Zugangskontrolle,
  • unterbruchsfreie Stromversorgung,
  • Kühlung,
  • performante Internetanbindung, Sicherheit dieser Anbindung,

Bei einigen Anbietern kann man die Server selbst beschaffen und der Anbieter baut sie in seinem RZ ein. Oder er vermietet seine eigenen Server. Mittlerweile gibt es eine Vielzahl von Geschäftsmodellen.

4.3.3 Cloud-Lösung

Oder aber wir ziehen einen Cloud-Anbieter vor, der auch die Software selbst auf seinen eigenen Rechnern installiert, überwacht und upgradet. Dort mieten wir Rechenzeit und Speicherkapazität. Wir können uns auf das Kerngeschäft konzentrieren. Das tönt verlockend.

Wer die Angebote im Hinblick auf die zu erwartenden Kosten vergleichen möchte, ist konfrontiert mit fehlenden Standards. Jeder Cloud-Anbieter schnürt eigene Pakete und verwendet ein eigenes Wording. Man wird nicht umhin kommen, Accounts bei den jeweiligen Anbietern zu erstellen und die Angebote besser kennen zu lernen, insbesondere auch, um das Wording zu verstehen.

Solche Einsteiger-Accounts sind in der Regel kostenlos – die Hürden werden niedrig gehalten. Gleichzeitig erhält man einen Eindruck von der Usability und über die Dokumentation. Selbstverständlich bieten die Cloud-Anbieter auch Schulungsprogramme an, bis hin zur jeweiligen Zertifizierung.

4.3.4 Zusätzliche Kriterien zur Evaluation der Cloud-Infrastruktur

Ein wichtiges Kriterium darf bei der Evaluation der Infrastruktur dabei nicht fehlen:

Welches Wachstum der Datenmenge sehen wir voraus?

Die Einstiegshürden werden sehr tief gehalten, doch mit welchen Kosten ist in Zukunft zu rechnen?

Auch eine zweite Frage gehört unbedingt in den Evaluationskatalog: Wie einfach ist es, die erwartete große Datenmenge zu einem anderen Cloud-Anbieter zu transferieren?

Es könnte ein böses Erwachen folgen – die Wahl ist mit offenen Augen zu treffen.

5 Evaluationskriterium: Komplexität der Daten

Wir erinnern uns: In der Definition ‘Big Data = 3V’ steht eines der V für Variety, also komplexität der Daten.

Manchmal ist auch die Rede von ‘unstrukturierten’ Daten. Je unstrukturierter, desto komplexer, könnte man meinen.

Ist denn die Struktur in relationalen Datenbanken komplex? Viele werden die Frage bejahen und dann relationale Datenbanken doch nicht in die Big-Data-Welt verorten wollen.

Sind denn Dokumente, die Texte in natürlicher Sprache enthalten, unstrukturiert? Viele werden auch diese Frage bejahen und doch können gerade Suchmaschinen wie Google sehr viel Struktur in solchen Dokumenten erkennen.

Ich würde die Komplexität der Datenstrukturen nicht als primär identifizierendes Merkmal für den Einsatz von Big-Data-Technologien sehen. Die Landschaft der horizontal skalierenden Tools ist sehr vielfältig. Für die Handhabung vieler Datenstrukturen gibt es viele Tools:

Beispiel  Apache Spark: Dieses ist sehr vielseitig und bietet APIs für die folgenden Anwendungsfälle:

  • Tabellenartige Daten, wie CSV  (Spark SQL, Spark Dataframes/Datasets, Parquet, ORC, AVRO)
  • Beliebig strukturierte Daten wie Text, Bilder etc (Spark MLib)
  • Netzwerkartige Daten (Spark GraphX)
  • Real-Time Analysen

Als die Definition ‘Big Data = 3V’ entstand, sah man, dass Google mit riesigen Mengen von scheinbar unstrukturierten Texten gut zurecht kam. Zudem kamen immer mehr NoSQL-Datenbanken auf, die spezialisiert waren, auf unterschiedliche Strukturen von Daten. Die künstliche Intelligenz schlummerte gerade wieder in einem Winterschlaf und begann sich angesichts dieser Entwicklungen zu regen. All diese Aspekte flossen ein in die 3V, die damals innovativ waren. Das ist überholt, auch im Hinblick auf die verarbeitbare Komplexität der Daten.

In den zwanzig Jahren seit der Definition Big-Data = 3V entstand das Fachgebiet der Data Science.

5.1 Verfeinerte Fragestellung: Benötigen wir Data Science?

Und man sollte sich bei der Evaluation die Frage stellen, ob für die Analyse der Daten Künstliche Intelligenz (KI), Machine Learning also die Methoden der Data Science notwendig sind? Falls die Frage bejaht wird, dann gehört dieser Aspekt mit in den Evaluationskatalog der einzusetzenden Big Data Tools.

So wie in den vergangenen zehn Jahren der Begriff ‘Data Science’ an Form gewann, so schärft sich in der aktuellen Debatte der Begriff ‘Data Engineering’.

Ich sehe Big Data als eine Facette des Data Engineerings. Data Scientisten bedienen sich gerne großer Datenmengen und benötigen Data-Engineering Skills.

Ein Data Engineer wird ein fertiges KI-Modell in Betrieb nehmen.

Skills-Big-Data-Engineer-vs.Data-Scientist
Big Data für Data Engineers und Data Scientists.

Die Tabelle grenzt ab zwischen den Tätigkeitsfeldern des (Big-)-Data-Engineers und des Data Scientisten. Die Evaluation der Big-Data-Tools gehört also ins Tätigkeitsfelds des (Big-)Data-Engineers.

Das folgende Kapitel zeigt eine Übersicht über die Skills und Kenntnisse die Data-Engineers benötigt, um Big-Data-Tools zu evaluieren.

[/vc_row_inner]

6 Minimale Skills um Big Data Tools zu evaluieren

Um die Tools bei deren heutigem Reifegrad erfolgreich einzusetzen, ist eine gute, fundierte Grundausbildung als Informatiker wichtig. Folgende Aspekte gehören unbedingt dazu:

  • Kenntnisse in Python, insbesondere Funktionale Programmierung. Java oder Scala Grundkenntnisse.
  • Gute SQL-Kenntnisse – diese Sprache wird in vielen Tools eingesetzt. Und damit einhergehend Kenntnisse des relationalen Datendesigns. Big-Data-Tools sind nicht relational, doch sind Kenntnisse der Denkweise und des Wording aus der relationalen Welt sehr hilfreich.
  • Netzwerk Grundkenntnisse: Die Rechner werden zu einem Cluster vernetzt und so sind Grundkenntnisse aus dem Netzwerkbereich ein Muss.
  • Linux Grundkenntnisse: Linux ist das Server-Betriebssystem der Big-Data Welt.
  • Kenntnisse gängiger Architekturen, und zwar
    • Architekturen verteilter Systeme,
    • Architekturen von Big-Data-Pipelines, und Data Lakes.
  • Kenntnisse der Trade-Offs verteilter Systeme und damit einhergehend, Kenntnisse über die Organisation verteilter Transaktionen.
  • Kenntnisse gängiger Maßnahmen bei der Optimierung von Datenabfragen in Datenbanken und Big-Data-OLAP Systemen.
  • Kenntnisse gängiger Muster von NoSQL-Datenbanken.
  • Von enormem Vorteil ist es, wenn man vor der Evaluation das eine oder andere System Hands-On kennengelernt hat. Das ermöglicht es, das evaluierte Tool einzuordnen. Dazu eignen sich Open Source Tools bestens.
  • Grundkenntnisse der Data Science, also des Machine Learnings. Es gilt zu evaluieren, ob gewisse Fragestellungen mit KI lösbar sein könnten.
  • Kenntnisse gängiger Maßnahmen bei der Optimierung von Datenzugriffen.

Dieser Katalog stellt auch das minimale Skill-Set eines Data Engineers dar.

  • Data Engineering ist ja nicht Selbstzweck. Vielmehr dient es dazu, aus Daten Nutzen zu ziehen. Künstliche Intelligenz wurde möglich, dank sorgfältigem Data Engineering.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Chatbot als Lernassistent
  • Prompt Engineering Personas und Wiederholungen
  • AI-Engineering-Fachglossar
  • EBook Tutorial: Cluster aus virtuellen Maschinen
  • Ebook: Apache ZooKeeper
  • Ebook: Realtime Streaming Pipelines
  • LSM-Trees: Log Structured Merge Trees
  • Aufbau einer Enterprise Search
  • Zeit Stream Analytics
  • B-Tree-Index in Datenbanken
  • Ordering Guarantee in Apache Kafka
  • CAP Theorem
  • MapReduce Funktionale Programmierung
  • Konzepte des HDFS
  • Optimistisches Concurrency Control