Kopiera data från Azure Blob till Azure SQL Database med hjälp av Azure Data Factory

GÄLLER FÖR: Azure Data Factory Azure Synapse Analytics

Tips

Data Factory i Microsoft Fabric är nästa generations Azure Data Factory, med en enklare arkitektur, inbyggd AI och nya funktioner. Om dataintegrering är nytt för dig börjar du med Fabric Data Factory. Befintliga ADF-arbetsbelastningar kan uppgraderas till Fabric för att få åtkomst till nya funktioner inom datavetenskap, realtidsanalys och rapportering.

I den här självstudien skapar du en Data Factory-pipeline som kopierar data från Azure Blob Storage till Azure SQL Database. Konfigurationsmönstret i den här självstudien gäller kopiering av ett filbaserat datalager till ett relationsdatalager. En lista över datalager som stöds som källor och mottagare finns i datalager och format som stöds.

I den här självstudien gör du följande:

  • Skapa en datafabrik.
  • Skapa Azure Storage och Azure SQL Database länkade tjänster.
  • Skapa Azure blob och Azure SQL Database datauppsättningar.
  • Skapa en pipeline som innehåller en Copy-aktivitet.
  • Starta en pipelineskörning.
  • Övervaka pipelinen och utföranden av aktiviteter.

I den här handledningen används .NET SDK. Du kan använda andra mekanismer för att interagera med Azure Data Factory. Se exempel under Quickstarts.

Om du inte har en Azure prenumeration skapar du ett free-Azure konto innan du börjar.

Förutsättningar

Skapa en blob och en SQL-tabell

Förbered nu din Azure Blob och Azure SQL-databas för tutorialen genom att skapa en källblob och en måltabell i SQL.

Skapa en källblob

Skapa först en källblob genom att skapa en container och ladda upp en indatatextfil till den:

  1. Öppna Anteckningsblock. Kopiera följande text och spara den lokalt i en fil med namnet inputEmp.txt.

    John|Doe
    Jane|Doe
    
  2. Använd ett verktyg som Azure Storage Explorer för att skapa containern adfv2tutorial och ladda upp filen inputEmp.txt till containern.

Skapa en SQL-sänktabell

Skapa sedan en sink-SQL-tabell:

  1. Använd följande SQL-skript för att skapa tabellen dbo.emp i din 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. Tillåt Azure tjänster att komma åt SQL Database. Se till att du tillåter åtkomst till Azure tjänster på servern så att Data Factory-tjänsten kan skriva data till SQL Database. Gör så här för att kontrollera och aktivera den här inställningen:

    1. Gå till Azure-portalen för att hantera SQL-servern. Sök efter och välj SQL-servrar.

    2. Välj servern.

    3. Under sql server-menyns säkerhetsrubrik väljer du Brandväggar och virtuella nätverk.

    4. På sidan Firewall och virtuella nätverk går du till sidan Tillåt Azure tjänster och resurser för att få åtkomst till servern väljer du ON.

Skapa ett Visual Studio projekt

Skapa ett C#-.NET-konsolprogram med hjälp av Visual Studio.

  1. Öppna Visual Studio.
  2. I startfönstret väljer du Skapa ett nytt projekt.
  3. I fönstret Skapa ett nytt projekt väljer du C#-versionen av Konsolapp (.NET Framework) i listan över projekttyper. Välj sedan Nästa.
  4. I fönstret Konfigurera din nya project anger du namnet ProjectADFv2Tutorial. För Plats bläddrar du till och/eller skapar katalogen för att spara projektet i. Välj sedan Skapa. Det nya projektet visas i Visual Studio IDE.

Installera NuGet-paket

Installera sedan de nödvändiga bibliotekspaketen med Hjälp av NuGet-pakethanteraren.

  1. I menyraden väljer du Tools>NuGet Package Manager>Package Manager Console.

  2. I fönstret Package Manager Console kör du följande kommandon för att installera paket. Information om Azure Data Factory NuGet-paketet finns i Microsoft.Azure. Management.DataFactory.

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

Skapa en datafabriksklient

Följ de här stegen för att skapa en datafabriksklient.

  1. Öppna Program.cs och skriv sedan över de befintliga using uttrycken med följande kod för att lägga till referenser till namnområden.

    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. Lägg till följande kod i metoden Main som anger variabler. Ersätt de 14 platshållarna med dina egna värden.

    Om du vill se listan över Azure regioner där Data Factory för närvarande är tillgängligt kan du läsa Products available by region. Under Produkter listrutan, välj Bläddra>Analytics>Data Factory. Välj sedan de regioner som intresserar dig i listrutan Regioner . Ett rutnät visas med tillgänglighetsstatusen för Data Factory-produkter för dina valda regioner.

    Kommentar

    Datalager, till exempel Azure Storage och Azure SQL Database, och beräkningar, till exempel HDInsight, som Data Factory använder kan finnas i andra regioner än vad du väljer för 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. Lägg till följande kod i metoden Main som skapar en instans av DataFactoryManagementClient klassen. Du använde det är objektet till att skapa en datafabrik, länkade tjänster, datauppsättningar och en pipeline. Du kan också använda det här objektet för att övervaka detaljer om pipelinekörning.

    // 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 };
    

Skapa en datafabrik

Lägg till följande kod i metoden Main som skapar en datafabrik.

// 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);
}

Skapa länkade tjänster

I den här handledningen skapar du två länkade tjänster för källan respektive mål.

Skapa en Azure Storage länkad tjänst

Lägg till följande kod i metoden Main som skapar en Azure Storage länkad tjänst. Information om stödda egenskaper och detaljer finns i Azure Blob-länkade tjänstegenskaper.

// 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)
);

Skapa en Azure SQL Database länkad tjänst

Lägg till följande kod i metoden Main som skapar en Azure SQL Database länkad tjänst. Information om egenskaper och detaljer som stöds finns i Azure SQL Database egenskaper för länkad tjänst.

// 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)
);

Skapa datauppsättningar

I det här avsnittet skapar du två datauppsättningar: en för källan, den andra för slutpunkten.

Skapa en datauppsättning för käll-Azure Blob

Lägg till följande kod i metoden Main som skapar en Azure Blob-datamängd. Information om de stödda egenskaperna finns i Egenskaper för Azure Blob-datauppsättning.

Du definierar en datauppsättning som representerar källdata i Azure Blob. Den här blobdatauppsättningen refererar till den Azure Storage länkade tjänst som du skapade i föregående steg och beskriver:

  • Platsen för bloben som ska kopieras från: FolderPath och FileName
  • Blobformatet som anger hur innehållet parsas: TextFormat och dess inställningar, till exempel kolumngränsare
  • Datastrukturen, inklusive kolumnnamn och datatyper, som i det här exemplet mappar till måltabellen i SQL
// 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)
);

Skapa en datauppsättning för lagring i Azure SQL Database

Lägg till följande kod i metoden Main som skapar en Azure SQL Database datauppsättning. Information om de stödda egenskaperna och detaljerna finns i Azure SQL Database datauppsättningsegenskaper.

Du definierar en datauppsättning som representerar mottagardata i Azure SQL Database. Den här datauppsättningen refererar till den Azure SQL Database länkade tjänst som du skapade i föregående steg. Den anger också vilken SQL-tabell som innehåller de kopierade data.

// 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)
);

Skapa en pipeline

Lägg till följande kod i metoden Main som skapar en pipeline med en kopieringsaktivitet. I den här handledningen innehåller den här pipelinen en aktivitet: CopyActivity, som använder blobdatauppsättningen som källa och SQL-datauppsättningen som mottagare. Information om copy activity finns i Copy activity i 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)
);

Skapa en pipelinekörning

Lägg till följande kod i metoden Main som utlöser en pipelinekörning.

// 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);

Övervaka en pipelinekörning

Infoga nu koden för att kontrollera pipelinekörningstillstånd och för att få information om kopieringsaktivitetskörningen.

  1. Lägg till följande kod i Main metoden för att kontinuerligt kontrollera status för pipelinekörningen tills den har kopierat data.

    // 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. Lägg till följande kod i Main-metoden för att hämta körningsinformation för kopieringsaktiviteten, till exempel storleken på de data som har lästs eller skrivits.

    // 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();
    

Kör koden

Bygg applikationen genom att välja Bygg>Bygg lösning. Starta sedan programmet genom att välja Felsöka>Starta felsökning, och verifiera pipelinekörningen.

Konsolen skriver ut förloppet för skapandet av en datafabrik, den länkade tjänsten, datauppsättningar, pipeline och pipelinekörning. Sedan kontrolleras status för pipelinekörningen. Vänta tills du ser information om kopieringsaktivitetens körning med läs-/skrivstorleken för data. Med hjälp av verktyg som SQL Server Management Studio (SSMS) eller Visual Studio kan du sedan ansluta till mål Azure SQL Database och kontrollera om måltabellen som du angav innehåller kopierade data.

Exempelresultat

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...

Pipeline i det här exemplet kopierar data från en plats till en annan i en Azure Blob-lagring. Du har lärt dig att:

  • Skapa en datafabrik.
  • Skapa Azure Storage och Azure SQL Database länkade tjänster.
  • Skapa Azure blob och Azure SQL Database datauppsättningar.
  • Skapa en pipeline som innehåller en kopieringsaktivitet.
  • Starta en pipelineskörning.
  • Övervaka pipelinen och utföranden av aktiviteter.

Gå vidare till följande handledning för att lära dig kopiera data från lokal miljö till molnet.