Tutoriel : Effectuer la migration de données Event Hubs capturées de stockage Azure vers Azure Synapse Analytics à l’aide de Azure Event Grid et de Azure Functions

Dans ce tutoriel, vous allez migrer des données capturées Event Hubs de Stockage Blob Azure vers Azure Synapse Analytics, en particulier un pool SQL dédié, à l’aide de Azure Event Grid et de Azure Functions.

Application overview

Ce diagramme illustre le flux de travail de la solution que vous créez dans ce didacticiel :

  1. Les données envoyées à un hub d’événements Azure sont capturées dans un stockage d’objet blob Azure.
  2. Lorsque la capture de données est terminée, un événement est généré et envoyé à Azure Event Grid.
  3. Azure Event Grid transfère ces données d’événements à une application de fonction Azure.
  4. L’application de fonction utilise l’URL d’objet blob dans les données d’événement pour récupérer l’objet blob depuis le stockage.
  5. L’application de fonction effectue la migration des données blob vers Azure Synapse Analytics.

Dans cet article, vous procédez comme suit :

  • Déployer l’infrastructure requise pour le tutoriel
  • Publier du code vers une application de fonction
  • Créer un abonnement Event Grid
  • Envoyer en streaming les exemples de données vers Event Hubs
  • Vérifier les données capturées dans Azure Synapse Analytics

Prérequis

Pour suivre ce didacticiel, vous avez besoin de :

  • Cet article suppose que vous êtes familiarisé avec Event Grid et Event Hubs (en particulier la fonctionnalité Capture). Si vous n’êtes pas familiarisé avec Azure Event Grid, consultez Présentation de Azure Event Grid. Pour en savoir plus sur la fonctionnalité Capture de Azure Event Hubs, consultez Capturer des événements avec Azure Event Hubs dans Stockage Blob Azure ou Azure Data Lake Storage.
  • Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.
  • Visual Studio avec des charges de travail pour le développement de bureau .NET, le développement Azure, le développement ASP.NET et web, le développement Node.js et le développement Python.
  • Télécharger l’exemple de projet EventHubsCaptureEventGridDemo sur votre ordinateur.
    • WindTurbineDataGenerator – un éditeur simple qui envoie des exemples de données d’éoliennes à un Event Hub avec la fonctionnalité Capture activée.
    • FunctionDWDumper – Fonction Azure qui reçoit une notification d’Azure Event Grid quand un fichier Avro est capturé dans l’objet blob de stockage Azure. Elle reçoit le chemin de l’URI de l’objet blob, lit son contenu et envoie (push) ces données vers Azure Synapse Analytics (pool SQL dédié).

Déployer l’infrastructure

Dans cette étape, vous déployez l’infrastructure requise avec un modèle Resource Manager. Lorsque vous déployez le modèle, les ressources suivantes sont créées :

  • Un hub d’événements avec la fonctionnalité Capture activée.
  • Un compte de stockage pour fichiers capturés.
  • Un plan App Service pour héberger l’application de fonction.
  • Application de fonction pour traiter l’événement
  • SQL Server pour héberger l’entrepôt de données
  • Azure Synapse Analytics (pool SQL dédié) pour stocker les données migrées

Utiliser Azure CLI pour déployer l’infrastructure

  1. Connectez-vous au portail Azure.

  2. Sélectionnez le bouton Cloud Shell en haut.

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

  3. Cloud Shell s’ouvre dans la partie inférieure du navigateur.

    1. Si vous utilisez Cloud Shell pour la première fois :
      1. Si vous avez la possibilité de choisir entre Bash et PowerShell, sélectionnez Bash.

      2. Créez un compte de stockage en sélectionnant Créer un stockage. Azure Cloud Shell requiert un compte de stockage Azure pour stocker des fichiers.

        Screenshot showing the creation of storage for Cloud Shell.

      3. Attendez que le Cloud Shell soit initialisé.

        Screenshot showing the Cloud Shell initialized.

  4. Dans Cloud Shell, sélectionnez Bash comme indiqué dans l’image ci-dessus, s’il n’est pas déjà sélectionné.

  5. Créez un groupe de ressources Azure en exécutant la commande CLI suivante :

    1. Copiez et collez la commande suivante dans la fenêtre Cloud Shell. Si vous le souhaitez, modifiez le nom et l’emplacement du groupe de ressources.

      az group create -l eastus -n rgDataMigration
      
    2. Appuyez sur Entrée.

      Voici un exemple :

      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. Déployez toutes les ressources mentionnées dans la section précédente (hub d’événements, compte de stockage, application de fonction, Azure Synapse Analytics) en exécutant la commande CLI suivante :

    1. Copiez et collez la commande dans la fenêtre Cloud Shell. Vous pouvez également copier/coller la commande dans l’éditeur de votre choix, définir des valeurs, puis la copier dans Cloud Shell. Si vous voyez une erreur en raison d’un nom de ressource Azure, supprimez le groupe de ressources, corrigez le nom et réessayez la commande.

      Important

      Spécifiez des valeurs pour les entités suivantes avant d’exécuter la commande :

      • Nom du groupe de ressources créé précédemment.
      • Nom de l’espace de noms Event Hub.
      • Nom du hub d’événements. Vous pouvez laisser la valeur telle quelle (hubdatamigration).
      • Nom du serveur SQL.
      • Nom de l’utilisateur SQL et mot de passe.
      • Nom de la base de données.
      • Nom du compte de stockage.
      • Nom de l’application de fonction.
      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. Appuyez sur Entrée dans la fenêtre Cloud Shell pour exécuter la commande. Ce processus peut prendre un certain temps dans la mesure où vous créez beaucoup de ressources. Dans le résultat de la commande, assurez-vous qu’il n’y a eu aucun échec.

  7. Fermez Cloud Shell en sélectionnant le bouton Cloud Shell dans le portail (ou) le bouton X dans le coin supérieur droit de la fenêtre Cloud Shell.

Vérifier que les ressources ont été créées

  1. Dans le portail Azure, sélectionnez Groupes de ressources dans le menu de gauche.

  2. Filtrez la liste des groupes de ressources en entrant le nom de votre groupe de ressources dans la zone de recherche.

  3. Sélectionnez votre groupe de ressources dans la liste.

    Screenshot showing the selection of your resource group.

  4. Vérifiez que les ressources suivantes s’affichent dans le groupe de ressources :

    Screenshot showing resources in the resource group.

Créer une table dans Azure Synapse Analytics

Dans cette section, vous créez une table dans le pool SQL dédié que vous avez créé précédemment.

  1. Dans la liste des ressources comprises dans le groupe de ressources, sélectionnez votre pool SQL dédié.

  2. Dans la page Pool SQL dédié, dans la section Tâches courantes du menu de gauche, sélectionnez Éditeur de requêtes (préversion) .

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

  3. Entrez le nom d’utilisateur et le mot de passe du serveur SQL, puis sélectionnez OK. Si vous voyez un message concernant l’autorisation de votre client d’accéder au serveur SQL, sélectionnez Autoriser l’IP <votre adresse IP> sur le serveur <votre serveur SQL>, puis sélectionnez OK.

  4. Dans la fenêtre de requête, copiez et exécutez le script SQL suivant :

    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. Ne fermez pas cet onglet ou cette fenêtre pour pouvoir vérifier que les données ont été créées à la fin du didacticiel.

Publie l’application Azure Functions

Pour commencer, obtenez le profil de publication pour l’application de fonction à partir du portail Azure. Ensuite, utilisez le profil de publication pour publier le projet ou l’application Azure Functions à partir de Visual Studio.

Obtenir le profil de publication

  1. Dans la page Groupe de ressources, sélectionnez l’application Azure Functions dans la liste des ressources.

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

  2. Dans la page Application de fonction de votre application, sélectionnez Obtenir le profil de publication dans la barre de commandes.

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

  3. Téléchargez et enregistrez le fichier dans le sous-dossier FunctionEGDDumper du dossier EventHubsCaptureEventGridDemo.

Utiliser le profil de publication pour publier l’application Functions

  1. Lancez Visual Studio.

  2. Ouvrez la solution EventHubsCaptureEventGridDemo.sln que vous avez téléchargée depuis GitHub dans le cadre des conditions préalables. La solution se trouve dans le dossier /samples/e2e/EventHubsCaptureEventGridDemo.

  3. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet FunctionEGDWDumper, puis sélectionnez Publier.

  4. Dans l’écran suivant, sélectionnez Démarrer ou Ajouter un profil de publication.

  5. Dans la boîte de dialogue Publier, sélectionnez Importer un profil dans Cible, puis sélectionnez Suivant.

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

  6. Sous l’onglet Importer un profil, sélectionnez le fichier de paramètres de publication que vous avez enregistré précédemment dans le dossier FunctionEGDWDumper, puis sélectionnez Terminer.

  7. Lorsque Visual Studio a configuré le profil, sélectionnez Publier. Vérifiez que la publication a réussi.

  8. Dans le navigateur web où la page Azure Functions est ouverte, sélectionnez Fonctions dans le volet central. Vérifiez que la fonction EventGridTriggerMigrateData figure dans la liste. Si vous ne la voyez pas, réessayez de la publier à partir de Visual Studio, puis actualisez la page dans le portail.

    Screenshot showing the confirmation of function creation.

Après la publication de la fonction, vous êtes prêt à vous abonner à l’événement.

S’abonner à l’événement

  1. Connectez-vous au portail Azure depuis une nouvelle fenêtre ou un nouvel onglet dans un navigateur web.

  2. Dans le portail Azure, sélectionnez Groupes de ressources dans le menu de gauche.

  3. Filtrez la liste des groupes de ressources en entrant le nom de votre groupe de ressources dans la zone de recherche.

  4. Sélectionnez votre groupe de ressources dans la liste.

  5. Sélectionnez l’espace de noms Event Hubs dans la liste des ressources.

  6. Dans la page Espace de noms Event Hubs , sélectionnez Événements dans le menu de gauche, puis sélectionnez + Abonnement aux événements dans la barre d’outils.

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

  7. Dans la page Créer un abonnement aux événements, effectuez les étapes suivantes :

    1. Entrez un nom pour l’abonnement aux événements.

    2. Entrez un nom pour la rubrique système. Une rubrique système fournit un point de terminaison permettant l’envoi d’événements par l’expéditeur. Pour plus d’informations, consultez Rubriques système

    3. Comme Type de point de terminaison, sélectionnez Fonction Azure.

    4. Pour Point de terminaison, sélectionnez le lien.

    5. Dans la page Sélectionner une fonction Azure, effectuez les étapes suivantes pour les options qui ne sont pas automatiquement renseignées.

      1. Sélectionnez l’abonnement Azure qui contient la fonction Azure.
      2. Sélectionnez le groupe de ressources pour la fonction.
      3. Sélectionnez l’application de fonction.
      4. Sélectionnez l’emplacement de déploiement.
      5. Sélectionnez la fonction EventGridTriggerMigrateData.
    6. Dans la page Sélectionner une fonction Azure, sélectionnez Confirmer la sélection.

    7. Ensuite, dans la page Créer un abonnement aux événements, sélectionnez Créer.

      Screenshot of the Create an event subscription page.

  8. Vérifiez que l’abonnement aux événements a été créé. Accédez à l’onglet Abonnements aux événements dans la page Événements de l’espace de noms Event Hubs.

    Screenshot showing the Event Subscriptions tab on the Events page.

Exécuter l’application pour générer des données

Vous avez terminé de configurer le hub d’événements, le pool SQL dédié (anciennement SQL Data Warehouse), l’application de fonction Azure et l’abonnement aux événements. Avant d’exécuter une application qui génère des données pour le hub d’événements, vous devez configurer certaines valeurs.

  1. Dans le portail Azure, accédez à votre groupe de ressources comme précédemment.

  2. Sélectionner l’espace de noms Event Hubs.

  3. Sur la page Espace de noms Event Hubs, cliquez sur Stratégies d’accès partagé dans le menu de gauche.

  4. Sélectionnez RootManageSharedAccessKey dans la liste des stratégies.

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

  5. Cliquez sur le bouton copier à côté de la zone de texte Clé primaire de la chaîne de connexion.

  6. Retournez à votre solution Visual Studio.

  7. Cliquez avec le bouton droit sur le projet WindTurbineDataGenerator, puis sélectionnez Définir comme projet de démarrage.

  8. Dans le projet WindTurbineDataGenerator, ouvrez program.cs.

  9. Remplacez <EVENT HUBS NAMESPACE CONNECTION STRING> par la chaîne de connexion que vous avez copiée du portail.

  10. Si vous avez utilisé un nom autre que hubdatamigration pour le hub d’événements, remplacez <EVENT HUB NAME> par le nom du hub d’événements.

    private const string EventHubConnectionString = "Endpoint=sb://demomigrationnamespace.servicebus.windows.net/...";
    private const string EventHubName = "hubdatamigration";
    
  11. Générez la solution. Exécutez l’application WindTurbineGenerator.exe.

  12. Après quelques minutes, dans l’autre onglet de navigateur où la fenêtre de requête est ouverte, interrogez la table dans votre entrepôt de données pour obtenir les données migrées.

    select * from [dbo].[Fact_WindTurbineMetrics]
    

    Screenshot showing the query results.

Surveiller la solution

Cette section vous montre comment superviser la solution ou résoudre les problèmes que vous rencontrez avec elle.

Afficher les données capturées dans le compte de stockage

  1. Accédez au groupe de ressources et sélectionnez le compte de stockage utilisé pour capturer les données d’événement.

  2. Dans la page Compte de stockage, sélectionnez Navigateur de stockage dans le menu de gauche.

  3. Développez CONTENEURS BLOB, puis sélectionnez windturbinecapture.

  4. Ouvrez le dossier du même nom que votre espace de noms Event Hubs dans le volet droit.

  5. Ouvrez le dossier du même nom que votre hub d’événements (hubdatamigration).

  6. Explorez les dossiers pour trouver les fichiers AVRO. Voici un exemple :

    Screenshot showing the captured file in the storage.

Vérifier que le déclencheur Event Grid a appelé la fonction

  1. Accédez au groupe de ressources et sélectionnez l’application de fonction.

  2. Sélectionnez l’onglet Fonctions dans le volet central.

  3. Sélectionnez la fonction EventGridTriggerMigrateData dans la liste.

  4. Dans la page Fonction, sélectionnez Superviser dans le menu de gauche.

  5. Sélectionnez Configurer pour configurer Application Insights afin de capturer les journaux d’appels.

  6. Créez une ressource Application Insights ou utilisez une ressource existante.

  7. Revenez à la page Superviser pour la fonction.

  8. Vérifiez que l’application cliente (WindTurbineDataGenerator) qui envoie les événements est toujours en cours d’exécution. Si ce n’est pas le cas, réexécutez-la.

  9. Patientez quelques minutes (au moins 5) et sélectionnez le bouton Actualiser pour voir les appels de fonction.

    Screenshot showing the Function invocations.

  10. Sélectionnez un appel pour en voir les détails.

    Event Grid distribue des données d’événement pour les abonnés. L’exemple suivant montre les données d’événement générées lorsque des données en diffusion via un hub d’événements sont capturées dans un objet blob. Notez en particulier que la propriété fileUrl dans l’objet data pointe vers l’objet blob dans le stockage. L’application de fonction utilise cette URL pour récupérer le fichier blob avec des données capturées.

    {
      "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"
    }
    

Vérifier que les données sont stockées dans le pool SQL dédié

Sous l’onglet du navigateur où la fenêtre de requête est ouverte, interrogez la table dans votre pool SQL dédié pour obtenir les données migrées.

Screenshot showing the final query results.

Étapes suivantes