Partilhar via


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

APLICA-SE A: Azure Data Factory Azure Synapse Analytics

Gorjeta

Data Factory em Microsoft Fabric é a próxima geração de Azure Data Factory, com uma arquitetura mais simples, IA incorporada e novas funcionalidades. Se és novo na integração de dados, começa pelo Fabric Data Factory. As cargas de trabalho existentes do ADF podem atualizar para o Fabric para aceder a novas capacidades em ciência de dados, análise em tempo real e relatórios.

Neste tutorial, cria um pipeline Data Factory que copia dados do Armazenamento de Blobs do Azure para o 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 serviços ligados ao Armazenamento do Azure e Base de Dados SQL do Azure.
  • Crie conjuntos de dados Azure Blob e Base de Dados SQL do Azure.
  • Crie um pipeline que contenha uma atividade de cópia.
  • Iniciar uma execução de pipeline.
  • Monitorizar o pipeline e execuções de atividades.

Este tutorial utiliza o SDK .NET. Pode usar outros mecanismos para interagir com Azure Data Factory; consulte amostras em Quickstarts.

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

Pré-requisitos

Criar um blob e uma tabela SQL

Prepare o seu Azure Blob e Base 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 Explorador de Armazenamento do Azure para criar o contentor adfv2tutorial e para carregar o ficheiro inputEmp.txt para o contentor.

Criar uma tabela SQL de destino

Em seguida, crie uma tabela de destino SQL:

  1. Use o seguinte script SQL para criar a tabela dbo.emp no seu 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 acedam à base de dados SQL. Certifique-se de que permite o acesso aos serviços Azure no seu servidor para que o serviço Data Factory possa escrever dados na base de dados SQL. Para verificar e ativar esta definição, execute os passos seguintes:

    1. Vai ao portal Azure para gerir o teu 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 Azure serviços e recursos acedam a este servidor, selecione ON.

Criar um projeto Visual Studio

Usando o Visual Studio, crie uma aplicação de consola C# .NET.

  1. Abre o Visual Studio.
  2. Na janela Iniciar, selecione Criar um novo projeto.
  3. Na janela Criar um novo projeto, escolha a versão C# de Consola App (.NET Framework) da lista de tipos de projeto. Em seguida, selecione Seguinte.
  4. Na janela Configure o seu novo projeto, introduza um Nome do projeto de ADFv2Tutorial. Em Local, navegue até e/ou crie o diretório para guardar o projeto. Depois, selecione Criar. O novo projeto aparece no Visual Studio IDE.

Instalar pacotes NuGet

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

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

  2. No painel Gestor de Pacotes Console, execute os seguintes comandos para instalar os pacotes. Para informações sobre o pacote Azure Data Factory NuGet, 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 Azure onde a 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

    Os armazenamentos de dados, como o Armazenamento do Azure e o Base de Dados SQL do Azure, e os cálculos, como o HDInsight, que o Data Factory utiliza, podem estar noutras regiões diferentes das escolhidas 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 vinculado, 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 ao Armazenamento do Azure

Adicione o seguinte código ao método Main que cria um serviço ligado Armazenamento do Azure. Para obter informações sobre propriedades suportadas e detalhes, consulte Propriedades do serviço ligado do Azure Blob.

// 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 ao Base de Dados SQL do Azure

Adicione o seguinte código ao método Main que cria um serviço ligado Base de Dados SQL do Azure. Para informações sobre propriedades suportadas e detalhes, consulte propriedades do serviço ligado do Base 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 seguinte código ao método Main que cria um conjunto de dados blob Azure. Para informações sobre propriedades suportadas e detalhes, consulte propriedades do conjunto de dados Blob do Azure.

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

  • A localização do blob de onde copiar: FolderPath e FileName
  • O formato de blob que indica como analisar o conteúdo: TextFormat e suas configurações, como o 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 de destino.
// 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 sink Base de Dados SQL do Azure

Adicione o seguinte código ao método Main que cria um conjunto de dados Base de Dados SQL do Azure. Para informações sobre propriedades suportadas e detalhes, veja Base de Dados SQL do Azure propriedades do conjunto de dados.

Defines um conjunto de dados que representa os dados do sumidouro no Base de Dados SQL do Azure. Este conjunto de dados refere-se ao serviço ligado Base de Dados SQL do Azure que 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 seguinte código para o Main método que cria um pipeline com uma atividade de cópia. Neste tutorial, esse pipeline contém uma atividade: CopyActivity, que recebe o conjunto de dados Blob como fonte e o conjunto de dados SQL como coletor. Para obter informações sobre os detalhes da atividade de cópia, consulte Atividade de cópia 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 do 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 seguinte código ao Main método que recupera detalhes da 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

Construa a aplicação 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 vinculado, dos conjuntos de dados, do fluxo de trabalho e da execução de fluxo de trabalho. 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. Depois, usando ferramentas como o SQL Server Management Studio (SSMS) ou Visual Studio, pode ligar-se ao seu Base de Dados SQL do Azure de destino e verificar se a tabela de destino que especificou 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 num armazenamento de blob do Azure. Aprendeu a:

  • Criar uma fábrica de dados.
  • Criar serviços ligados ao Armazenamento do Azure e Base de Dados SQL do Azure.
  • Crie conjuntos de dados Azure Blob 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: