Compartilhar via


Copiar dados de Azure Blob para Banco de Dados SQL do Azure usando Azure Data Factory

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Dica

Data Factory no Microsoft Fabric é a próxima geração de Azure Data Factory, com uma arquitetura mais simples, IA interna e novos recursos. Se você não estiver familiarizado com a integração de dados, comece com Fabric Data Factory. As cargas de trabalho existentes do ADF podem ser atualizadas para Fabric para acessar novos recursos em ciência de dados, análise em tempo real e relatórios.

Neste tutorial, você criará um pipeline do Data Factory que copia dados de Armazenamento de Blobs do Azure para Banco de Dados SQL do Azure. O padrão de configuração neste tutorial aplica-se à cópia de um armazenamento de dados baseado em arquivos para um armazenamento de dados relacional. Para obter uma lista de armazenamentos de dados compatíveis como origens e coletores, confira Formatos e armazenamentos de dados compatíveis.

Neste tutorial, execute as seguintes etapas:

  • Criar uma fábrica de dados.
  • Crie serviços vinculados Armazenamento do Azure e Banco de Dados SQL do Azure.
  • Crie conjuntos de dados Azure Blob e Banco de Dados SQL do Azure.
  • Crie um pipeline que contenha uma atividade de cópia.
  • Iniciar uma execução de pipeline.
  • Monitore as execuções de pipeline e de atividade.

Este tutorial usa .NET SDK. Você pode usar outros mecanismos para interagir com Azure Data Factory; consulte exemplos em Quickstarts.

Se você não tiver uma assinatura Azure, crie uma conta de Azure free antes de começar.

Pré-requisitos

Criar um blob e uma tabela SQL

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

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 Gerenciador de Armazenamento do Azure para criar o contêiner adfv2tutorial e carregar o arquivo inputEmp.txt no contêiner.

Criar uma tabela de destino SQL

Em seguida, crie uma tabela do SQL de coletor:

  1. Use o script SQL a seguir para criar a tabela dbo.emp em seu Banco 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 Azure em seu servidor para que o serviço Data Factory possa gravar dados no Banco de Dados SQL. Para verificar e ativar essa configuração, faça as seguintes etapas:

    1. Acesse o portal Azure para gerenciar o SQL Server. Pesquise e selecione servidores SQL.

    2. Selecione seu servidor.

    3. No título Segurança do menu do SQL Server, selecione Firewalls e redes virtuais.

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

Criar um projeto de Visual Studio

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

  1. Abra Visual Studio.
  2. Na janela Iniciar, selecione Criar projeto.
  3. Na janela Criar um novo projeto, escolha a versão C# do Console App (.NET Framework) na lista de tipos de projeto. Em seguida, selecione Avançar.
  4. Na janela Configurar seu novo projeto, insira um Nome do projeto de ADFv2Tutorial. Para Localização, navegue até e/ou crie o diretório no qual salvar o projeto. Em seguida, selecione Criar. O novo projeto aparece no Visual Studio IDE.

Instalar os pacotes NuGet

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

  1. Na barra de menus, escolha Tools>NuGet Gerenciador de Pacotes>Gerenciador de Pacotes Console.

  2. No painel Gerenciador de Pacotes Console, execute os comandos a seguir para instalar pacotes. Para obter informações sobre o pacote NuGet 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 da fábrica de dados

Siga estas etapas para criar um cliente de data factory.

  1. Abra Program.cs e substitua as instruções 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 código a segui ao método Main que define as variáveis. Substitua os 14 placeholders por seus próprios valores.

    Para ver a lista de Azure regiões em que o Data Factory está disponível no momento, consulte Produtos disponíveis por região. Na lista suspensa Produtos, escolha Navegar>Analytics>Data Factory. Na lista suspensa Regiões, escolha as regiões que lhe interessam. É exibida uma grade com o status de disponibilidade dos produtos do Data Factory para suas regiões selecionadas.

    Observação

    Armazenamentos de dados, como Armazenamento do Azure e Banco de Dados SQL do Azure, e cálculos, como o HDInsight, que o Data Factory usa podem estar em outras regiões do que você escolhe 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 código a seguir ao método Main que cria uma instância da classe DataFactoryManagementClient. Você usa esse objeto para criar uma fábrica de dados, serviços vinculados, conjuntos de dados e um pipeline. Você também pode usar esse objeto para monitorar os detalhes da execução de 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 (data factory)

Adicione o código a seguir ao método Main que cria um data factory.

// 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 vinculados

Neste tutorial, você deverá criar dois serviços vinculados para origem e coletor, respectivamente.

Criar um serviço vinculado do Armazenamento do Azure

Adicione o código a seguir ao método Main que cria um serviço vinculado Armazenamento do Azure. Para obter informações sobre propriedades compatíveis, confira Propriedades do serviço vinculado do 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)
);

Crie um serviço vinculado do Banco de Dados SQL do Azure

Adicione o código a seguir ao método Main que cria um serviço vinculado Banco de Dados SQL do Azure. Para obter informações sobre propriedades e detalhes suportados, 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ê criará dois conjuntos de dados: um para a origem, outro para o coletor.

Criar um conjunto de dados para blob de Azure de origem

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

Você define um conjunto de dados que representa os dados de origem no Blob Azure. Esse conjunto de dados blob refere-se ao serviço vinculado Armazenamento do Azure criado na etapa anterior e descreve:

  • A localização do blob do qual copiar: FolderPath e FileName
  • O formato de blob que indica como analisar o conteúdo: TextFormat e as respectivas configurações, como o delimitador de coluna
  • A estrutura de dados, incluindo tipos de dados e nomes de coluna que, nesse exemplo, mapeiam para a tabela SQL de 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 Banco de Dados SQL do Azure de coletor

Adicione o código a seguir ao método Main que cria um conjunto de dados 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.

Você define um conjunto de dados que representa os dados de destino no Banco de Dados SQL do Azure. Esse conjunto de dados refere-se ao serviço vinculado Banco de Dados SQL do Azure criado na etapa anterior. Ela 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 método Main que cria um pipeline com uma atividade de cópia. Neste tutorial, o pipeline contém uma atividade: a CopyActivity, que usa o conjunto de dados de Blob como origem e o conjunto de dados do SQL como coletor. Para obter informações sobre os detalhes da atividade de cópia, consulte atividade Copy 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 código a seguir para o método Main 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);

Monitorar uma execução de pipeline

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

  1. Adicione o código a seguir ao método Main para verificar continuamente os status do pipeline de execução 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 método Main para recuperar os 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>Compilar Solução. Em seguida, inicie o aplicativo escolhendo Depurar>Iniciar a Depuração e verifique a execução do pipeline.

O console imprime o progresso de criação de um data factory, serviço vinculado, conjuntos de dados, pipeline e execução de pipeline. Em seguida, ele verifica o status da execução de pipeline. Aguarde até ver os detalhes de execução da atividade de cópia com o tamanho dos dados lidos/gravados. Em seguida, usando ferramentas como SQL Server Management Studio (SSMS) ou 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 um local para outro em um armazenamento de blobs do Azure. Você aprendeu a:

  • Criar uma fábrica de dados.
  • Crie serviços vinculados Armazenamento do Azure e Banco de Dados SQL do Azure.
  • Crie conjuntos de dados Azure Blob e Banco de Dados SQL do Azure.
  • Crie um pipeline que contenha uma atividade de cópia.
  • Iniciar uma execução de pipeline.
  • Monitore as execuções de pipeline e de atividade.

Avance para o tutorial a seguir para saber mais sobre a cópia de dados local para a nuvem: