Copy data from Azure Blob to Azure SQL Database using Azure Data Factory (Copiar dados do Blob do Azure para a Base de Dados SQL do Azure com o Azure Data Factory)

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Gorjeta

Experimente o Data Factory no Microsoft Fabric, uma solução de análise tudo-em-um para empresas. O Microsoft Fabric abrange tudo, desde a movimentação de dados até ciência de dados, análises em tempo real, business intelligence e relatórios. Saiba como iniciar uma nova avaliação gratuitamente!

Neste tutorial, vai criar um pipeline do Data Factory que copia dados do Armazenamento de Blobs do Azure para a Base de Dados SQL do Azure. O padrão de configuração neste tutorial aplica-se à cópia a partir de um arquivo de dados baseado em ficheiros para um arquivo de dados relacional. Para obter uma lista de armazenamentos de dados suportados como fontes e coletores, consulte Armazenamentos e formatos de dados suportados.

Você executa as seguintes etapas neste tutorial:

  • Criar uma fábrica de dados.
  • Criar os serviços ligados Armazenamento do Microsoft Azure e Base de Dados SQL do Azure.
  • Criar os conjuntos de dados Blob do Azure e Base de Dados SQL do Azure.
  • Criar um pipeline que contém uma atividade de cópia.
  • Iniciar uma execução de pipeline.
  • Monitorizar o pipeline e execuções de atividades.

Este tutorial utiliza o .NET SDK. Você pode usar outros mecanismos para interagir com o Azure Data Factory; consulte exemplos em Inícios rápidos.

Se não tiver uma subscrição do Azure, crie uma conta do Azure gratuita antes de começar.

Pré-requisitos

  • Conta do Armazenamento do Azure. Utilize o armazenamento de blobs como arquivo de dados de origem. Se você não tiver uma conta de armazenamento do Azure, consulte Criar uma conta de armazenamento de uso geral.
  • Base de Dados SQL do Azure. Pode utilizar a base de dados como arquivo de dados sink. Se você não tiver um banco de dados no Banco de Dados SQL do Azure, consulte Criar um banco de dados no Banco de Dados SQL do Azure.
  • Visual Studio. O passo a passo neste artigo usa o Visual Studio 2019.
  • SDK do Azure para .NET.
  • Aplicação Microsoft Entra. Se você não tiver um aplicativo Microsoft Entra, consulte a seção Criar um aplicativo Microsoft Entra de Como: Usar o portal para criar um aplicativo Microsoft Entra. Copie os seguintes valores para uso em etapas posteriores: ID do aplicativo (cliente), chave de autenticação e ID do diretório (locatário). Atribua o aplicativo à função de Colaborador seguindo as instruções no mesmo artigo.

Criar um blob e uma tabela SQL

Agora, prepare seu Blob do Azure e o Banco de Dados SQL do Azure para o tutorial criando um blob de origem e uma tabela SQL de coletor.

Criar um blob de origem

Primeiro, crie um blob de origem criando um contêiner e carregando um arquivo de texto de entrada para ele:

  1. Abra o Bloco de Notas. Copie o texto a seguir e salve-o localmente em um arquivo chamado inputEmp.txt.

    John|Doe
    Jane|Doe
    
  2. Use uma ferramenta como o Gerenciador de Armazenamento do Azure para criar o contêiner adfv2tutorial e carregar o arquivo inputEmp.txt no contêiner.

Criar uma tabela SQL sink

Em seguida, crie uma tabela SQL de coletor:

  1. Utilize o seguinte script SQL para criar a tabela dbo.emp na Base de Dados SQL do Azure.

    CREATE TABLE dbo.emp
    (
        ID int IDENTITY(1,1) NOT NULL,
        FirstName varchar(50),
        LastName varchar(50)
    )
    GO
    
    CREATE CLUSTERED INDEX IX_emp_ID ON dbo.emp (ID);
    
  2. Permitir que os serviços do Azure acessem o Banco de Dados SQL. Certifique-se de permitir o acesso aos serviços do Azure em seu servidor para que o serviço Data Factory possa gravar dados no Banco de Dados SQL. Para verificar e ativar desta definição, execute os passos seguintes:

    1. Vá para o portal do Azure para gerenciar seu servidor SQL. Procure e selecione servidores SQL.

    2. Selecione seu servidor.

    3. No cabeçalho Segurança do menu SQL Server, selecione Firewalls e redes virtuais.

    4. Na página Firewall e redes virtuais, em Permitir que os serviços e recursos do Azure acessem este servidor, selecione ATIVADO.

Criar um projeto do Visual Studio

Usando o Visual Studio, crie um aplicativo de console C# .NET.

  1. Abra o Visual Studio.
  2. Na janela Iniciar, selecione Criar um novo projeto.
  3. Na janela Criar um novo projeto, escolha a versão em C# do Aplicativo de Console (.NET Framework) na lista de tipos de projeto. Em seguida, selecione Seguinte.
  4. Na janela Configurar seu novo projeto, insira um nome de projeto de ADFv2Tutorial. Em Local, procure e/ou crie o diretório no qual salvar o projeto. Depois, selecione Criar. O novo projeto aparece no IDE do Visual Studio.

Instalar pacotes NuGet

Em seguida, instale os pacotes de biblioteca necessários usando o gerenciador de pacotes NuGet.

  1. Na barra de menus, escolha Ferramentas>NuGet Package Manager Package Manager>Console.

  2. No painel Console do Gerenciador de Pacotes, execute os seguintes comandos para instalar pacotes. Para obter informações sobre o pacote NuGet do Azure Data Factory, consulte Microsoft.Azure.Management.DataFactory.

    Install-Package Microsoft.Azure.Management.DataFactory
    Install-Package Microsoft.Azure.Management.ResourceManager -PreRelease
    Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
    

Criar um cliente de fábrica de dados

Siga estas etapas para criar um cliente de data factory.

  1. Abra Program.cs e substitua as instruções existentes using pelo código a seguir para adicionar referências a namespaces.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Rest;
    using Microsoft.Rest.Serialization;
    using Microsoft.Azure.Management.ResourceManager;
    using Microsoft.Azure.Management.DataFactory;
    using Microsoft.Azure.Management.DataFactory.Models;
    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    
  2. Adicione o seguinte código ao Main método que define variáveis. Substitua os 14 espaços reservados pelos seus próprios valores.

    Para ver a lista de regiões do Azure nas quais o Data Factory está atualmente disponível, consulte Produtos disponíveis por região. Na lista suspensa Produtos, escolha Procurar>>Analytics Data Factory. Em seguida, na lista suspensa Regiões , escolha as regiões que lhe interessam. Uma grade é exibida com o status de disponibilidade dos produtos Data Factory para as regiões selecionadas.

    Nota

    Armazenamentos de dados, como o Armazenamento do Azure e o Banco de Dados SQL do Azure, e cálculos, como o HDInsight, que o Data Factory usa podem estar em outras regiões além do que você escolher para o Data Factory.

    // Set variables
    string tenantID = "<your tenant ID>";
    string applicationId = "<your application ID>";
    string authenticationKey = "<your authentication key for the application>";
    string subscriptionId = "<your subscription ID to create the factory>";
    string resourceGroup = "<your resource group to create the factory>";
    
    string region = "<location to create the data factory in, such as East US>";
    string dataFactoryName = "<name of data factory to create (must be globally unique)>";
    
    // Specify the source Azure Blob information
    string storageAccount = "<your storage account name to copy data>";
    string storageKey = "<your storage account key>";
    string inputBlobPath = "adfv2tutorial/";
    string inputBlobName = "inputEmp.txt";
    
    // Specify the sink Azure SQL Database information
    string azureSqlConnString =
        "Server=tcp:<your server name>.database.windows.net,1433;" +
        "Database=<your database name>;" +
        "User ID=<your username>@<your server name>;" +
        "Password=<your password>;" +
        "Trusted_Connection=False;Encrypt=True;Connection Timeout=30";
    string azureSqlTableName = "dbo.emp";
    
    string storageLinkedServiceName = "AzureStorageLinkedService";
    string sqlDbLinkedServiceName = "AzureSqlDbLinkedService";
    string blobDatasetName = "BlobDataset";
    string sqlDatasetName = "SqlDataset";
    string pipelineName = "Adfv2TutorialBlobToSqlCopy";
    
  3. Adicione o seguinte código ao Main método que cria uma instância de DataFactoryManagementClient classe. Utilize este objeto para criar uma fábrica de dados, um serviço ligado, os conjuntos de dados e um pipeline. Também pode utilizar este objeto para monitorizar os detalhes de execução do pipeline.

    // Authenticate and create a data factory management client
    var context = new AuthenticationContext("https://login.windows.net/" + tenantID);
    ClientCredential cc = new ClientCredential(applicationId, authenticationKey);
    AuthenticationResult result = context.AcquireTokenAsync(
        "https://management.azure.com/", cc
    ).Result;
    ServiceClientCredentials cred = new TokenCredentials(result.AccessToken);
    var client = new DataFactoryManagementClient(cred) { SubscriptionId = subscriptionId };
    

Criar uma fábrica de dados

Adicione o seguinte código ao Main método que cria uma fábrica de dados.

// Create a data factory
Console.WriteLine("Creating a data factory " + dataFactoryName + "...");
Factory dataFactory = new Factory
{
    Location = region,
    Identity = new FactoryIdentity()
};

client.Factories.CreateOrUpdate(resourceGroup, dataFactoryName, dataFactory);
Console.WriteLine(
    SafeJsonConvert.SerializeObject(dataFactory, client.SerializationSettings)
);

while (
    client.Factories.Get(
        resourceGroup, dataFactoryName
    ).ProvisioningState == "PendingCreation"
)
{
    System.Threading.Thread.Sleep(1000);
}

Criar serviços ligados

Neste tutorial, você cria dois serviços vinculados para a origem e o coletor, respectivamente.

Criar um serviço ligado do Armazenamento do Azure

Adicione o código a seguir ao Main método que cria um serviço vinculado do Armazenamento do Azure. Para obter informações sobre propriedades e detalhes com suporte, consulte Propriedades do serviço vinculado de Blob do Azure.

// Create an Azure Storage linked service
Console.WriteLine("Creating linked service " + storageLinkedServiceName + "...");

LinkedServiceResource storageLinkedService = new LinkedServiceResource(
    new AzureStorageLinkedService
    {
        ConnectionString = new SecureString(
            "DefaultEndpointsProtocol=https;AccountName=" + storageAccount +
            ";AccountKey=" + storageKey
        )
    }
);

client.LinkedServices.CreateOrUpdate(
    resourceGroup, dataFactoryName, storageLinkedServiceName, storageLinkedService
);
Console.WriteLine(
    SafeJsonConvert.SerializeObject(storageLinkedService, client.SerializationSettings)
);

Criar um serviço ligado da Base de Dados SQL do Azure

Adicione o código a seguir ao Main método que cria um serviço vinculado do Banco de Dados SQL do Azure. Para obter informações sobre propriedades e detalhes com suporte, consulte Propriedades do serviço vinculado do Banco de Dados SQL do Azure.

// Create an Azure SQL Database linked service
Console.WriteLine("Creating linked service " + sqlDbLinkedServiceName + "...");

LinkedServiceResource sqlDbLinkedService = new LinkedServiceResource(
    new AzureSqlDatabaseLinkedService
    {
        ConnectionString = new SecureString(azureSqlConnString)
    }
);

client.LinkedServices.CreateOrUpdate(
    resourceGroup, dataFactoryName, sqlDbLinkedServiceName, sqlDbLinkedService
);
Console.WriteLine(
    SafeJsonConvert.SerializeObject(sqlDbLinkedService, client.SerializationSettings)
);

Criar conjuntos de dados

Nesta seção, você cria dois conjuntos de dados: um para a origem, outro para o coletor.

Criar um conjunto de dados para o Blob do Azure de origem

Adicione o código a seguir ao Main método que cria um conjunto de dados de blob do Azure. Para obter informações sobre propriedades e detalhes com suporte, consulte Propriedades do conjunto de dados do Blob do Azure.

Defina um conjunto de dados que represente os dados de origem no Blob do Azure. Este conjunto de dados do Blob refere-se ao serviço ligado de Armazenamento do Microsoft Azure que criou no passo anterior e descreve:

  • A localização do blob a ser copiado: FolderPath e FileName
  • O formato de blob que indica como analisar o conteúdo: TextFormat e suas configurações, como delimitador de coluna
  • A estrutura de dados, incluindo nomes de colunas e tipos de dados, que são mapeados neste exemplo para a tabela SQL do coletor
// Create an Azure Blob dataset
Console.WriteLine("Creating dataset " + blobDatasetName + "...");
DatasetResource blobDataset = new DatasetResource(
    new AzureBlobDataset
    {
        LinkedServiceName = new LinkedServiceReference {
            ReferenceName = storageLinkedServiceName
        },
        FolderPath = inputBlobPath,
        FileName = inputBlobName,
        Format = new TextFormat { ColumnDelimiter = "|" },
        Structure = new List<DatasetDataElement>
        {
            new DatasetDataElement { Name = "FirstName", Type = "String" },
            new DatasetDataElement { Name = "LastName", Type = "String" }
        }
    }
);

client.Datasets.CreateOrUpdate(
    resourceGroup, dataFactoryName, blobDatasetName, blobDataset
);
Console.WriteLine(
    SafeJsonConvert.SerializeObject(blobDataset, client.SerializationSettings)
);

Criar um conjunto de dados para o Base de Dados SQL do Azure

Adicione o código a seguir ao Main método que cria um conjunto de dados do Banco de Dados SQL do Azure. Para obter informações sobre propriedades e detalhes com suporte, consulte Propriedades do conjunto de dados do Banco de Dados SQL do Azure.

Defina um conjunto de dados que representa os dados sink na Base de Dados SQL do Azure. Este conjunto de dados refere-se ao serviço vinculado do Banco de Dados SQL do Azure que você criou na etapa anterior. Também especifica a tabela SQL que contém os dados copiados.

// Create an Azure SQL Database dataset
Console.WriteLine("Creating dataset " + sqlDatasetName + "...");
DatasetResource sqlDataset = new DatasetResource(
    new AzureSqlTableDataset
    {
        LinkedServiceName = new LinkedServiceReference
        {
            ReferenceName = sqlDbLinkedServiceName
        },
        TableName = azureSqlTableName
    }
);

client.Datasets.CreateOrUpdate(
    resourceGroup, dataFactoryName, sqlDatasetName, sqlDataset
);
Console.WriteLine(
    SafeJsonConvert.SerializeObject(sqlDataset, client.SerializationSettings)
);

Criar um pipeline

Adicione o código a seguir ao Main método que cria um pipeline com uma atividade de cópia. Neste tutorial, esse pipeline contém uma atividade: CopyActivity, que inclui o conjunto de dados Blob como fonte e o conjunto de dados SQL como coletor. Para obter informações sobre detalhes da atividade de cópia, consulte Copiar atividade no Azure Data Factory.

// Create a pipeline with copy activity
Console.WriteLine("Creating pipeline " + pipelineName + "...");
PipelineResource pipeline = new PipelineResource
{
    Activities = new List<Activity>
    {
        new CopyActivity
        {
            Name = "CopyFromBlobToSQL",
            Inputs = new List<DatasetReference>
            {
                new DatasetReference() { ReferenceName = blobDatasetName }
            },
            Outputs = new List<DatasetReference>
            {
                new DatasetReference { ReferenceName = sqlDatasetName }
            },
            Source = new BlobSource { },
            Sink = new SqlSink { }
        }
    }
};

client.Pipelines.CreateOrUpdate(resourceGroup, dataFactoryName, pipelineName, pipeline);
Console.WriteLine(
    SafeJsonConvert.SerializeObject(pipeline, client.SerializationSettings)
);

Criar uma execução de pipeline

Adicione o seguinte código ao Main método que dispara uma execução de pipeline.

// Create a pipeline run
Console.WriteLine("Creating pipeline run...");
CreateRunResponse runResponse = client.Pipelines.CreateRunWithHttpMessagesAsync(
    resourceGroup, dataFactoryName, pipelineName
).Result.Body;
Console.WriteLine("Pipeline run ID: " + runResponse.RunId);

Monitorizar uma execução de pipeline

Agora insira o código para verificar os estados de execução do pipeline e obter detalhes sobre a atividade de cópia executada.

  1. Adicione o seguinte código ao Main método para verificar continuamente os status da execução do pipeline até que ele termine de copiar os dados.

    // Monitor the pipeline run
    Console.WriteLine("Checking pipeline run status...");
    PipelineRun pipelineRun;
    while (true)
    {
        pipelineRun = client.PipelineRuns.Get(
            resourceGroup, dataFactoryName, runResponse.RunId
        );
        Console.WriteLine("Status: " + pipelineRun.Status);
        if (pipelineRun.Status == "InProgress")
            System.Threading.Thread.Sleep(15000);
        else
            break;
    }
    
  2. Adicione o código a seguir ao Main método que recupera detalhes de execução da atividade de cópia, como o tamanho dos dados que foram lidos ou gravados.

    // Check the copy activity run details
    Console.WriteLine("Checking copy activity run details...");
    
    RunFilterParameters filterParams = new RunFilterParameters(
        DateTime.UtcNow.AddMinutes(-10), DateTime.UtcNow.AddMinutes(10)
    );
    
    ActivityRunsQueryResponse queryResponse = client.ActivityRuns.QueryByPipelineRun(
        resourceGroup, dataFactoryName, runResponse.RunId, filterParams
    );
    
    if (pipelineRun.Status == "Succeeded")
    {
        Console.WriteLine(queryResponse.Value.First().Output);
    }
    else
        Console.WriteLine(queryResponse.Value.First().Error);
    
    Console.WriteLine("\nPress any key to exit...");
    Console.ReadKey();
    

Executar o código

Crie o aplicativo escolhendo Build>Build Solution. Em seguida, inicie o aplicativo escolhendo Depurar>Iniciar Depuração e verifique a execução do pipeline.

A consola imprime o progresso da criação de uma fábrica de dados, do serviço ligado, dos conjuntos de dados, do pipeline e da execução de pipeline. Em seguida, verifica o estado de execução do pipeline. Aguarde até ver os detalhes da execução da atividade de cópia com o tamanho dos dados lidos/gravados. Em seguida, usando ferramentas como o SQL Server Management Studio (SSMS) ou o Visual Studio, você pode se conectar ao Banco de Dados SQL do Azure de destino e verificar se a tabela de destino especificada contém os dados copiados.

Saída de exemplo

Creating a data factory AdfV2Tutorial...
{
  "identity": {
    "type": "SystemAssigned"
  },
  "location": "East US"
}
Creating linked service AzureStorageLinkedService...
{
  "properties": {
    "type": "AzureStorage",
    "typeProperties": {
      "connectionString": {
        "type": "SecureString",
        "value": "DefaultEndpointsProtocol=https;AccountName=<accountName>;AccountKey=<accountKey>"
      }
    }
  }
}
Creating linked service AzureSqlDbLinkedService...
{
  "properties": {
    "type": "AzureSqlDatabase",
    "typeProperties": {
      "connectionString": {
        "type": "SecureString",
        "value": "Server=tcp:<servername>.database.windows.net,1433;Database=<databasename>;User ID=<username>@<servername>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30"
      }
    }
  }
}
Creating dataset BlobDataset...
{
  "properties": {
    "type": "AzureBlob",
    "typeProperties": {
      "folderPath": "adfv2tutorial/",
      "fileName": "inputEmp.txt",
      "format": {
        "type": "TextFormat",
        "columnDelimiter": "|"
      }
    },
    "structure": [
      {
        "name": "FirstName",
        "type": "String"
      },
      {
        "name": "LastName",
        "type": "String"
      }
    ],
    "linkedServiceName": {
      "type": "LinkedServiceReference",
      "referenceName": "AzureStorageLinkedService"
    }
  }
}
Creating dataset SqlDataset...
{
  "properties": {
    "type": "AzureSqlTable",
    "typeProperties": {
      "tableName": "dbo.emp"
    },
    "linkedServiceName": {
      "type": "LinkedServiceReference",
      "referenceName": "AzureSqlDbLinkedService"
    }
  }
}
Creating pipeline Adfv2TutorialBlobToSqlCopy...
{
  "properties": {
    "activities": [
      {
        "type": "Copy",
        "typeProperties": {
          "source": {
            "type": "BlobSource"
          },
          "sink": {
            "type": "SqlSink"
          }
        },
        "inputs": [
          {
            "type": "DatasetReference",
            "referenceName": "BlobDataset"
          }
        ],
        "outputs": [
          {
            "type": "DatasetReference",
            "referenceName": "SqlDataset"
          }
        ],
        "name": "CopyFromBlobToSQL"
      }
    ]
  }
}
Creating pipeline run...
Pipeline run ID: 1cd03653-88a0-4c90-aabc-ae12d843e252
Checking pipeline run status...
Status: InProgress
Status: InProgress
Status: Succeeded
Checking copy activity run details...
{
  "dataRead": 18,
  "dataWritten": 28,
  "rowsCopied": 2,
  "copyDuration": 2,
  "throughput": 0.01,
  "errors": [],
  "effectiveIntegrationRuntime": "DefaultIntegrationRuntime (East US)",
  "usedDataIntegrationUnits": 2,
  "billedDuration": 2
}

Press any key to exit...

O pipeline neste exemplo copia dados de uma localização para outra localização num armazenamento de blobs do Azure. Aprendeu a:

  • Criar uma fábrica de dados.
  • Criar os serviços ligados Armazenamento do Microsoft Azure e Base de Dados SQL do Azure.
  • Criar os conjuntos de dados Blob do Azure e Base de Dados SQL do Azure.
  • Crie um pipeline contendo uma atividade de cópia.
  • Iniciar uma execução de pipeline.
  • Monitorizar o pipeline e execuções de atividades.

Avance para o tutorial seguinte para saber como copiar dados do local para a cloud: