Kopiera data från en Azure-blob till Azure SQL Database med Data Factory

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

Dricks

Prova Data Factory i Microsoft Fabric, en allt-i-ett-analyslösning för företag. Microsoft Fabric omfattar allt från dataflytt till datavetenskap, realtidsanalys, business intelligence och rapportering. Lär dig hur du startar en ny utvärderingsversion kostnadsfritt!

I de här självstudierna skapar du en datafabrikpipeline som kopierar 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 länkade Azure Storage- och Azure SQL Database-tjänster.
  • Skapa Azure Blob- och Azure SQL Database-datauppsättningar.
  • Skapa en pipeline som innehåller en kopieringsaktivitet.
  • Starta en pipelinekörning.
  • Övervaka pipelinen och aktivitetskörningarna.

I den här självstudiekursen används .NET SDK. Du kan använda andra mekanismer för att interagera med Azure Data Factory. se exempel under Snabbstarter.

Om du inte har en Azure-prenumeration kan du skapa ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

Skapa en blob och en SQL-tabell

Förbered nu Azure Blob och Azure SQL Database för självstudien genom att skapa en källblob och en SQL-tabell för mottagare.

Skapa en källblob

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

  1. Öppna Anteckningar. 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-mottagartabell

Skapa sedan en SQL-tabell för mottagare:

  1. Använd följande SQL-skript för att skapa tabellen dbo.emp i 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 att Azure-tjänster får åtkomst till 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 din SQL-server. 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 Brandvägg och virtuella nätverk går du till Tillåt Azure-tjänster och resurser att komma åt den här servern och väljer .

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 Console App (.NET Framework) i listan över projekttyper. Välj sedan Nästa.
  4. I fönstret Konfigurera ditt nya projekt anger du ett projektnamnför ADFv2Tutorial. 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 Verktyg>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 befintliga using instruktioner 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 Produkter tillgängliga per region. Under listrutan Produkter väljer du Bläddra i>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 information 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 självstudien skapar du två länkade tjänster för källan respektive mottagaren.

Skapa en länkad Azure Storage-tjänst

Lägg till följande kod i metoden Main som skapar en länkad Azure Storage-tjänst. Information om egenskaper och information som stöds finns i Egenskaper för länkade Azure Blob-tjänster.

// 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 länkad Azure SQL Database-tjänst

Lägg till följande kod i metoden Main som skapar en länkad Azure SQL Database-tjänst. Information om egenskaper och information som stöds finns i Länkade tjänstegenskaper för 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)
);

Skapa datauppsättningar

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

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

Lägg till följande kod i metoden Main som skapar en Azure-blobdatauppsättning. Information om egenskaper och information som stöds finns i Egenskaper för Azure Blob-datauppsättning.

Du definierar en datauppsättning som representerar källdata i Azure Blob. Denna Blob-datauppsättning refererar till den Azure Storage-länkade tjänst som du skapar i föregående steg. Den 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 mappar i det här exemplet till sql-tabellen för mottagare
// 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 Azure SQL Database-mottagaren

Lägg till följande kod i metoden Main som skapar en Azure SQL Database-datauppsättning. Information om egenskaper och information som stöds finns i Egenskaper för Azure SQL Database-datauppsättning.

Du definierar en datauppsättning som representerar mottagardata i Azure SQL Database. Den här datamängden refererar till den länkade Azure SQL Database-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 självstudien innehåller den här pipelinen en aktivitet: CopyActivity, som tar in blobdatauppsättningen som källa och SQL-datauppsättningen som mottagare. Information om kopieringsaktivitet finns i aktiviteten Kopiera 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 metoden Main som hämtar information om kopieringsaktivitetskörning, 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

Skapa programmet genom att välja Skapa>bygglö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 azure SQL Database-målet och kontrollera om måltabellen som du angav innehåller kopierade data.

Exempelutdata

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 Azure Blob Storage. Du har lärt dig att:

  • Skapa en datafabrik.
  • Skapa länkade Azure Storage- och Azure SQL Database-tjänster.
  • Skapa Azure Blob- och Azure SQL Database-datauppsättningar.
  • Skapa en pipeline som innehåller en kopieringsaktivitet.
  • Starta en pipelinekörning.
  • Övervaka pipelinen och aktivitetskörningarna.

Fortsätt till följande självstudie och lär dig att kopiera data från en lokal plats till molnet: