Viele moderne Anwendungen basieren auf der kontinuierlichen Transformation und Korrelation von Daten. Gehostete Dienste wie Azure Data Factory eignen sich dabei für Entwickler, die sich traditionell weniger mit diesem Thema befassen müssen. Hier eine kleine Einführung.

In Zeiten von Big Data werden unorganisierte Rohdaten häufig in relationalen, nicht relationalen und anderen Speichersystemen gespeichert. Allerdings mangelt es den Rohdaten an Kontext bzw. an der nötigen Aussagekraft, um von Analysten und Analystinnen, Datenfachleuten oder Entscheidungsträgern in Unternehmen sinnvoll genutzt werden zu können.

Für Big Data ist ein Dienst zum Orchestrieren und Operationalisieren von Prozessen erforderlich, mit dem sich diese enormen Rohdatenmengen in verwertbare geschäftliche Erkenntnisse verwandeln lassen. Azure Data Factory ist ein verwalteter Cloud-Dienst für komplexen Hybridprojekte mit ETL (Extrahieren, Transformieren und Laden), ELT (Extrahieren, Laden und Transformieren) und Datenintegration. Azure Data Factory ermöglicht also das Erstellen datengesteuerter Workflows für die Orchestrierung von Datenverschiebungen und die skalierte Transformation von Daten. So erstellen und planen Sie mit ADF datengesteuerte Workflows (so genannte Pipelines), die Daten aus unterschiedlichen Datenspeichern aufnehmen können, erstellen komplexe ETL-Prozesse, die Daten visuell mit Datenflüssen transformieren oder verwenden Compute-Services wie Azure HDInsight Hadoop, Azure Databricks und Azure SQL Database.

 

Transformierte Daten lassen sich darüber hinaus in Datenspeichern wie z. B. Azure Synapse Analytics veröffentlichen, damit BI-, sprich Business-Intelligence-Anwendungen sie verwenden können. Über Azure Data Factory lassen sich Rohdaten letztendlich in aussagekräftigen Datenspeichern und Data Lakes organisieren und für bessere geschäftliche Entscheidungen verwenden.

Jedes Azure-Abonnement kann über mindestens eine Azure Data Factory-Instanz (bzw. Data Factory) verfügen. Azure Data Factory besteht aus den folgenden Hauptkomponenten:

Pipelines: Bei einer Pipeline handelt es sich um eine logische Gruppierung von …

… Aktivitäten, die zusammen eine Aufgabe (Task) bilden. Die Aktivitäten in einer Pipeline definieren Aktionen, die sich auf Daten anwenden lassen. Ein …

… Datensatz (Dataset) ist eine benannte Ansicht von Daten, die einfach auf die Daten verweist, die in den Aktivitäten als Ein- und Ausgabe verwendet werden sollen. Datasets bestimmen Daten in verschiedenen Datenspeichern, z.B. Tabellen, Dateien, Ordnern und Dokumenten. Ein Azure-Blob-Dataset kann beispielsweise den Blob-Container und -Ordner in Blob Storage angeben, aus dem die Aktivität die Daten lesen soll. Bevor ein Dataset generiert wird, muss man einen …

 

… verknüpften Dienst erstellen, um Datenspeicher und Dienst zu verbinden. Verknüpfte Dienste ähneln Verbindungszeichenfolgen, mit deren Hilfe die Informationen definiert werden, die der Service zum Herstellen einer Verbindung mit externen Ressourcen benötigt. Genau genommen stellt das Dataset die Struktur der Daten innerhalb des verknüpften Datenspeichers dar, während der verknüpfte Dienst die Verbindung mit der Datenquelle definiert. Ein mit Azure Storage verknüpfter Dienst verbindet z. B. ein Speicherkonto. Ein Azure-Blob-Dataset repräsentiert den Blob-Container und ggf. den Ordner innerhalb des Azure Storage-Kontos, das die zu verarbeitenden Eingabe-Blobs enthält.

Datenflüsse schließlich sind eine Ergänzung zum Konzept der Pipelines. Während Pipelines große Mengen von Daten bewegen, dienen Data Flow dazu, die Daten zu modifizieren, Spalten hinzuzufügen oder anhand bestimmter Werte zu transformieren.

Im folgenden Beispiel-Szenario setzen wir die Azure Data Factory als ETL-Werkzeug ein, um umfangreiche Rohdaten im Parquet-Format einzulesen und in verwertbare Daten in Form einer Azure-SQL-Datenbank zu transformieren.

Open Datasets

Wie oben einleitend erläutert, stellt der Datenbewegungsprozess mit oder ohne Transformation im Rahmen eines ETL-Prozesses allerdings nur einen kleinen Ausschnitt der Mächtigkeit von Azure Data Factory dar. In unserem folgenden Beispiel sind die Rohdaten die Bewegungsdaten New Yorker Taxis – hier aus dem Monat 01/2022 –, welche die Stadt kontinuierlich zur Verfügung stellt.

Woher man solche Datenquellen kennt? Microsoft verweist darauf in seiner Dokumentation zu öffentlichen Datasets. Wer genauer hinsieht stellt auch schnell fest, dass die Daten faktisch in einen öffentlichen zugänglichen Amazon-S3-Bucket bereitgestellt werden. Bis ca. Mitte 2019 standen die Daten im CSV-Format als kommaseparierte Liste zur Verfügung, neuere Daten liegen im sogenannten Apache-Parquet-Format vor.

Apache Parquet

Apache Parquet ist ein Dateiformat, das entwickelt wurde, um eine schnelle Datenverarbeitung für komplexe Daten zu unterstützen, mit mehreren bemerkenswerten Eigenschaften: Im Gegensatz zu zeilenbasierten Formaten wie CSV ist Apache Parquet spaltenorientiert. Zudem ist Parquet kostenlos, quelloffen (unter der Apache-Hadoop-Lizenz) und kompatibel zu den meisten Hadoop-Datenverarbeitungs-Frameworks. Zudem sind in Parquet die Metadaten, einschließlich Schema und Struktur, in jede Datei eingebettet, was es zu einem selbstbeschreibenden Dateiformat macht.

Vorarbeiten

Wir wollen nun diese öffentlichen Parquet-Data in einen Azure-Blob-Container laden und von dort aus automatisiert mit Hilfe der Azure Data Factory so aufbereiten, dass sie in einer verwaltete Azure-SQL-Datenbank ablegt werden und vor dort aus mittels SQL abgefragt werden können. Die Sinnhaftigkeit des Szenarios steht hierbei nicht so sehr im Vordergrund; es geht nur um den Tansformations/ETL-Prozess.

Für die vorbereitenden Maßnahmen wie das Erstellen des Speicherkontos, des SQL Servers, der SQL-Datenbank und der Data Factory bedienen wir uns der Einfachheit und Schnelligkeit halber der Kommandozeile; diesmal der Azure-CLI. Alle Vorgänge funktionieren aber auch per Powershell oder im Azure-Portal. Die verwendeten Ressource-Namen sind selbstverständlich beispielhaft zu verstehen.

Beginnen wir mit dem Erstellen einer Ressourcengruppe:

az group create -l germanywestcentral -n dridfdemo-rg

Dann erstellen wir den Storage Account…

az storage account create -n dridfdemosa -g dridfdemo-rg -l germanywestcentral --sku Standard_LRS

… und nun den SQL Server für die SQL-Datenbank (Achtung, hier das Passwort entsprechend anpassen):

az sql server create -n dridfdemosqlserver -g dridfdemo-rg -l germanywestcentral --admin-user sqladmin --admin-password Pa55w.rd1234

Fehlt noch die Datenbank selbst auf diesem Server:

az sql db create -n dridfdemodb --server dridfdemosqlserver --resource-group dridfdemo-rg --edition Basic

Hier verwenden wie zum Kostensparen den Dienstplan „DTU-basiert“ in der Basic-Edition mit 5 DTUs. Wahlweise ließe sich auch das V-Core-Model im serverlosen Modell verwenden. Dann brauchen wie noch zwei obligatorische SQL-Server Firewall Regeln. Die Erste erlaubt den Zugriff von allen anderen Azure-Diensten:

az sql server firewall-rule create --name “AllowAZureServices” --resource-group dridfdemo-rg --server dridfdemosqlserver --end-ip-address 0.0.0.0 --start-ip-address 0.0.0.0

Die Zweite erlaubt zusätzlich den Zugriff nur von der eigenen IP-Adresse. Hier müssen Sie die momentane Public-IP IHRES Routers einsetzen:

az sql server firewall-rule create --name “AllowHomeIP” --resource-group dridfdemo-rg --server dridfdemosqlserver --end-ip-address 84.150.179.201 --start-ip-address 84.150.179.201

Datenbasis besorgen und in Speicherkonto hochladen

Wie oben geschildert findet sich passende Quelldaten der New Yorker Taxis Amazon S3 unter: https://s3.amazonaws.com/nyc-tlc. Verwenden Sie nur diesen Teil des Links, erhalten Sie öffentlichen Lesezugriff auf den ganzen S3-Bucket und können dann alle Datensätze sehen. Den Key für die Daten von Januar 2022 im Parquet-Format hängen Sie dann einfach an. Zuvor brauchen Sie aber einen der zwei Speicherkontoschlüssel. Diesen ermitteln Sie mit …

az storage account keys list --account-name dridfdemosa

Diesen Schlüssel verwenden Sie dann zum Anlegen des Containers „source-data“.

az storage container create --name source-data --account-key <key> --account-name dridfdemosa

Nun können Sie die Datei aus den oben genannten S3-Bucket in Azure Blob hochladen:

az storage blob copy start --destination-blob “yellow_tripdata_2022-01.parquet” --destination-container “source-data” --account-key [key] --account-name dridfdemosa --source-uri https://s3.amazonaws.com/nyc-tlc/trip data/yellow_tripdata_2022-01.parquet

Dann können Sie Ihre Azure Azure Data Factory anlegen:

az datafactory create --factory-name dridfdemo --resource-group dridfdemo-rg –location germanywestcentral

Ist das erledigt, suchen Sie im Azure Portal nach Azure Data Factorys und klicken auf den Eintrag für die neu angelegte Datenfabrik. 

 

Die Übersichtsseite der Data Factory, hier klicken wir bei „Erste Schritte“ im Abschnitt „Azure Data Factory Studio öffnen“ auf „Öffnen“, um zum Azure Data Factory Studio zu gelangen. (Bild: Drilling / Microsoft)

Die Übersichtsseite der Data Factory, hier klicken wir bei „Erste Schritte“ im Abschnitt „Azure Data Factory Studio öffnen“ auf „Öffnen“, um zum Azure Data Factory Studio zu gelangen. 

Auf der Startseite des Data Factory Studios klicken wir dann links im Menü auf den Stift für „Autor“, um eine neue Pipeline anlegen zu können. (Bild: Drilling / Microsoft)

Auf der Startseite des Data Factory Studios klicken wir dann links im Menü auf den Stift für „Autor“, um eine neue Pipeline anlegen zu können.

Nun besteht links unter „Factoryressourcen“ die Möglichkeit, jede beliebige Factory-Ressource zu erstellen. Die Reihenfolge spielt dabei keine Rolle, d. h. wenn Sie direkt mit einer Pipeline starten, können Sie Datasets und/oder Datenflüsse im Kontext der Pipeline erstellen. Klicken Sie nun einfach auf die drei Punkte neben „Pipelines“, um eine neue Pipeline erstellen zu können. (Bild: Drilling / Microsoft)

Nun besteht links unter „Factoryressourcen“ die Möglichkeit, jede beliebige Factory-Ressource zu erstellen. Die Reihenfolge spielt dabei keine Rolle, d. h. wenn Sie direkt mit einer Pipeline starten, können Sie Datasets und/oder Datenflüsse im Kontext der Pipeline erstellen. Klicken Sie nun einfach auf die drei Punkte neben „Pipelines“, um eine neue Pipeline erstellen zu können.

Nach dem Anlegen der Pipeline wählen Sie aus dem Menü bei „Aktivitäten“ einen „COPY DATA“-Task aus dem Abschnitt „Verschieben und Transformieren“, und ziehen ihn einfach per Drag-and-Drop in den Canvas-Bereich in der Mitte. (Bild: Drilling / Microsoft)

Nach dem Anlegen der Pipeline wählen Sie aus dem Menü bei „Aktivitäten“ einen „COPY DATA“-Task aus dem Abschnitt „Verschieben und Transformieren“, und ziehen ihn einfach per Drag-and-Drop in den Canvas-Bereich in der Mitte.

Markieren Sie oben den Task, werden und die Registereiter „Allgemein“, „Quelle“, „Senke“, „Zuordnung“ und „Einstellungen“ sichtbar. An der kleinen „1“ bei Quelle und Senke erkennen Sie schnell, dass hier noch Konfigurationsschritte auf Sie warten. Beginnen Sie mit Quelle: Hier fügen Sie nun einen neues Dataset hinzu und wählen den Typ „Azure Blobspeicher“. (Bild: Drilling / Microsoft)

Markieren Sie oben den Task, werden und die Registereiter „Allgemein“, „Quelle“, „Senke“, „Zuordnung“ und „Einstellungen“ sichtbar. An der kleinen „1“ bei Quelle und Senke erkennen Sie schnell, dass hier noch Konfigurationsschritte auf Sie warten. Beginnen Sie mit Quelle: Hier fügen Sie nun einen neues Dataset hinzu und wählen den Typ „Azure Blobspeicher“.

Bei Format wählen Sie „Parquet“, denn das Dataset muss wissen, im welchen Format die die Quelldaten vorliegen. (Bild: Drilling / Microsoft)

Bei Format wählen Sie „Parquet“, denn das Dataset muss wissen, im welchen Format die die Quelldaten vorliegen.

Nun müssen Sie einen „Verknüpften Dienst“ auswählen. Im Unterschied zum Dataset, das lediglich besagt, dass Quellendaten im Blob-Format vorliegen, geht es beim Linked Service konkret um die Konfiguration zur Anbindung Ihres speziellen Speicherkonto. Zur Authentifizierung und Autorisierung von Datenvorgängen stehen verschiedene Verfahren zur Verfügung. Wir verwenden hier SAS-URI, wozu Sie vorher für ihr Speicherkonto eine Konto-SAS (Shared Access Signature) erstellt haben müssten. (Bild: Drilling / Microsoft)

Nun müssen Sie einen „Verknüpften Dienst“ auswählen. Im Unterschied zum Dataset, das lediglich besagt, dass Quellendaten im Blob-Format vorliegen, geht es beim Linked Service konkret um die Konfiguration zur Anbindung Ihres speziellen Speicherkonto. Zur Authentifizierung und Autorisierung von Datenvorgängen stehen verschiedene Verfahren zur Verfügung. Wir verwenden hier SAS-URI, wozu Sie vorher für ihr Speicherkonto eine Konto-SAS (Shared Access Signature) erstellt haben müssten.

Dann wählen Sie den Dateipfad, optional ein Verzeichnis und schließlich die hochgeladene Datei aus. (Bild: Drilling / Microsoft)

Dann wählen Sie den Dateipfad, optional ein Verzeichnis und schließlich die hochgeladene Datei aus.

Sie können die Daten entweder manuell eintragen oder rechts auf den Dateiselektor klicken und die Datei mit der Maus auswählen. (Bild: Drilling / Microsoft)

Sie können die Daten entweder manuell eintragen oder rechts auf den Dateiselektor klicken und die Datei mit der Maus auswählen.

Im Ergebnis referenziert der verknüpfte Dienst nun die richtigen Quelldaten. (Bild: Drilling / Microsoft)

Im Ergebnis referenziert der verknüpfte Dienst nun die richtigen Quelldaten.

Mit einem Klick auf „OK“ landen Sie wieder in Ihrer Pipeline. Die Quelle ist jetzt ausreichend konfiguriert, da sie keine „1“ mehr zeigt. (Bild: Drilling / Microsoft)

Mit einem Klick auf „OK“ landen Sie wieder in Ihrer Pipeline. Die Quelle ist jetzt ausreichend konfiguriert, da sie keine „1“ mehr zeigt.

Nun müssen Sie die „Senke“ anschließen. Hier erstellen Sie wieder ein neues Dataset und wählen hier als Vorlage „Azure SQL Database“. (Bild: Drilling / Microsoft)

Nun müssen Sie die „Senke“ anschließen. Hier erstellen Sie wieder ein neues Dataset und wählen hier als Vorlage „Azure SQL Database“.

Bei „Verknüpfter Dienst“ konfigurieren Sie dann den Zugang zu Ihrer SQL-Datenbank. Zur Verbindungskonfiguration wählen Sie aus Ihren Azure-Abonnement Ihren SQL, Server, die SQL-Datenbank, wählen aus „Authentifizierungstyp“ die „SQL Authentifizierung“ aus und geben die Credentials an, die Sie beim Erstellen der Datenbank verwendet haben. Klicken Sie dann auf „Verbindung testen“ und dann auf „Erstellen“. (Bild: Drilling / Microsoft)

Bei „Verknüpfter Dienst“ konfigurieren Sie dann den Zugang zu Ihrer SQL-Datenbank. Zur Verbindungskonfiguration wählen Sie aus Ihren Azure-Abonnement Ihren SQL, Server, die SQL-Datenbank, wählen aus „Authentifizierungstyp“ die „SQL Authentifizierung“ aus und geben die Credentials an, die Sie beim Erstellen der Datenbank verwendet haben. Klicken Sie dann auf „Verbindung testen“ und dann auf „Erstellen“.

Nun müssen Sie Ihrer Senke noch mitteilen, wie die Tabelle heißen soll, in der die Daten importiert werden. (Bild: Drilling / Microsoft)

Nun müssen Sie Ihrer Senke noch mitteilen, wie die Tabelle heißen soll, in der die Daten importiert werden.

Da die Tabelle noch nicht existiert, können Sie sie auch nicht bei „Tabellenname“ auswählen. Daher klicken Sie unten auf den Link „Dieses Dataset öffnen“, setzen den Haken bei „Bearbeiten“ und geben einfach die gewünschten Tabellennamen an, z. B. „dbo“ und „taxidata“. Nun müssen wir aber noch dafür sorgen, dass die Tabelle automatisch angelegt wird. (Bild: Drilling / Microsoft)

Da die Tabelle noch nicht existiert, können Sie sie auch nicht bei „Tabellenname“ auswählen. Daher klicken Sie unten auf den Link „Dieses Dataset öffnen“, setzen den Haken bei „Bearbeiten“ und geben einfach die gewünschten Tabellennamen an, z. B. „dbo“ und „taxidata“. Nun müssen wir aber noch dafür sorgen, dass die Tabelle automatisch angelegt wird.

Hierfür wechseln wir oben zum „Pipeline“-Reiter zurück und müssen im Reiter „Senke“ noch die Option „Tabelle automatisch erstellen“ setzen. Danach genügt ein Klick oben rechts auf „Debuggen“, um die Pipeline auszuführen. (Bild: Drilling / Microsoft)

Hierfür wechseln wir oben zum „Pipeline“-Reiter zurück und müssen im Reiter „Senke“ noch die Option „Tabelle automatisch erstellen“ setzen. Danach genügt ein Klick oben rechts auf „Debuggen“, um die Pipeline auszuführen.

Nun sehen wir im Tab „Ausgabe“ erst einmal die ID der Pipelineausführung sowie Startzeit und Dauer. Der Typ ist „Daten kopieren“. (Bild: Drilling / Microsoft)

Nun sehen wir im Tab „Ausgabe“ erst einmal die ID der Pipelineausführung sowie Startzeit und Dauer. Der Typ ist „Daten kopieren“.

Nach ca. 20 Minuten sollte die Datei fertig kopiert sein und der Status auf grün wechseln. (Bild: Drilling / Microsoft)

Nach ca. 20 Minuten sollte die Datei fertig kopiert sein und der Status auf grün wechseln.

Nun bleibt nur zu prüfen, ob die Zieltabelle existiert. (Bild: Drilling / Microsoft)

Nun bleibt nur zu prüfen, ob die Zieltabelle existiert.

Wenn Sie zufrieden sind, könnten Sie nun links oben im Tab „Alle veröffentlichen“ alle ihre letzten Änderungen final in der Live-Umgebung veröffentlichen. (Bild: Drilling / Microsoft)

Wenn Sie zufrieden sind, könnten Sie nun links oben im Tab „Alle veröffentlichen“ alle ihre letzten Änderungen final in der Live-Umgebung veröffentlichen.

Fazit

Der Microsoft SQL-Server besteht bekanntlich – sofern on-premises auf physischen oder virtuellen Servern betrieben – aus mehreren Bestandteilen; hierzu gehört auch die SQL Server Integration Services (SSIS), eine Plattform zum Erstellen von Datenintegrations- und Datentransformationslösungen auf Unternehmensebene.

Azure Data Factory können Sie sich als Cloud-Variante der SSIS vorstellen. Sie ist das Werkzeug in Azure zum Bewegen größerer Datenmengen oder um das Bewegen größerer Datenmengen zu koordinieren (Orchestrieren von Ladevorgängen), wobei die Begrifflichkeiten wie Pipelines, Datasets und Datenflüssen denen in SSIS ähneln. Wie einfach Data Factory einzusetzen ist, hat dieses Beispiel gezeigt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.