Partilhar via


Copiar dados do Azure Blob para o Azure SQL Database 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 Azure Blob Storage para o Azure SQL Database. 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 Azure Storage e Azure SQL Database.
  • Crie conjuntos de dados Azure Blob e Azure SQL Database.
  • 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 Azure SQL Database 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 Azure Storage Explorer 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 Azure SQL Database.

    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 Package Manager>Package Manager Console.

  2. No painel Package Manager 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 Azure Storage e o Azure SQL Database, 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 Azure Storage

Adicione o seguinte código ao método Main que cria um serviço ligado Azure Storage. 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 Azure SQL Database

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

// 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 Azure Storage 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 Azure SQL Database

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

Defines um conjunto de dados que representa os dados do sumidouro no Azure SQL Database. Este conjunto de dados refere-se ao serviço ligado Azure SQL Database 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 Azure SQL Database 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 Azure Storage e Azure SQL Database.
  • Crie conjuntos de dados Azure Blob e Azure SQL Database.
  • 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: