Tutorial: Migrieren von durch Event Hubs erfassten Daten von Azure Storage zu Azure Synapse Analytics mithilfe von Azure Event Grid und Azure Functions

In diesem Tutorial migrieren Sie von Event Hubs erfasste Daten von Azure Blob Storage zu Azure Synapse Analytics, genauer gesagt zu einem dedizierten SQL-Pool, mithilfe von Azure Event Grid und Azure Functions.

Application overview

Dieses Diagramm zeigt den Workflow der Lösung, die Sie in diesem Tutorial erstellen:

  1. Daten, die an einen Azure Event Hub gesendet werden, werden in einem Azure Blob Storage erfasst.
  2. Wenn die Datenerfassung abgeschlossen ist, wird ein Ereignis generiert und an eine Azure Event Grid-Instanz gesendet.
  3. Azure Event Grid leitet diese Ereignisdaten an eine Azure-Funktions-App weiter.
  4. Die Funktions-App verwendet die Blob-URL in den Event-Daten, um den Blob aus dem Speicher abzurufen.
  5. Die Funktions-App migriert die Blobdaten zu einer Azure Synapse Analytics-Instanz.

In diesem Artikel führen Sie die folgenden Schritte aus:

  • Bereitstellen der erforderlichen Infrastruktur für das Tutorial
  • Veröffentlichen von Code in einer Functions-App
  • Erstellen eines Event Grid-Abonnements
  • Streamen von Beispieldaten an Event Hubs
  • Überprüfen erfasster Daten in Azure Synapse Analytics

Voraussetzungen

Für dieses Tutorial benötigen Sie Folgendes:

  • Dieser Artikel geht davon aus, dass Sie mit Event Grid und Event Hubs (insbesondere dem Feature „Capture“) vertraut sind. Wenn Sie mit Azure Event Grid nicht vertraut sind, finden Sie weitere Informationen unter Einführung in Azure Event Grid. Weitere Informationen zum Feature „Capture“ von Azure Event Hubs finden Sie unter Erfassen von Ereignissen über Azure Event Hubs in Azure Blob Storage oder Azure Data Lake Storage.
  • Ein Azure-Abonnement. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.
  • Visual Studio mit Workloads für .NET-Desktopentwicklung, Azure-Entwicklung, ASP.NET- und Webentwicklung, Node.js-Entwicklung und Python-Entwicklung.
  • Laden Sie das Beispielprojekt EventHubsCaptureEventGridDemo auf Ihren Computer herunter.
    • WindTurbineDataGenerator: ein einfacher Herausgeber, der Beispieldaten einer Windturbine an einen Event Hub mit aktiviertem Capturefeature sendet.
    • FunctionDWDumper: eine Azure-Funktion, die eine Benachrichtigung von Azure Event Grid erhält, wenn im Azure Storage-Blob eine Avro-Datei erfasst wird. Sie erhält den URI-Pfad des Blobs, liest dessen Inhalt und pusht die Daten an Azure Synapse Analytics (dedizierter SQL-Pool).

Bereitstellen der Infrastruktur

In diesem Schritt stellen Sie die erforderliche Infrastruktur mit einer Resource Manager-Vorlage bereit. Wenn Sie die Vorlage bereitstellen, werden die folgenden Ressourcen erstellt:

  • Event Hub mit aktiviertem Capture-Feature.
  • Speicherkonto für die erfassten Dateien.
  • App Service-Plan zum Hosten der Funktions-App
  • Funktions-App zum Verarbeiten des Ereignisses
  • SQL Server zum Hosten des Data Warehouse
  • Azure Synapse Analytics (dedizierter SQL-Pool) zum Speichern der migrierten Daten

Bereitstellen der Infrastruktur über die Azure-Befehlszeilenschnittstelle

  1. Melden Sie sich beim Azure-Portal an.

  2. Wählen Sie oben die Schaltfläche Cloud Shell aus.

    Screenshot of Azure portal showing the selection of Cloud Shell button.

  3. Die Cloud Shell wird unten im Browser geöffnet.

    1. Wenn Sie Cloud Shell zum ersten Mal verwenden:
      1. Wenn eine Option zur Auswahl zwischen Bash und PowerShell angezeigt wird, wählen Sie Bash aus.

      2. Erstellen Sie ein Speicherkonto, indem Sie Speicher erstellen auswählen. Zum Speichern von Daten benötigt Azure Cloud Shell ein Azure-Speicherkonto.

        Screenshot showing the creation of storage for Cloud Shell.

      3. Warten Sie, bis die Cloud Shell initialisiert wird.

        Screenshot showing the Cloud Shell initialized.

  4. Wählen Sie in Cloud Shell Bash aus, wie in der Abbildung oben gezeigt, wenn diese Option noch nicht ausgewählt ist.

  5. Erstellen Sie eine Azure-Ressourcengruppe, indem Sie den folgenden CLI-Befehl ausführen:

    1. Kopieren Sie den folgenden Befehl, und fügen Sie ihn in das Cloud Shell-Fenster ein. Ändern Sie ggf. den Namen der Ressourcengruppe und des Standorts.

      az group create -l eastus -n rgDataMigration
      
    2. Drücken Sie die EINGABETASTE.

      Hier sehen Sie ein Beispiel:

      user@Azure:~$ az group create -l eastus -n rgDataMigration
      {
        "id": "/subscriptions/00000000-0000-0000-0000-0000000000000/resourceGroups/rgDataMigration",
        "location": "eastus",
        "managedBy": null,
        "name": "rgDataMigration",
        "properties": {
          "provisioningState": "Succeeded"
        },
        "tags": null
      }
      
  6. Stellen Sie alle im vorherigen Abschnitt genannten Ressourcen (Event Hub, Speicherkonto, Funktions-App, Azure Synapse Analytics) bereit, indem Sie den folgenden CLI-Befehl ausführen:

    1. Kopieren Sie den folgenden Befehl in das Cloud Shell-Fenster. Alternativ können Sie auch in einen Editor Ihrer Wahl kopieren/einfügen, Werte festlegen und dann den Befehl in die Cloud Shell kopieren. Wenn ein Fehler aufgrund eines Azure-Ressourcennamens angezeigt wird, löschen Sie die Ressourcengruppe, korrigieren Sie den Namen, und wiederholen Sie den Befehl erneut.

      Wichtig

      Geben Sie vor dem Ausführen des Befehls Werte für die folgenden Entitäten an:

      • Name der Ressourcengruppe, die Sie zuvor erstellt haben.
      • Name des Event Hub-Namespace.
      • Name für den Event Hub. Sie können den Wert unverändert lassen (hubdatamigration).
      • Name für den SQL Server.
      • Name und Kennwort des SQL-Benutzers
      • Name für die Datenbank.
      • Name des Speicherkontos.
      • Name der Funktionen-App.
      az deployment group create \
          --resource-group rgDataMigration \
          --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/event-grid/EventHubsDataMigration.json \
          --parameters eventHubNamespaceName=<event-hub-namespace> eventHubName=hubdatamigration sqlServerName=<sql-server-name> sqlServerUserName=<user-name> sqlServerPassword=<password> sqlServerDatabaseName=<database-name> storageName=<unique-storage-name> functionAppName=<app-name>
      
    2. Drücken Sie EINGABETASTE i, Cloud Shell-Fenster zum Ausführen des Befehls. Dieser Vorgang kann einige Zeit in Anspruch nehmen, da Sie zahlreiche Ressourcen erstellen. Stellen Sie im Ergebnis des Befehls sicher, dass es keine Fehler gegeben hat.

  7. Schließen Sie die Cloud Shell-Instanz, indem Sie die Schaltfläche Cloud Shell im Portal (oder) X in der rechten oberen Ecke des Cloud Shell-Fensters auswählen.

Überprüfen, ob die Ressourcen erstellt wurden

  1. Wählen Sie im Azure-Portals im linken Menü Ressourcengruppe.

  2. Filtern Sie die Liste der Ressourcengruppen, indem Sie den Namen Ihrer Ressourcengruppe in das Suchfeld eingeben.

  3. Wählen Sie Ihre Ressourcengruppe in der Liste aus.

    Screenshot showing the selection of your resource group.

  4. Überprüfen Sie, ob die folgenden Ressourcen in der Ressourcengruppe aufgeführt sind:

    Screenshot showing resources in the resource group.

Erstellen einer Tabelle in Azure Synapse Analytics

In diesem Abschnitt erstellen Sie eine Tabelle im dedizierten SQL-Pool, den Sie zuvor erstellt haben.

  1. Wählen Sie in der Liste der Ressourcen in der Ressourcengruppe Ihren dedizierten SQL-Pool aus.

  2. Wählen Sie auf der Seite Dedicated SQL pool (Dedizierter SQL-Pool) im Abschnitt Allgemeine Aufgaben im linken Menü die Option Abfrage-Editor (Vorschau) aus.

    Screenshot showing the selection of Query Editor on a Dedicated SQL pool page in the Azure portal.

  3. Geben Sie den Namen für Benutzer und Kennwort für die SQL Server ein, und wählen OK. Wenn eine Meldung angezeigt wird, die besagt, dass Ihr Client auf die SQL Server-Instanz zugreifen kann, wählen Sie Positivlisten-IP <Ihre IP-Adresse> auf dem Server <Ihre SQL Server-Instanz> und dann OK aus.

  4. Fügen Sie das folgende SQL-Skript ins Abfragefenster ein, und führen Sie es aus:

    CREATE TABLE [dbo].[Fact_WindTurbineMetrics] (
        [DeviceId] nvarchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [MeasureTime] datetime NULL,
        [GeneratedPower] float NULL,
        [WindSpeed] float NULL,
        [TurbineSpeed] float NULL
    )
    WITH (CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN);
    

    Screenshot showing the query editor.

  5. Halten Sie diese Registerkarte oder dieses Fenster offen, damit Sie überprüfen können, ob die Daten am Ende des Tutorials erstellt wurden.

Veröffentlichen der Azure Functions-App

Rufen Sie zunächst das Veröffentlichungsprofil für die Functions-App aus dem Azure-Portal ab. Verwenden Sie dann das Veröffentlichungsprofil, um das Azure Functions-Projekt oder die App aus Visual Studio zu veröffentlichen.

Abrufen des Veröffentlichungsprofils

  1. Wählen Sie auf der Seite Ressourcengruppe die Azure Functions-App in der Liste der Ressourcen aus.

    Screenshot showing the selection of the function app in the list of resources for a resource group.

  2. Wählen Sie auf der Seite Funktions-App für Ihre App die Option Veröffentlichungsprofil abrufen auf der Befehlsleiste aus.

    Screenshot showing the selection of the **Get Publish Profile** button on the command bar of the function app page.

  3. Laden Sie die Datei in den Unterordner FunctionEGDDDumper des Ordners EventHubsCaptureEventGridDemo herunter, und speichern Sie sie.

Verwenden des Veröffentlichungsprofils zum Veröffentlichen der Functions-App

  1. Starten Sie Visual Studio.

  2. Öffnen Sie die Lösung EventHubsCaptureEventGridDemo.sln, die Sie aus GitHub als Teil der Voraussetzungen heruntergeladen haben. Sie befindet sich im Ordner /samples/e2e/EventHubsCaptureEventGridDemo.

  3. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt FunctionEGDWDumper, und wählen Sie Veröffentlichen aus.

  4. Wählen Sie auf dem folgenden Bildschirm Start oder Veröffentlichungsprofil hinzufügen aus.

  5. Wählen Sie im Dialogfeld Veröffentlichen unter Ziel die Option Profil importieren und dann Weiter aus.

    Screenshot showing the selection **Import Profile** on the **Publish** dialog box.

  6. Wählen Sie auf der Registerkarte Profil importieren die Datei mit den Veröffentlichungseinstellungen aus, die Sie zuvor im Ordner FunctionEGDWDumper gespeichert haben, und wählen Sie dann Fertig stellen aus.

  7. Wenn Visual Studio das Profil konfiguriert hat, wählen Sie Veröffentlichen. Vergewissern Sie sich, dass die Veröffentlichung erfolgreich war.

  8. Wählen Sie in dem Webbrowser, in dem die Seite Azure-Funktion geöffnet ist, im mittleren Bereich die Option Funktionen aus. Vergewissern Sie sich, dass die Funktion EventGridTriggerMigrateData in der Liste enthalten ist. Wiederholen Sie andernfalls die Veröffentlichung über Visual Studio, und aktualisieren Sie anschließend die Seite im Portal.

    Screenshot showing the confirmation of function creation.

Nach dem Veröffentlichen der Funktion können Sie das Ereignis abonnieren.

Abonnieren des Ereignisses

  1. Melden Sie sich in einer neuen Registerkarte oder einem neuen Fenster eines Webbrowsers beim Azur-Portal an.

  2. Wählen Sie im Azure-Portals im linken Menü Ressourcengruppe.

  3. Filtern Sie die Liste der Ressourcengruppen, indem Sie den Namen Ihrer Ressourcengruppe in das Suchfeld eingeben.

  4. Wählen Sie Ihre Ressourcengruppe in der Liste aus.

  5. Wählen Sie in der Ressourcenliste den Event Hubs-Namespace aus.

  6. Wählen Sie auf der Seite Event Hubs-Namespace im Menü auf der linken Seite die Option Ereignisse und anschließend auf der Symbolleiste die Option + Ereignisabonnement aus.

    Screenshot of the Events page for an Event Hubs namespace with Add event subscription link selected.

  7. Gehen Sie auf der Seite Ereignisabonnement erstellen wie folgt vor:

    1. Geben Sie einen Namen für das Ereignisabonnement ein.

    2. Geben Sie unter Name einen Namen für das Systemthema ein. Ein Systemthema stellt einen Endpunkt bereit, den der Absender zum Senden von Ereignissen verwenden kann. Weitere Informationen finden Sie unter Systemthemen in Azure Event Grid.

    3. Wählen Sie für Endpunkttyp die Option Azure-Funktion aus.

    4. Wählen Sie für Endpunkt den Link aus.

    5. Gehen Sie auf der Seite Azure-Funktion auswählen wie folgt vor, falls diese Angaben nicht automatisch ausgefüllt werden:

      1. Wählen Sie das Azure-Abonnement aus, das die Azure-Funktion enthält.
      2. Wählen Sie die Ressourcengruppe für die Funktion aus.
      3. Wählen Sie die Funktions-App aus.
      4. Wählen Sie den Bereitstellungsslot aus.
      5. Wählen Sie die Funktion EventGridTriggerMigrateData aus.
    6. Wählen Sie auf der Seite Azure-Funktion auswählen die Option Auswahl bestätigen aus.

    7. Wählen Sie anschließend auf der Seite Ereignisabonnement erstellen die Option Erstellen aus.

      Screenshot of the Create an event subscription page.

  8. Vergewissern Sie sich, dass das Ereignisabonnement erstellt wurde. Wechseln Sie auf der Seite Ereignisse für den Event Hubs-Namespace zur Registerkarte Ereignisabonnements.

    Screenshot showing the Event Subscriptions tab on the Events page.

Ausführen der App zum Generieren von Daten

Ihr Event Hub, Ihr dedizierter SQL-Pool (vormals SQL Data Warehouse), Ihre Azure-Funktions-App sowie Ihr Ereignisabonnement sind nur fertig eingerichtet. Vor dem Ausführen einer Anwendung, die Daten für Event Hubs generiert, müssen Sie einige Werte konfigurieren.

  1. Navigieren Sie im Azure-Portal zu der Ressourcengruppe, die Sie zuvor erstellt haben.

  2. Wähen Sie den Event Hubs-Namespace aus.

  3. Wählen Sie auf der Seite Event Hubs-Namespace die Option SAS-Richtlinien im linken Menü aus.

  4. Wählen Sie in der Richtlinienliste RootManageSharedAccessKey aus.

    Screenshot showing the Shared access policies page for an Event Hubs namespace.

  5. Wählen Sie die Schaltfläche „Kopieren“ neben dem Textfeld Verbindungszeichenfolge-primärer Schlüssel aus.

  6. Kehren Sie zur Visual Studio-Lösung zurück.

  7. Klicken Sie mit der rechten Maustaste auf das Projekt WindTurbineDataGenerator, und wählen Sie Als Startprojekt festlegen aus.

  8. Öffnen Sie program.cs im Projekt „WindTurbineDataGenerator“.

  9. Ersetzen Sie <EVENT HUBS NAMESPACE CONNECTION STRING> durch die aus dem Portal kopierte Verbindungszeichenfolge.

  10. Wenn Sie für den Event Hub einen anderen Namen als hubdatamigration verwendet haben, ersetzen Sie <EVENT HUB NAME> durch den Namen des Event Hubs.

    private const string EventHubConnectionString = "Endpoint=sb://demomigrationnamespace.servicebus.windows.net/...";
    private const string EventHubName = "hubdatamigration";
    
  11. Erstellen Sie die Projektmappe. Führen Sie die Anwendung WindTurbineGenerator.exe aus.

  12. Warten Sie einigen Minuten, und fragen Sie dann auf dem anderen Browsertab mit dem geöffneten Abfragefenster die migrierten Daten aus der Tabelle in Ihrem Data Warehouse ab.

    select * from [dbo].[Fact_WindTurbineMetrics]
    

    Screenshot showing the query results.

Überwachen der Lösung

Dieser Abschnitt unterstützt Sie bei der Überwachung oder Problembehandlung im Zusammenhang mit der Lösung.

Anzeigen erfasster Daten im Speicherkonto

  1. Navigieren Sie zur Ressourcengruppe, und wählen Sie das Speicherkonto aus, das zum Erfassen von Ereignisdaten verwendet wird.

  2. Wählen Sie auf der Seite Speicherkonto im linken Menü die Option Speicherbrowser aus.

  3. Erweitern Sie BLOBCONTAINER, und wählen Sie windturbinecapture aus.

  4. Öffnen Sie im rechten Bereich den Ordner mit dem Namen Ihres Event Hubs-Namespace.

  5. Öffnen Sie den Ordner mit dem Namen Ihres Event Hubs (hubdatamigration).

  6. Navigieren Sie durch die Ordner, um zu den AVRO-Dateien zu gelangen. Hier sehen Sie ein Beispiel:

    Screenshot showing the captured file in the storage.

Vergewissern, dass die Funktion durch den Event Grid-Trigger aufgerufen wurde

  1. Navigieren Sie zur Ressourcengruppe, und wählen Sie die Funktions-App aus.

  2. Wählen Sie im mittleren Bereich die RegisterkarteFunktionen aus.

  3. Wählen Sie in der Liste die Funktion EventGridTriggerMigrateData aus.

  4. Wählen Sie auf der Seite Funktion im linken Menü die Option Überwachen aus.

  5. Wählen Sie Konfigurieren aus, um Application Insights für die Erfassung von Aufrufprotokollen zu konfigurieren.

  6. Erstellen Sie eine neue Ressource vom Typ Application Insights, oder wählen Sie eine bereits vorhandene Ressource aus.

  7. Kehren Sie zur Seite Überwachen für die Funktion zurück.

  8. Vergewissern Sie sich, dass die Clientanwendung (windturbinedatagenerator), von der Ereignisse gesendet werden, weiterhin ausgeführt wird. Falls nicht, führen Sie die App aus.

  9. Warten Sie mindestens fünf Minuten, und wählen Sie die Schaltfläche Aktualisieren aus, um Funktionsaufrufe zu sehen.

    Screenshot showing the Function invocations.

  10. Wählen Sie einen Aufruf aus, um Details anzuzeigen.

    Event Grid verteilt Ereignisdaten an die Abonnenten. Das folgende Beispiel zeigt Ereignisdaten, die erzeugt werden, wenn Daten, die über einen Event Hub übertragen werden, in einem Blob erfasst werden. Beachten Sie ins Besondere, dass die fileUrl-Eigenschaft im data-Objekt auf den Blob im Speicher verweist. Die Funktions-App verwendet diese URL zum Abrufen der Blobdatei mit den erfassten Daten.

    {
      "topic": "/subscriptions/<AZURE SUBSCRIPTION ID>/resourcegroups/rgDataMigration/providers/Microsoft.EventHub/namespaces/spehubns1207",
      "subject": "hubdatamigration",
      "eventType": "Microsoft.EventHub.CaptureFileCreated",
      "id": "4538f1a5-02d8-4b40-9f20-36301ac976ba",
      "data": {
        "fileUrl": "https://spehubstorage1207.blob.core.windows.net/windturbinecapture/spehubns1207/hubdatamigration/0/2020/12/07/21/49/12.avro",
        "fileType": "AzureBlockBlob",
        "partitionId": "0",
        "sizeInBytes": 473444,
        "eventCount": 2800,
        "firstSequenceNumber": 55500,
        "lastSequenceNumber": 58299,
        "firstEnqueueTime": "2020-12-07T21:49:12.556Z",
        "lastEnqueueTime": "2020-12-07T21:50:11.534Z"
      },
      "dataVersion": "1",
      "metadataVersion": "1",
      "eventTime": "2020-12-07T21:50:12.7065524Z"
    }
    

Vergewissern, dass die Daten im dedizierten SQL-Pool gespeichert wurden

Fragen Sie auf dem Browsertab mit dem geöffneten Abfragefenster die migrierten Daten aus der Tabelle in Ihrem dedizierten SQL-Pool ab.

Screenshot showing the final query results.

Nächste Schritte