Technologie

Kafka 101 Tutorial - Real-Time-Dashboarding mit Druid und Superset

10. Mai 2023

Button Github Button Linkedin Button Twitter


💡 Einführung

In diesem neuen Blogbeitrag (oder GitHub-Repository) bauen wir auf allem auf, was wir bisher in dieser Kafka 101 Tutorial-Serie gesehen haben, nämlich:

  1. Kafka Infrastructure
  2. Kafka Producer
  3. Flink Infrastructure

und wir werden sehen, wie wir unsere Streaming-Daten in eine echtzeitfähige Datenbank, Apache Druid, einfließen lassen können! Darüber hinaus werden wir sehen, wie wir die Daten, die wir erzeugen (entweder aus unserem Rohdatenstrom oder unserem Flink-aggregierten Strom), mithilfe von echtzeitfähigen Dashboards, die von Apache Superset unterstützt werden, visualisieren können. Beachten Sie, dass wir bisher nur Apache-Technologien verwenden. Das liegt daran, dass wir uns für die Open-Source-Community 🤗 engagieren.

Die beiden neuen Dienste, die wir in diesem Artikel vorstellen, sind etwas weniger bekannt als das, was wir bisher verwendet haben, daher werde ich sie nur kurz vorstellen.

🧙‍♂️ Apache Druid

Druid is a high performance, real-time analytics database that delivers sub-second queries on streaming and batch data at scale and under load.

  • Druid ist ein spaltenorientierter Datenspeicher, was bedeutet, dass Daten spaltenweise und nicht zeilenweise gespeichert werden. Dadurch ermöglicht es eine effiziente Komprimierung und schnellere Abfrageleistung.
  • Druid ist auf OLAP (Online Analytical Processing) Abfragen optimiert, was bedeutet, dass es für komplexe Abfragen auf großen Datensätzen mit geringer Latenzzeit ausgelegt ist.
  • Druid unterstützt sowohl die Stapelverarbeitung als auch die Echtzeit-Datenübernahme, sodass es sowohl historische als auch Streaming-Daten verarbeiten kann.
  • Druid enthält eine SQL-ähnliche Abfragesprache namens Druid SQL, mit der Benutzer komplexe Abfragen gegen ihre Daten schreiben können.
  • Druid integriert sich mit einer Vielzahl anderer Datenverarbeitungs- und Analysetools, darunter Apache Kafka, Apache Spark und Apache Superset.

♾ Apache Superset

Apache Superset ist eine moderne, Open-Source-Business-Intelligence-(BI)-Plattform, die es Benutzern ermöglicht, ihre Daten in Echtzeit zu visualisieren und zu erkunden.

Superset is fast, lightweight, intuitive, and loaded with options that make it easy for users of all skill sets to explore and visualize their data, from simple line charts to highly detailed geospatial charts.

  • Superset wurde ursprünglich von Airbnb entwickelt und später als Open Source an die Apache Software Foundation gespendet.
  • Superset ist darauf ausgelegt, eine Vielzahl von Datenquellen anzubinden, darunter Datenbanken, Data Warehouses und Big Data-Plattformen.
  • Superset umfasst eine webbasierte GUI, mit der Benutzer Diagramme, Dashboards und Datenvisualisierungen mithilfe einer Drag-and-Drop-Oberfläche erstellen können.
  • Superset bietet eine Vielzahl von Visualisierungsoptionen, darunter Balkendiagramme, Liniendiagramme, Scatterplots, Heatmaps und geografische Karten.
  • Superset enthält eine Reihe von integrierten Funktionen für die Datenexploration und -analyse, darunter SQL-Editoren, Tools zur Datenprofilerstellung und interaktive Pivot-Tabellen.

🐳 Anforderungen

Um dieses Projekt zum Laufen zu bringen, benötigen Sie lediglich minimale Voraussetzungen: Sie müssen Docker und Docker Compose auf Ihrem Computer installiert haben.

Die Versionen, die ich für den Aufbau des Projekts verwendet habe, sind:

1
2
3
4
5
6
7
## Docker
docker --version
> Docker version 23.0.6, build ef23cbc431

## Docker Compose
docker-compose --version
> Docker Compose version 2.17.3

Falls Ihre Versionen unterschiedlich sind, sollte das kein großes Problem darstellen. Es könnte jedoch vorkommen, dass einige der folgenden Schritte Warnungen oder Fehler verursachen, die Sie selbst beheben müssen.

🏭 Infrastruktur

Um alles zum Laufen zu bringen, müssen Sie den gesamten Producer-Teil (das Repository aus dem vorherigen Artikel) sowie Druid und Superset zum Laufen bringen. Gehen Sie dazu wie folgt vor:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
## Clone the repo
git clone https://github.com/theodorecurtil/flink_sql_job.git

## cd into the repo
cd flink_sql_job

## docker-compose the infra
docker-compose up -d

## go back to previous level
cd ..

## Clone the new repo
git clone git@github.com:theodorecurtil/real_time_dashboarding.git

## cd into the repo
cd real_time_dashboarding

## start the infrastructure
./start.sh

⚠ Es kann sein, dass Sie das Skript start.sh erst ausführbar machen müssen, bevor Sie es ausführen dürfen. Wenn dies der Fall ist, geben Sie einfach den folgenden Befehl ein:

1
chmod +x start.sh

Der Druid docker-compose-Datei geht davon aus, dass der Kafka-Cluster im Docker-Netzwerk flink_sql_job_default läuft. Dies sollte der Fall sein, wenn Sie das Repository flink_sql_job geklont und die Infrastruktur mit den zuvor aufgeführten Befehlen gestartet haben. Andernfalls passen Sie einfach die Verweise auf das Docker-Netzwerk flink_sql_job_default in der docker-compose-Datei an.

Überprüfung der Funktionsfähigkeit

Um zu überprüfen, ob alle Dienste ausgeführt werden (Sie werden feststellen, dass jetzt viele Docker-Container ausgeführt werden), besuchen Sie die folgenden URLs und überprüfen Sie, ob alle Benutzeroberflächen ordnungsgemäß geladen werden:

  1. Kafka: http://localhost:9021
  2. Flink: http://localhost:18081
  3. Druid: Benutzername ist druid_system und das Passwort lautet password2 http://localhost:8888
  4. Superset: Benutzername ist admin und das Passwort lautet admin http://localhost:8088

Sie sollten etwas Ähnliches sehen wie:

Druid, Confluent, Flink and Superset User Interfaces

Die Beziehung zwischen allen Diensten wird mit dem folgenden Flussdiagramm veranschaulicht.

Diagram of the streaming analytics infrastructure

In den folgenden Abschnitten werden wir sehen, wie wir die Stream-Einbindung von Apache Druid aus unserem Kafka-Cluster einrichten und dann Druid mit Superset verknüpfen, um Echtzeit-Dashboards zu erstellen!

🌀 Druid Streaming-Datenübernahme

Der Kafka-Producer, den wir gestartet haben, erzeugt Nachrichten im Topic SALES. Dabei handelt es sich um künstlich erzeugte Verkaufsvorgänge, die jede Sekunde mit dem folgenden Schema erzeugt werden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
    "type": "record",
    "name": "StoreSale",
    "namespace": "com.acosom",
    "fields": [
        {
            "name": "store_id",
            "type": {
                "type": "string",
                "avro.java.string": "String"
            },
            "doc": "ID of the store where the sale was made."
        },
        {
            "name": "sale_amount",
            "type": "int",
            "doc": "Amount of the sale in local currency. This value is an integer."
        },
        {
            "name": "sale_ts",
            "type": "long",
            "doc": "Epoch timestamp when the sale happened."
        }
    ]
}

Als Erstes werden wir Druid mit unserem Kafka-Cluster verbinden, um die Streaming-Einbindung dieses Topics zu ermöglichen und die Daten in unserer Echtzeitdatenbank zu speichern.

Wir werden dies über die Benutzeroberfläche von Druid unter http://localhost:8888 durchführen. Im Folgenden zeigen wir schrittweise, wie Sie die Streaming-Spezifikation erstellen können. Beachten Sie jedoch, dass die Spezifikation einfach über die REST-API von Druid als JSON gepostet werden kann.

Entwurf der Stream-Datenübernahmespezifikation

Der erste Schritt besteht darin, auf die Schaltfläche Load data zu klicken und die Option Streaming auszuwählen.

Building a Druid streaming spec

Wählen Sie dann Start a new streaming spec, um unsere benutzerdefinierte Streaming-Spezifikation zu erstellen.

Building a Druid streaming spec

Sobald dies erledigt ist, wählen Sie Apache Kafka als Quelle aus.

Building a Druid streaming spec

Schreiben Sie anschließend die Adresse des Kafka-Brokers und den Namen des Topics und klicken Sie auf “Konfiguration anwenden”. Auf der linken Seite sollten Sie dann Beispieldatenpunkte aus unserem Topic SALES sehen. Beachten Sie, dass die Daten nicht deserialisiert sind, da dies die Rohdaten sind, die von Kafka stammen. Wir müssen den Avro-Deserializer hinzufügen. Klicken Sie dazu auf die Schaltfläche Edit spec.

Building a Druid streaming spec

In der Spezifikationskonfiguration fügen Sie bitte Folgendes hinzu (danke Hellmar):

1
2
3
4
5
6
7
8
"inputFormat": {
"type": "avro_stream",
"binaryAsString": false,
"avroBytesDecoder": {
    "type": "schema_registry",
    "url": "http://schema-registry:8081"
    }
}

Klicken Sie dann auf die Schaltfläche Parse data, um zur Bearbeitung der Spezifikation zurückzukehren.

Building a Druid streaming spec

Jetzt sollten Sie sehen, dass unsere Daten ordnungsgemäß deserialisiert werden! Klicken Sie auf die Schaltfläche Parse time, um fortzufahren.

Building a Druid streaming spec

Von nun an gibt es nicht viel mehr zu bearbeiten. Klicken Sie einfach durch die Panels, bis die Streaming-Spezifikation übermittelt wird. Die Benutzeroberfläche von Druid leitet automatisch zur Registerkarte Ingestion weiter, auf der Sie Folgendes sehen sollten, was darauf hinweist, dass Druid erfolgreich von Kafka verarbeitet wird.

Building a Druid streaming spec

Schließlich können Sie überprüfen, ob die Daten ordnungsgemäß in Druid geladen wurden, indem Sie zur Registerkarte Query wechseln und eine Testabfrage durchführen. Hier sehen Sie ein Beispiel:

Building a Druid streaming spec

🎉 Die Stream-Einbindung ist eingerichtet und Druid wird nun weiterhin auf das Kafka-Topic SALES hören.

🖼 Datenvisualisierung in Superset

Nun, da die Daten erfolgreich in unsere Streaming-Datenbank eingefügt werden, ist es an der Zeit, unser Dashboard zu erstellen, um die Verkäufe dem Management zu berichten!

Navigieren Sie zur Superset-Benutzeroberfläche unter localhost:8088.

Das Erste, was wir tun müssen, ist, unsere Druid-Datenbank mit Superset zu verbinden. Klicken Sie dazu auf die Schaltfläche + in der oberen rechten Ecke und wählen Sie Data und Connect database. Folgen Sie dann den unten angezeigten Schritten. Beachten Sie, dass der Verbindungszeichenfolge Folgendes enthält:

  1. Datenbanktyp: druid
  2. Datenbankanmeldeinformationen: druid_system und password2
  3. Datenbank-SQL-Endpunkt: 172.18.0.1:8888/druid/v2/sql

Da Superset nicht im selben Docker-Netzwerk wie die anderen Dienste läuft, müssen wir darauf über den Host zugreifen. Dies hängt von Ihrem Betriebssystem ab. Siehe Superset-Dokumentation.

Im Wesentlichen gelten die folgenden Einstellungen:

  1. host.docker.internal für Mac- oder Ubuntu-Benutzer
  2. 172.18.0.1 für Linux-Benutzer

Connect Druid to Superset

Dashboard erstellen

In Superset besteht ein Dashboard aus Charts. Daher ist der erste Schritt die Erstellung eines Charts. Um ein Chart zu erstellen, müssen wir ein Dataset-Objekt erstellen. Klicken Sie auf die Schaltfläche Dataset und folgen Sie den untenstehenden Schritten, um ein Dataset aus dem SALES-Topic zu erstellen.

Create Superset Dataset

Create a time-series area chart from the SALES dataset and add a couple of configurations to the chart, as shown below. Then save the Chart and add it to a new Dashboard.

Erstellen Sie ein Zeitreihenflächendiagramm aus dem “SALES”-Dataset und fügen Sie dem Diagramm einige Konfigurationen hinzu, wie unten dargestellt. Speichern Sie dann das Chart und fügen Sie es einem neuen Dashboard hinzu.

Create Superset Chart

Create Superset Dashboard

Sie werden feststellen, dass das von uns erstellte Superset-Chart die 1-Minuten-Aggregation durchführt, die auch unser Flink-Job durchführt. Lassen Sie uns nun direkt die aggregierten Daten von Apache Flink verarbeiten und sehen, ob beide Aggregationen die gleichen Zahlen anzeigen.

Die Schritte, die Sie befolgen sollten:

  1. Starten Sie den Flink-Job.
  2. Schreiben Sie die Streaming-Spezifikation vom neuen Topic in Druid.
  3. Erstellen Sie ein neues Chart in Superset und fügen Sie es dem Dashboard hinzu.

Um den Flink-Aggregationsjob zu starten, der aggregierte Verkäufe pro Geschäft pro 1-Minuten-Fenster berechnet, geben Sie die folgenden Befehle ein:

1
2
3
4
5
6
7
8
## Docker exec in the container
docker exec -it sql-client bash

## Start the Flink job
sql-client.sh -f sales-aggregate.sql

## Exit container
exit

Sie werden feststellen, dass vom Flink-Job ein neues Topic namens SALES_AGGREGATE in Kafka erstellt wurde.

Wiederholen Sie nun die Vorgänge in Bezug auf Druid und Superset, um die Daten in Druid einzufügen und das Chart in Superset zu erstellen.

Siehe das folgende Dashboard:

Superset Dashboard

Wie erwartet sind die beiden Charts identisch, da dieselbe Aggregation durchgeführt wird. In einem Fall erfolgt die Aggregation in Superset, während sie im anderen Fall über Apache Flink durchgeführt wird und Superset die Daten lediglich aus der Datenbank liest, ohne selbst Arbeit zu leisten. Zusätzlich haben wir ein Diagramm erstellt, das den Anteil jedes Geschäfts am Gesamtumsatz zeigt. Wie erwartet ist dieser Anteil aufgrund der gleichmäßigen Verteilung der Verkäufe in jedem Geschäft annähernd gleich.

☠ Infrastruktur abbauen

Wenn Sie mit Superset fertig sind, befolgen Sie diese Schritte, um die gesamte Infrastruktur zu stoppen. Zuerst beenden wir Druid und Superset und dann Flink, Kafka und den Avro-Records-Producer. Die Befehle sind unten aufgeführt.

1
2
3
4
5
6
7
8
## In the real_time_dashboarding directory
./stop.sh

## Change to the flink_sql_job directory
cd ../flink_sql_job

## docker-compose down
docker-compose down

Stellen Sie sicher, dass das Skript stop.sh im Ordner real_time_dashboarding ausführbar ist.

📌 Fazit

In diesem Blogbeitrag haben wir die gesamte Datenpipeline von Anfang bis Ende behandelt. Wir haben mit dem Kafka-Producer begonnen, der qualitativ hochwertige Datensätze mit Avro-Schema und dem Schema-Register erstellt und sie an Kafka sendet. Anschließend haben wir die Streaming-Analytics-Pipeline mit dem Flink-Cluster behandelt, der zeitliche Aggregationen auf den Rohdaten durchführt und sie zurück zu Kafka schickt. Wir haben auch gezeigt, wie man mit Apache Druid als Echtzeit-OLAP-Datenbank startet, um Daten aus Kafka zu speichern und schnelle Abfragen zu ermöglichen. Zuletzt haben wir gesehen, wie man unsere Streaming-Datenbank mit Superset verbindet, um aussagekräftige Visualisierungen und Dashboards zu erstellen. Superset fungiert hier als unser Business-Intelligence-Tool.

📝 Gefällt dir, was du liest?

Dann lass uns in Kontakt treten! Unser Engineering-Team wird sich so schnell wie möglich bei dir melden.