Azure Data Factory kullanarak verileri Azure Blob'dan Azure SQL Database kopyalama

ŞUNLARA UYGULANIR: Azure Data Factory Azure Synapse Analytics

İpucu

Microsoft Fabric'daki Data Factory, daha basit bir mimariye, yerleşik yapay zekaya ve yeni özelliklere sahip yeni nesil Azure Data Factory. Veri tümleştirmeyi yeni kullanmaya başladıysanız Fabric Data Factory ile başlayın. Mevcut ADF iş yükleri veri bilimi, gerçek zamanlı analiz ve raporlama genelinde yeni özelliklere erişmek için Fabric yükseltebilir.

Bu öğreticide, verileri Azure Blob Storage'den Azure SQL Database kopyalayan bir Data Factory işlem hattı oluşturacaksınız. Bu öğreticideki yapılandırma düzeni, dosya tabanlı bir veri deposundan ilişkisel bir veri deposuna kopyalama için geçerlidir. Kaynak ve havuz olarak desteklenen veri depolarının listesi için bkz . desteklenen veri depoları ve biçimleri.

Bu öğreticide aşağıdaki adımları uygulayacaksınız:

  • Veri fabrikası oluşturma.
  • Azure Storage ve Azure SQL Database bağlı hizmetler oluşturun.
  • Azure Blob ve Azure SQL Database veri kümeleri oluşturun.
  • Bir işlem hattı, bir Kopyalama etkinliği içerir.
  • Bir işlem hattı çalıştırmasını başlat.
  • İşlem hattını ve etkinlik çalıştırmalarını izleyin.

Bu öğreticide .NET SDK kullanılır. Azure Data Factory etkileşimde bulunmak için diğer mekanizmaları kullanabilirsiniz; Quickstarts altındaki örneklere bakın.

Azure aboneliğiniz yoksa başlamadan önce free Azure hesabı oluşturun.

Önkoşullar

  • Azure Storage account. Blob depolama alanını kaynak veri deposu olarak kullanabilirsiniz. Azure depolama hesabınız yoksa bkz. Gener amaçlı depolama hesabı oluşturma.
  • Azure SQL Veritabanı. Veritabanını havuz veri deposu olarak kullanabilirsiniz. Azure SQL Database'da veritabanınız yoksa Azure SQL Database'da veritabanı oluşturma bölümüne bakın.
  • Visual Studio. Bu makaledeki kılavuzda Visual Studio 2019 kullanılır.
  • .NET için Azure SDK.
  • Microsoft Entra application. Microsoft Entra uygulamanız yoksa, Microsoft Entra uygulaması oluşturma makalesinin Microsoft Entra uygulaması oluşturmak için portalı kullanma bölümüne bakın. Sonraki adımlarda kullanmak üzere aşağıdaki değerleri kopyalayın: Uygulama (istemci) kimliği, kimlik doğrulama anahtarı ve Dizin (kiracı) kimliği. Aynı makaledeki yönergeleri izleyerek uygulamayı Katkıda Bulunan rolüne atayın.

Bir blob ve SQL tablosu oluşturma

Şimdi, bir kaynak blob ve bir hedef SQL tablosu oluşturarak Azure Blob'unuzu ve Azure SQL Veritabanınızı öğretici için hazırlayın.

Kaynak blob oluşturma

İlk olarak, bir kapsayıcı oluşturup giriş metin dosyasını karşıya yükleyerek bir kaynak blob oluşturun:

  1. Not Defteri'ne tıklayın. Aşağıdaki metni kopyalayın ve yerel olarak inputEmp.txt adlı bir dosyaya kaydedin.

    John|Doe
    Jane|Doe
    
  2. adfv2tutorial kapsayıcısını oluşturmak ve inputEmp.txt dosyasını kapsayıcıya yüklemek için Azure Storage Explorer gibi bir araç kullanın.

Havuz SQL tablosu oluşturma

Ardından havuz SQL tablosu oluşturun:

  1. Azure SQL Database dbo.emp tablosunu oluşturmak için aşağıdaki SQL betiğini kullanın.

    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. Azure hizmetlerinin SQL Veritabanı'na erişmesine izin verin. Data Factory hizmetinin SQL Veritabanı'na veri yazabilmesi için sunucunuzdaki Azure hizmetlere erişime izin verin. Bu ayarı doğrulamak ve etkinleştirmek için aşağıdaki adımları uygulayın:

    1. SQL sunucunuzu yönetmek için Azure portalı gidin. SQL sunucularını arayın ve seçin.

    2. Sunucunuzu seçin.

    3. SQL server menüsünün Güvenlik başlığı altında Güvenlik duvarları ve sanal ağlar'ı seçin.

    4. Firewall ve sanal ağlar sayfasındaki Azure hizmetlerinin ve kaynaklarının bu sunucuya erişmesine izin ver ayarını "AÇIK" olarak seçin.

Visual Studio projesi oluşturma

Visual Studio kullanarak bir C# .NET konsol uygulaması oluşturun.

  1. Visual Studio açın.
  2. Başlangıç penceresinde Yeni proje oluştur'u seçin.
  3. Yeni proje oluştur penceresinde, proje türleri listesinden Console App (.NET Framework) C# sürümünü seçin. Sonra İleri'yi seçin.
  4. Yeni projenizi yapılandırın penceresinde Proje adı olarak ADFv2Tutorial girin. Konum için, projeyi kaydetmek üzere dizine gidin ve/veya dizin oluşturun. Daha sonra, Oluştur'u seçin. Yeni proje Visual Studio IDE'de görünür.

NuGet paketlerini yükleme

Ardından NuGet paket yöneticisini kullanarak gerekli kitaplık paketlerini yükleyin.

  1. Menü çubuğunda Tools>NuGet Package Manager>Package Manager Console öğesini seçin.

  2. Package Manager Console bölmesinde paketleri yüklemek için aşağıdaki komutları çalıştırın. Azure Data Factory NuGet paketi hakkında bilgi için bkz. Microsoft.Azure. Management.DataFactory.

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

Veri fabrikası istemcisi oluşturma

Veri fabrikası istemcisi oluşturmak için bu adımları izleyin.

  1. Program.cs açın, ardından ad alanlarına başvuru eklemek için aşağıdaki kodla var olan using deyimlerin üzerine yazın.

    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. Değişkenleri ayarlayan yöntemine Main aşağıdaki kodu ekleyin. 14 yer tutucuyu kendi değerlerinizle değiştirin.

    Data Factory'nin şu anda kullanılabilir olduğu Azure bölgelerin listesini görmek için bkz. Bölgelere göre kullanılabilir ürünler. Ürünler açılır listesinden, Gözat Analytics>Veri Fabrikası> seçeneğini seçin. Ardından Bölgeler açılan listesinde ilginizi çekebilecek bölgeleri seçin. Seçtiğiniz bölgeler için Data Factory ürünlerinin kullanılabilirlik durumunu içeren bir kılavuz görüntülenir.

    Not

    Azure Storage ve Azure SQL Database gibi veri depoları ve Data Factory'nin kullandığı HDInsight gibi işlem depoları Data Factory için seçtiğiniz bölgelerden farklı bölgelerde olabilir.

    // 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. Main yöntemiyle DataFactoryManagementClient sınıfının bir örneğini oluşturan aşağıdaki kodu ekleyin. Veri fabrikası, bağlı hizmet, veri kümeleri ve işlem hattı oluşturmak için bu nesneyi kullanırsınız. Bu nesneyi ayrıca işlem hattı ayrıntılarını izlemek için kullanabilirsiniz.

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

Veri fabrikası oluşturma

Main yöntemine veri fabrikası oluşturan aşağıdaki kodu ekleyin.

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

Bağlı hizmetler oluşturma

Bu öğreticide, kaynak ve havuz için sırasıyla iki bağlı hizmet oluşturursunuz.

Azure Storage bağlı hizmet oluşturma

Main oluşturan yöntemine aşağıdaki kodu ekleyin. Desteklenen özellikler ve ayrıntılar hakkında bilgi için bkz. Azure Blob bağlı hizmet özellikleri.

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

Azure SQL Database bağlı hizmet oluşturma

Main oluşturan yöntemine aşağıdaki kodu ekleyin. Desteklenen özellikler ve ayrıntılar hakkında bilgi için bkz. Azure SQL Database bağlı hizmet özellikleri.

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

Veri kümeleri oluşturma

Bu bölümde iki veri kümesi oluşturacaksınız: biri kaynak, diğeri havuz için.

Kaynak Azure Blobu için veri kümesi oluşturma

Main oluşturan yöntemine aşağıdaki kodu ekleyin. Desteklenen özellikler ve ayrıntılar hakkında bilgi için bkz. Azure Blob veri kümesi özellikleri.

Azure Blob'daki kaynak verileri temsil eden bir veri kümesi tanımlarsınız. Bu Blob veri kümesi, önceki adımda oluşturduğunuz Azure Storage bağlı hizmeti ifade eder ve şunları açıklar:

  • Kopyalanacak blobun konumu: FolderPath ve FileName
  • İçeriğin nasıl ayrıştırıldığını gösteren blob biçimi: TextFormat ve sütun sınırlayıcısı gibi ayarları
  • Bu örnekte havuz SQL tablosuyla eşlenen sütun adları ve veri türleri de dahil olmak üzere veri yapısı
// 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)
);

Hedef Azure SQL Database için veri kümesi oluşturma

Main oluşturan yöntemine aşağıdaki kodu ekleyin. Desteklenen özellikler ve ayrıntılar hakkında bilgi için bkz. Azure SQL Database veri kümesi özellikleri.

Azure SQL Database havuz verilerini temsil eden bir veri kümesi tanımlarsınız. Bu veri kümesi, önceki adımda oluşturduğunuz Azure SQL Database bağlı hizmeti ifade eder. Ayrıca, kopyalanan verileri tutan SQL tablosunu belirtir.

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

Bir işlem hattı oluştur

Aşağıdaki kodu, bir kopyalama aktivitesiyle hattı oluşturan yöntemine ekleyin. Bu öğreticide, bu işlem hattı bir etkinlik içerir: CopyActivityBlob veri kümesini kaynak olarak, SQL veri kümesini havuz olarak alır. copy etkinliği ayrıntıları hakkında bilgi için bkz. Azure Data Factory'de Kopya etkinliği.

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

İşlem hattı çalıştırması oluştur

Aşağıdaki kodu, işlem hattı çalıştırmasını tetikleyen Main yöntemine ekleyin.

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

İşlem hattı çalıştırmasını izleme

Şimdi işlem hattı çalıştırma durumlarını denetlemek ve kopyalama etkinliği çalıştırması hakkındaki ayrıntıları almak için kodu ekleyin.

  1. Aşağıdaki kodu Main yöntemine ekleyerek, veri kopyalama işlemi tamamlanana kadar işlem hattı çalıştırma durumlarını sürekli kontrol edin.

    // 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. Kopyalama etkinliğini çalıştırma ayrıntılarını, örneğin okunan veya yazılan verilerin boyutunu elde eden Main yöntemine aşağıdaki kodu ekleyin.

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

Kodu çalıştırma

Uygulamayı derlemek için Derle>Çözümü Derle'yi seçin. Ardından, "Hata Ayıklama>Hata Ayıklamayı Başlat" seçeneğini kullanarak uygulamayı başlatın ve işlem hattı yürütmesini kontrol edin.

Konsol, bir veri fabrikası oluşturmaya, bağlı hizmete, veri kümelerine, işlem hattına ve işlem hattı çalıştırmasına yönelik ilerlemenin durumunu görüntüler. Daha sonra işlem hattı çalıştırma durumunu denetler. Veri okuma/yazılı boyutuyla kopyalama etkinliği çalıştırma ayrıntılarını görene kadar bekleyin. Ardından, SQL Server Management Studio (SSMS) veya Visual Studio gibi araçları kullanarak hedef Azure SQL Database bağlanabilir ve belirttiğiniz hedef tablonun kopyalanan verileri içerip içermediğini de kontrol edebilirsiniz.

Örnek çıktı

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

Bu örnekteki işlem hattı verileri bir konumdan Azure blob depolama alanındaki başka bir konuma kopyalar. Şunları öğrendiniz:

  • Veri fabrikası oluşturma.
  • Azure Storage ve Azure SQL Database bağlı hizmetler oluşturun.
  • Azure Blob ve Azure SQL Database veri kümeleri oluşturun.
  • Kopyalama etkinliği içeren bir işlem hattı oluşturun.
  • Bir işlem hattı çalıştırmasını başlat.
  • İşlem hattını ve etkinlik çalıştırmalarını izleyin.

Şirket içinden buluta veri kopyalama hakkında bilgi edinmek için aşağıdaki öğreticiye geçin: