Tutorial: Transmitir Big Data para um data warehouse

A Grade de Eventos do Azure é um serviço de roteamento de evento inteligente que permite que você reaja às notificações ou aos eventos de aplicativos e serviços. Por exemplo, ele pode disparar uma Função do Azure para processar dados dos Hubs de Eventos capturados em um Armazenamento de Blobs ou Data Lake Storage. Este exemplo mostra como usar a Grade de Eventos e o Azure Functions para migrar dados capturados pelos Hubs de Eventos do Armazenamento de Blobs para o Azure Synapse Analytics, especificamente para um pool de SQL dedicado.

Application overview

Este diagrama ilustra o fluxo de trabalho da solução que você cria neste tutorial:

  1. Dados enviados para um hub de eventos do Azure são capturados no Armazenamento de Blobs do Azure.
  2. Quando a captura de dados for concluída, um evento será gerado e enviado para a Grade de Eventos do Azure.
  3. A Grade de Eventos do Azure encaminha os dados desse evento para um aplicativo de funções do Azure.
  4. O aplicativo de funções usa a URL do blob nos dados do evento para recuperar o blob do armazenamento.
  5. O aplicativo de funções migra os dados de blob para um Azure Synapse Analytics.

Neste artigo, você executa as seguintes etapas:

  • Implantar a infraestrutura necessária para o tutorial
  • Publicar o código em um aplicativo do Functions
  • Criar uma assinatura na Grade de Eventos
  • Transmitir dados de exemplo aos Hubs de Eventos
  • Verificar dados capturados no Azure Synapse Analytics

Pré-requisitos

Para concluir este tutorial, você deve ter:

  • Uma assinatura do Azure. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
  • Visual Studio com cargas de trabalho para: desenvolvimento de área de trabalho do .NET, desenvolvimento do Azure, desenvolvimento de Web e ASP.NET, desenvolvimento de Node.js e desenvolvimento do Python.
  • Baixe o projeto de exemplo EventHubsCaptureEventGridDemo para seu computador.
    • WindTurbineDataGenerator – um editor simples que envia dados de exemplo de turbina eólica para um hub de eventos habilitado para captura
    • FunctionDWDumper – Uma Função do Azure que recebe uma notificação da Grade de Eventos do Azure quando um arquivo Avro é capturado no blob do Armazenamento do Microsoft Azure. Ela recebe o caminho do URI do blob, lê o conteúdo dele e efetua push desses dados para o Azure Synapse Analytics (pool de SQL dedicado).

Implantar a infraestrutura

Nesta etapa, você implanta a infraestrutura necessária com um modelo do Resource Manager. Quando você implanta o modelo, são criados os seguintes recursos:

  • Hub de Eventos com o recurso Captura habilitado.
  • Conta de armazenamento para os arquivos capturados.
  • Plano de serviço de aplicativo para hospedar o aplicativo de função
  • Aplicativo de funções para o processamento do evento
  • SQL Server para hospedagem do data warehouse
  • Azure Synapse Analytics (pool de SQL dedicado) para armazenar os dados migrados

Usar a CLI do Azure para implantar a infraestrutura

  1. Entre no portal do Azure.

  2. Selecione o botão Cloud Shell na parte superior.

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

  3. Você verá que o Cloud Shell será aberto na parte inferior do navegador.

    1. Se estiver usando o Cloud Shell pela primeira vez:
      1. Se você vir uma opção para selecionar entre Bash e PowerShell, selecione Bash.

        Screenshot of Cloud Shell with Bash selected.

      2. Crie uma conta de armazenamento selecionando Criar armazenamento. O Azure Cloud Shell requer uma conta de armazenamento do Azure para armazenar alguns arquivos.

        Screenshot showing the creation of storage for Cloud Shell.

      3. Aguarde até o Cloud Shell ser inicializado.

        Screenshot showing the Cloud Shell initialized.

  4. No Cloud Shell, selecione Bash, conforme mostrado na imagem acima, caso ainda não tenha sido selecionado.

  5. Crie um grupo de recursos do Azure executando o seguinte comando da CLI:

    1. Copie e cole o seguinte comando na janela do Cloud Shell. Altere o nome e a localização do grupo de recursos, se desejar.

      az group create -l eastus -n rgDataMigration
      
    2. Pressione ENTER.

      Veja um exemplo:

      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. Implante todos os recursos mencionados na seção anterior (hub de eventos, conta de armazenamento, aplicativo de funções, o Azure Synapse Analytics) executando o seguinte comando da CLI:

    1. Copie e cole o comando na janela do Cloud Shell. Como alternativa, talvez você queira copiar/colar em um editor de sua escolha, definir valores e, em seguida, copiar o comando para o Cloud Shell.

      Importante

      Especifique valores para as seguintes entidades antes de executar o comando:

      • Nome do grupo de recursos criado anteriormente.
      • Nome para o namespace do hub de eventos.
      • Nome do hub de eventos. Você pode deixar o valor como está (hubdatamigration).
      • Nome para o SQL Server.
      • Nome do usuário do SQL e senha.
      • Nome para o banco de dados.
      • Nome da conta de armazenamento.
      • Nome do aplicativo de funções.
      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. Pressione ENTER na janela do Cloud Shell para executar o comando. Esse processo pode demorar um pouco, pois você está criando um monte de recursos. No resultado do comando, verifique se não houve falhas.

  7. Feche o Cloud Shell selecionando o botão Cloud Shell no portal (ou) o botão X no canto superior direito da janela do Cloud Shell.

Verifique se os recursos são criados

  1. No portal do Azure, selecione Grupos de recursos no menu esquerdo.

  2. Filtre a lista de grupos de recursos digitando o nome do seu grupo de recursos na caixa de pesquisa.

  3. Selecione seu grupo de recursos na lista.

    Screenshot showing the selection of your resource group.

  4. Confirme que você vê os seguintes recursos no grupo de recursos:

    Screenshot showing resources in the resource group.

Criar uma tabela no Azure Synapse Analytics

Nesta seção, você cria uma tabela no pool de SQL dedicado criado anteriormente.

  1. Na lista de recursos no grupo de recursos, selecione seu pool de SQL dedicado.

  2. Na página Pool de SQL dedicado, na seção Tarefas Comuns no menu à esquerda, selecione Editor de consultas (versão prévia) .

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

  3. Insira o nome de usuário e senha para o SQL Server e selecione OK. Se você vir uma mensagem sobre permitir que o cliente acesse o SQL Server, siga estas etapas:

    1. Selecione o link: Definir firewall do servidor.
    2. Na página Configurações do firewall, selecione Adicionar IP do cliente na barra de ferramentas e selecione Salvar na barra de ferramentas.
    3. Selecione OK na mensagem de sucesso.
    4. Navegue de volta para a página Pool de SQL dedicado e selecione Editor de consultas (versão prévia) no menu à esquerda.
    5. Insira o usuário e a senha e selecione OK.
  4. Na janela de consulta, copie e execute o seguinte script SQL:

    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. Mantenha essa guia ou janela aberta para que você possa verificar se os dados são criados no final do tutorial.

Publicar o aplicativo do Azure Functions

Primeiro, obtenha o perfil de publicação do aplicativo de Funções no portal do Azure. Em seguida, use o perfil de publicação para publicar o projeto ou aplicativo do Azure Functions no Visual Studio.

Obter o perfil de publicação

  1. Na página Grupo de Recursos, selecione o aplicativo Azure Functions na lista de recursos.

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

  2. Na página Aplicativo de Funções do aplicativo, selecione Obter perfil de publicação na barra de comandos.

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

  3. Baixe e salve o arquivo na subpasta FunctionEGDDumper da pasta EventHubsCaptureEventGridDemo.

Usar o perfil de publicação para publicar o aplicativo de Funções

  1. Inicie o Visual Studio.

  2. Abra a solução EventHubsCaptureEventGridDemo.sln que você baixou do GitHub como parte dos pré-requisitos. Você pode encontrá-la na pasta /samples/e2e/EventHubsCaptureEventGridDemo.

  3. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto FunctionEGDWDumper e selecione Publicar.

  4. Na tela a seguir, selecione Iniciar ou Adicionar um perfil de publicação.

  5. Na caixa de diálogo Publicar, selecione Importar Perfil como Destino e Avançar.

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

  6. Na guia Importar perfil, selecione o arquivo de configurações de publicação que você salvou anteriormente na pasta FunctionEGDWDumper e, em seguida, selecione Concluir.

  7. Quando o Visual Studio tiver configurado o perfil, selecione Publicar. Confirme se a publicação foi bem-sucedida.

  8. No navegador da Web em que a página Azure Functions está aberta, selecione Funções no menu à esquerda. Confirme se a função EventGridTriggerMigrateData aparece na lista. Se não a vir, tente publicar no Visual Studio novamente e atualize a página no portal.

    Screenshot showing the confirmation of function creation.

Depois de publicar a função, você estará pronto para assinar o evento.

Assinar o evento

  1. Em uma nova guia ou em uma nova janela de um navegador da Web, navegue até o portal do Azure.

  2. No portal do Azure, selecione Grupos de recursos no menu esquerdo.

  3. Filtre a lista de grupos de recursos digitando o nome do seu grupo de recursos na caixa de pesquisa.

  4. Selecione seu grupo de recursos na lista.

  5. Selecione o namespace dos Hubs de Eventos na lista de recursos.

  6. Na página Namespace dos Hubs de Eventos, selecione Eventos no menu à esquerda e selecione + Assinatura de Evento na barra de ferramentas.

    Add event subscription link on the Events page for an Event Hubs namespace

  7. Na página Criar Assinatura de Eventos, siga estas etapas:

    1. Insira um nome para a assinatura de evento.

    2. Insira um nome para o tópico do sistema. Um tópico do sistema fornece um ponto de extremidade para que o remetente envie eventos. Para saber mais, confira Tópicos do sistema

    3. Para o Tipo de ponto de extremidade, selecione Função do Azure.

    4. Para Ponto de extremidade, selecione o link.

    5. Na página Selecionar Função do Azure, siga estas etapas se elas não forem realizadas automaticamente.

      1. Selecione a assinatura do Azure que tem a função do Azure.
      2. Selecione o grupo de recursos para a função.
      3. Selecione o aplicativo de funções.
      4. Selecione o slot de implantação.
      5. Selecione a função EventGridTriggerMigrateData.
    6. Na página Selecionar Função do Azure, selecione Confirmar Seleção.

    7. Em seguida, volte para a página Criar Assinatura de Evento e selecione Criar.

      Create an event subscription using the function

  8. Verifique se a assinatura do evento foi criada. Alterne para a guia Assinaturas de Evento na página Eventos para o namespace dos Hubs de Eventos.

    Confirm event subscription

  9. Selecione o Plano do Serviço de Aplicativo (não o Serviço de Aplicativo) na lista de recursos no grupo de recursos.

Executar o aplicativo para gerar dados

Você terminou de configurar o hub de eventos, o pool de SQL dedicado (antigo SQL Data Warehouse), o aplicativo de funções do Azure e a assinatura de evento. Antes de executar um aplicativo que gere dados para o hub de eventos, você precisa configurar alguns valores.

  1. No portal do Azure, navegue até o grupo de recursos como fez anteriormente.

  2. Selecione o namespace Hubs de Eventos.

  3. Na página Namespace de Hubs de Eventos, selecione Políticas de acesso compartilhado no menu à esquerda.

  4. Selecione RootManageSharedAccessKey na lista de políticas.

    Shared access policies page for an Event Hubs namespace

  5. Selecione o botão Copiar ao lado da caixa de texto Chave primária da cadeia de conexão.

  6. Volte para sua solução do Visual Studio.

  7. Clique com o botão direito do mouse no projeto WindTurbineDataGenerator e selecione Definir como projeto de inicialização.

  8. No projeto WindTurbineDataGenerator, abra program.cs.

  9. Substitua <EVENT HUBS NAMESPACE CONNECTION STRING> pela cadeia de conexão copiada do portal.

  10. Se você tiver usado um nome diferente para o hub de eventos que não seja hubdatamigration, substitua <EVENT HUB NAME> pelo nome do hub de eventos.

    private const string EventHubConnectionString = "Endpoint=sb://demomigrationnamespace.servicebus.windows.net/...";
    private const string EventHubName = "hubdatamigration";
    
  11. Compile a solução. Execute o aplicativo WindTurbineGenerator.exe.

  12. Após alguns minutos, na outra guia do navegador em que você tem a janela de consulta aberta, consulte a tabela no data warehouse com os dados migrados.

    select * from [dbo].[Fact_WindTurbineMetrics]    
    

    Query results

Monitorar a solução

Esta seção ajuda você com o monitoramento ou a solução de problemas da solução.

Exibir dados capturados na conta de armazenamento

  1. Navegue até o grupo de recursos e selecione a conta de armazenamento usada para capturar dados de evento.

  2. Na página Conta de armazenamento, selecione Gerenciador de Armazenamento (versão prévia) no menu esquerdo.

  3. Expanda CONTÊINERES DE BLOB e selecione windturbinecapture.

  4. Abra a pasta com o mesmo nome que o seu Namespace dos Hubs de Eventos no painel direito.

  5. Abra a pasta com o mesmo nome que o seu hub de eventos (hubdatamigration).

  6. Execute uma consulta drill-through das pastas e veja os arquivos AVRO. Veja um exemplo:

    Captured file in the storage

Verifique se o gatilho da Grade de Eventos invocou a função

  1. Navegue até o grupo de recursos e selecione o aplicativo de funções.

  2. Selecione Funções no menu esquerdo.

  3. Selecione a função EventGridTriggerMigrateData na lista.

  4. Na página Função, selecione Monitor no menu esquerdo.

  5. Selecione Configurar para configurar o Application Insights para capturar logs de invocação.

  6. Crie um recurso do Application Insights ou use um existente.

  7. Navegue de volta para a página Monitor da função.

  8. Confirme se o aplicativo cliente (WindTurbineDataGenerator) que está enviando os eventos ainda está em execução. Se não estiver, execute o aplicativo.

  9. Aguarde alguns minutos (5 minutos ou mais) e selecione o botão Atualizar para ver as invocações de função.

    Function invocations

  10. Selecione uma invocação para ver os detalhes.

    A Grade de Eventos distribui os dados do evento para os assinantes. O exemplo a seguir mostra os dados de evento gerados quando os dados sendo transmitidos por um hub de eventos são capturados em um blob. Em particular, observe se a propriedade fileUrl no objeto data aponta para o blob no armazenamento. O aplicativo de funções usa essa URL para recuperar o arquivo de blob com os dados capturados.

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

Verifique se os dados estão armazenados no pool de SQL dedicado

Na guia do navegador em que você tem a janela de consulta aberta, consulte a tabela no pool de SQL dedicado para os dados migrados.

Query results

Próximas etapas