Kopiowanie danych z obiektu blob platformy Azure do bazy danych Azure SQL Database przy użyciu usługi Azure Data Factory

DOTYCZY: Azure Data Factory Azure Synapse Analytics

W tym samouczku utworzysz potok fabryki danych, który kopiuje dane z usługi Azure Blob Storage do bazy danych Azure SQL Database. Wzorzec konfiguracji w tym samouczku ma zastosowanie do kopiowania danych z magazynu opartego na plikach do relacyjnego magazynu danych. Aby uzyskać listę magazynów danych obsługiwanych jako źródła i ujścia, zobacz obsługiwane magazyny danych i formaty.

W tym samouczku wykonasz następujące kroki:

  • Tworzenie fabryki danych.
  • Tworzenie połączonych usług Azure Storage i Azure SQL Database.
  • Tworzenie zestawów danych obiektu Blob platformy Azure i bazy danych Azure SQL Database.
  • Tworzenie potoku zawierającego działanie kopiowania.
  • Uruchom potok.
  • Monitorowanie uruchomień potoku i działań.

W tym samouczku jest używany zestaw SDK platformy .NET. Możesz użyć innych mechanizmów do interakcji z Azure Data Factory; zapoznaj się z przykładami w obszarze Przewodniki Szybki start.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure .

Wymagania wstępne

Tworzenie obiektu blob i tabeli SQL

Teraz przygotuj obiekt blob platformy Azure i Azure SQL Database na potrzeby samouczka, tworząc źródłowy obiekt blob i tabelę SQL ujścia.

Tworzenie źródłowego obiektu Blob

Najpierw utwórz źródłowy obiekt blob, tworząc kontener i przekazując do niego plik tekstowy wejściowy:

  1. Otwórz Notatnik. Skopiuj następujący tekst i zapisz go lokalnie w pliku o nazwie inputEmp.txt.

    John|Doe
    Jane|Doe
    
  2. Użyj narzędzia, takiego jak Eksplorator usługi Azure Storage, aby utworzyć kontener adfv2tutorial i przekazać plik inputEmp.txt do kontenera.

Tworzenie tabeli SQL ujścia

Następnie utwórz tabelę SQL ujścia:

  1. Poniższy skrypt SQL umożliwia utworzenie tabeli dbo.emp w bazie danych 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. Zezwalaj usługom platformy Azure na dostęp do SQL Database. Upewnij się, że zezwolisz na dostęp do usług platformy Azure na serwerze, aby usługa Data Factory mogła zapisywać dane w SQL Database. W celu sprawdzenia i włączenia tego ustawienia wykonaj następujące kroki:

    1. Przejdź do Azure Portal, aby zarządzać serwerem SQL. Wyszukaj i wybierz pozycję serwery SQL.

    2. Wybierz serwer.

    3. W obszarze pozycji Zabezpieczenia menu serwera SQL wybierz pozycję Zapory i sieci wirtualne.

    4. Na stronie Zapora i sieci wirtualne w obszarze Zezwalaj usługom i zasobom platformy Azure na dostęp do tego serwera wybierz pozycję WŁĄCZONE.

Tworzenie projektu programu Visual Studio

Za pomocą Visual Studio utwórz aplikację konsolową platformy .NET w języku C#.

  1. Otwórz program Visual Studio.
  2. W oknie Start wybierz pozycję Utwórz nowy projekt.
  3. W oknie Tworzenie nowego projektu wybierz wersję C# aplikacji konsolowej (.NET Framework) z listy typów projektów. Następnie wybierz przycisk Dalej.
  4. W oknie Konfigurowanie nowego projektu wprowadź nazwę ProjectADFv2Tutorial. W obszarze Lokalizacja przejdź do katalogu i/lub utwórz go, aby zapisać projekt. Następnie wybierz pozycję Utwórz. Nowy projekt zostanie wyświetlony w środowisku IDE Visual Studio.

Instalowanie pakietów NuGet

Następnie zainstaluj wymagane pakiety bibliotek przy użyciu menedżera pakietów NuGet.

  1. Na pasku menu wybierz pozycję Narzędzia>NuGet Menedżer pakietów>Menedżer pakietów Konsola.

  2. W okienku Menedżer pakietów Konsola uruchom następujące polecenia, aby zainstalować pakiety. Aby uzyskać informacje o pakiecie Azure Data Factory NuGet, zobacz Microsoft.Azure.Management.DataFactory.

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

Tworzenie klienta fabryki danych

Wykonaj następujące kroki, aby utworzyć klienta fabryki danych.

  1. Otwórz plik Program.cs, a następnie zastąp istniejące using instrukcje następującym kodem, aby dodać odwołania do przestrzeni nazw.

    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. Dodaj następujący kod do Main metody, która ustawia zmienne. Zastąp 14 symbolami zastępczymi własnymi wartościami.

    Aby wyświetlić listę regionów świadczenia usługi Azure, w których usługa Data Factory jest obecnie dostępna, zobacz Produkty dostępne według regionów. Na liście rozwijanej Produkty wybierz pozycję PrzeglądajAnalyticsData>>Factory. Następnie z listy rozwijanej Regiony wybierz interesujące Cię regiony. Zostanie wyświetlona siatka ze stanem dostępności produktów usługi Data Factory dla wybranych regionów.

    Uwaga

    Magazyny danych, takie jak usługa Azure Storage i Azure SQL Database, oraz obliczenia, takie jak usługa HDInsight, mogą znajdować się w innych regionach niż w przypadku usługi 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. Dodaj następujący kod do Main metody, która tworzy wystąpienie DataFactoryManagementClient klasy. Ten obiekt jest używany do tworzenia fabryki danych, połączonej usługi, zestawów danych i potoku. Umożliwia on również monitorowanie szczegółów uruchomienia potoku.

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

Tworzenie fabryki danych

Dodaj następujący kod do Main metody, która tworzy fabrykę danych.

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

Tworzenie połączonych usług

W tym samouczku utworzysz odpowiednio dwie połączone usługi dla źródła i ujścia.

Tworzenie połączonej usługi Azure Storage

Dodaj następujący kod do Main metody, która tworzy połączoną usługę Azure Storage. Aby uzyskać informacje o obsługiwanych właściwościach i szczegółach, zobacz Właściwości połączonej usługi 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)
);

Tworzenie połączonej usługi Azure SQL Database

Dodaj następujący kod do Main metody, która tworzy połączoną usługę Azure SQL Database. Aby uzyskać informacje o obsługiwanych właściwościach i szczegółach, zobacz Azure SQL Database właściwości połączonej usługi.

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

Tworzenie zestawów danych

W tej sekcji utworzysz dwa zestawy danych: jeden dla źródła, drugi dla ujścia.

Tworzenie zestawu danych źródłowego obiektu blob platformy Azure

Dodaj następujący kod do Main metody, która tworzy zestaw danych obiektów blob platformy Azure. Aby uzyskać informacje o obsługiwanych właściwościach i szczegółach, zobacz Właściwości zestawu danych obiektów blob platformy Azure.

Należy zdefiniować zestaw danych reprezentujący źródło danych w obiekcie blob platformy Azure. Ten zestaw danych obiektu blob odwołuje się do połączonej usługi Azure Storage utworzonej w poprzednim kroku i zawiera opis następujących elementów:

  • Lokalizacja obiektu blob do skopiowania z: FolderPath i FileName
  • Format obiektu blob wskazujący sposób analizowania zawartości: TextFormat i jego ustawień, takich jak ogranicznik kolumn
  • Struktura danych, w tym nazwy kolumn i typy danych, które są mapowania w tym przykładzie na tabelę ujścia 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)
);

Tworzenie zestawu danych ujścia obiektu Blob platformy Azure

Dodaj następujący kod do Main metody, która tworzy zestaw danych Azure SQL Database. Aby uzyskać informacje o obsługiwanych właściwościach i szczegółach, zobacz Azure SQL Database właściwości zestawu danych.

Zdefiniuj zestaw danych reprezentujący ujście danych w bazie danych Azure SQL Database. Ten zestaw danych odwołuje się do połączonej usługi Azure SQL Database utworzonej w poprzednim kroku. Określa on również tabelę SQL, która przechowuje skopiowane dane.

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

Tworzenie potoku

Dodaj następujący kod do Main metody, która tworzy potok z działaniem kopiowania. W tym samouczku ten potok zawiera jedno działanie: CopyActivity, które przyjmuje zestaw danych obiektów blob jako źródło, a zestaw danych SQL jako ujście. Aby uzyskać informacje o szczegółach działania kopiowania, zobacz działanie Kopiuj w 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)
);

Tworzenie uruchomienia potoku

Dodaj następujący kod do Main metody , która wyzwala uruchomienie potoku.

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

Monitorowanie uruchomienia potoku

Teraz wstaw kod, aby sprawdzić stany uruchomienia potoku i uzyskać szczegółowe informacje o uruchomieniu działania kopiowania.

  1. Dodaj następujący kod do Main metody w celu ciągłego sprawdzania stanu uruchomienia potoku do momentu zakończenia kopiowania danych.

    // 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. Dodaj następujący kod do Main metody, która pobiera szczegóły uruchomienia działania kopiowania, takie jak rozmiar odczytanych lub zapisanych danych.

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

Uruchamianie kodu

Skompiluj aplikację, wybierając pozycję BuildBuild Solution (Kompiluj>). Następnie uruchom aplikację, wybierając pozycję DebugujRozpocznij>debugowanie i zweryfikuj wykonywanie potoku.

Konsola wypisuje postęp tworzenia fabryki danych, połączonej usługi, zestawów danych, potoku i działania potoku. Następnie sprawdza stan uruchomienia potoku. Poczekaj, aż zobaczysz szczegóły uruchomienia działania kopiowania z rozmiarem odczytu/zapisu danych. Następnie przy użyciu narzędzi, takich jak SQL Server Management Studio (SSMS) lub Visual Studio, możesz nawiązać połączenie z docelową Azure SQL Database i sprawdzić, czy określona tabela docelowa zawiera skopiowane dane.

Przykładowe dane wyjściowe

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

Następne kroki

Potok w tym przykładzie kopiuje dane z jednej lokalizacji do innej lokalizacji w usłudze Azure Blob Storage. W tym samouczku omówiono:

  • Tworzenie fabryki danych.
  • Tworzenie połączonych usług Azure Storage i Azure SQL Database.
  • Tworzenie zestawów danych obiektu Blob platformy Azure i bazy danych Azure SQL Database.
  • Utwórz potok zawierający działanie kopiowania.
  • Uruchom potok.
  • Monitorowanie uruchomień potoku i działań.

Przejdź do następującego samouczka, aby dowiedzieć się więcej o kopiowaniu danych lokalnych do chmury: