Salin data dari Azure Blob ke Azure SQL Database menggunakan Azure Data Factory

BERLAKU UNTUK:Azure Data Factory Azure Synapse Analytics

Tip

Cobalah Data Factory di Microsoft Fabric, solusi analitik all-in-one untuk perusahaan. Microsoft Fabric mencakup semuanya mulai dari pergerakan data hingga ilmu data, analitik real time, kecerdasan bisnis, dan pelaporan. Pelajari cara memulai uji coba baru secara gratis!

Di tutorial ini, Anda membuat alur Data Factory yang menyalin data dari Azure Blob Storage ke Azure SQL Database. Pola konfigurasi di tutorial ini berlaku untuk menyalin dari penyimpanan data berbasis file ke penyimpanan data relasional. Untuk daftar penyimpanan data yang didukung sebagai sumber dan sink, lihat penyimpanan data dan format yang didukung.

Anda mengambil langkah-langkah berikut Di tutorial ini:

  • Membuat pabrik data.
  • Buat layanan tertaut Azure Storage dan Azure SQL Database.
  • Buat himpunan data Blob Azure dan Azure SQL Database.
  • Buat alur berisi aktivitas Salin.
  • Memulai eksekusi alur.
  • Pantau eksekusi alur dan aktivitas.

Tutorial ini menggunakan .NET SDK. Anda dapat menggunakan mekanisme lain untuk berinteraksi dengan Azure Data Factory; lihat contoh di bawah Mulai Cepat.

Jika tidak memiliki langganan Azure, buat akun Azure gratis sebelum Anda memulai.

Prasyarat

  • Akun Azure Storage. Anda menggunakan penyimpanan blob sebagai penyimpanan data sumber. Jika Anda tidak memiliki akun penyimpanan Azure, lihat Buat akun penyimpanan tujuan umum.
  • Microsoft Azure SQL database. Anda menggunakan database sebagai penyimpanan data sink. Jika Anda tidak memiliki database di Azure SQL Database, lihat Membuat database di Azure SQL Database.
  • Visual Studio. Panduan dalam artikel ini menggunakan Visual Studio 2019.
  • SDK Azure untuk .NET.
  • Aplikasi Microsoft Entra. Jika Anda tidak memiliki aplikasi Microsoft Entra, lihat bagian Membuat aplikasi Microsoft Entra dari Cara: Menggunakan portal untuk membuat aplikasi Microsoft Entra. Salin nilai berikut untuk digunakan di langkah selanjutnya: ID Aplikasi (klien), kunci autentikasi, dan ID Direktori (penyewa). Tetapkan aplikasi ke peran Kontributor dengan mengikuti instruksi di artikel yang sama.

Buat blob dan tabel SQL

Sekarang, siapkan Azure Blob dan Azure SQL Database untuk tutorial dengan membuat blob sumber dan sink tabel SQL.

Membuat blob sumber

Pertama, buat blob sumber dengan membuat kontainer dan mengunggah file teks input ke dalamnya:

  1. Buka Notepad. Salin teks berikut dan simpan secara lokal ke file bernama inputEmp.txt.

    John|Doe
    Jane|Doe
    
  2. Gunakan alat seperti Penjelajah Azure Storage untuk membuat kontainer adfv2tutorial, dan untuk mengunggah file inputEmp.txt ke kontainer.

Buat tabel SQL sink

Selanjutnya, buat tabel SQL sink:

  1. Gunakan skrip SQL berikut ini untuk membuat tabel dbo.emp di Azure SQL Database Anda.

    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. Izinkan layanan Azure untuk mengakses Azure SQL Database. Pastikan Anda mengizinkan akses ke layanan Azure di server Anda sehingga layanan Data Factory dapat menulis data ke SQL Database. Untuk memverifikasi dan mengaktifkan pengaturan ini, lakukan langkah berikut:

    1. Buka portal Microsoft Azure untuk mengelola Server SQL Anda. Cari dan pilih server SQL.

    2. Pilih server Anda.

    3. Di bawah judul Keamanan menu server SQL, pilih Firewall dan jaringan virtual.

    4. Di halaman Firewall dan jaringan virtual, di bawah Izinkan layanan dan sumber daya Azure untuk mengakses server ini, pilih AKTIF.

Membuat proyek Visual Studio

Menggunakan Visual Studio, buat aplikasi konsol C# .NET.

  1. Buka Visual Studio.
  2. Di jendela Mulai, pilih Buat proyek baru.
  3. Di jendela Buat project baru, pilih versi C# Aplikasi Konsol (.NET Framework) dari daftar jenis proyek. Kemudian pilih Berikutnya.
  4. Di jendela Konfigurasikan proyek baru Anda, masukkan Nama proyek dari ADFv2Tutorial. Untuk Lokasi, telusuri ke dan/atau buat direktori untuk menyimpan proyek. Lalu pilih Buat. Proyek baru muncul di IDE Visual Studio.

Instal paket NuGet

Selanjutnya, pasang paket pustaka yang diperlukan menggunakan pengelola paket NuGet.

  1. Di bar menu, pilih Alat>Pengelola Paket NuGet>Konsol Pengelola Paket.

  2. Di panel Konsol Pengelola Paket, jalankan perintah berikut untuk memasang paket. Untuk informasi tentang paket NuGet Azure Data Factory, lihat Microsoft.Azure.Management.DataFactory.

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

Membuat klien pabrik data

Ikuti langkah berikut untuk membuat klien pabrik data.

  1. Buka Program.cs, lalu timpa usingpernyataan yang ada dengan kode berikut untuk menambahkan referensi ke namespace layanan.

    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. Tambahkan kode berikut ke Main metode yang mengatur variabel. Ganti 14 tempat penampung dengan nilai Anda.

    Untuk melihat daftar wilayah Azure di mana Data Factory saat ini tersedia, lihat Produk yang tersedia menurut wilayah. Di bawah daftar drop-down Produk, pilih Telusuri>Analitik>Data Factory. Lalu di daftar drop-down Wilayah, pilih wilayah yang menarik minat Anda. Kisi muncul dengan status ketersediaan produk Data Factory untuk wilayah yang Anda pilih.

    Catatan

    Penyimpanan data, seperti Azure Storage dan Azure SQL Database, dan komputasi, seperti HDInsight, yang digunakan Data Factory bisa berada di wilayah lain dari yang Anda pilih untuk 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. Tambahkan kode berikut ke Main metode yang membuat instans DataFactoryManagementClient kelas. Anda menggunakan objek ini untuk membuat pabrik data, layanan tertaut, himpunan data, dan alur. Anda juga menggunakan obyek ini untuk memantau detail eksekusi alur.

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

Membuat pabrik data

Tambahkan kode berikut ke Main metode yang membuat pabrik data.

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

Membuat layanan tertaut

Di tutorial ini, Anda membuat dua layanan tertaut untuk sumber dan sink, masing-masing.

Membuat layanan tertaut Azure Storage

Tambahkan kode berikut ke Main metode yang membuat layanan tertaut Azure Storage. Untuk informasi selengkapnya tentang properti dan detail yang didukung, lihat Properti layanan tertaut Blob Azure.

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

Buat layanan tertaut Azure SQL Database

Tambahkan kode berikut ke Main metode yang membuat layanan tertaut Azure SQL Database. Untuk informasi selengkapnya tentang properti dan detail yang didukung, lihat Properti layanan tertaut 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)
);

Membuat himpunan data

Di bagian ini, Anda membuat dua himpunan data: satu untuk sumber dan yang lain untuk sink.

Membuat himpunan data untuk Azure Blob sumber

Tambahkan kode berikut ke Main metode yang membuat himpunan data blob Azure. Untuk informasi tentang properti dan detail yang didukung, lihat Properti himpunan data Azure Blob.

Anda menentukan himpunan data yang mewakili data sumber di Azure Blob. Himpunan data Blob ini mengacu pada layanan tertaut Azure Storage yang Anda buat di langkah sebelumnya, dan menjelaskan:

  • Lokasi blob untuk disalin dari: FolderPath dan FileName
  • Format blob menunjukkan cara memilah konten: TextFormat dan pengaturannya, seperti pemisah kolom
  • Struktur data, termasuk nama kolom dan jenis data, yang memetakan dalam contoh ini ke tabel SQL sink
// 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)
);

Buat himpunan data untuk Azure SQL Database sink

Tambahkan kode berikut ke Main metode yang membuat himpunan data Azure SQL Database. Untuk informasi tentang properti dan detail yang didukung, lihat Properti himpunan data Azure SQL Database.

Anda menentukan himpunan data yang mewakili data sink di Azure SQL Database. Himpunan data ini mengacu pada layanan tertaut Azure SQL Database yang Anda buat di langkah sebelumnya. Ini juga menentukan tabel SQL yang menyimpan data yang disalin.

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

Buat alur

Tambahkan kode berikut ke Main metode yang membuat alur dengan aktivitas salinan. Di tutorial ini, alur ini berisi satu aktivitas: CopyActivity, yang berperan dalam himpunan data Blob sebagai sumber dan himpunan data SQL sebagai sink. Untuk informasi tentang detail aktivitas salinan, lihat Aktivitas salinan di 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)
);

Membuat eksekusi alur

Tambahkan kode berikut ke Main metode yang memicu eksekusi alur.

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

Memantau eksekusi alur

Sekarang masukkan kode untuk memeriksa status eksekusi alur dan untuk mendapatkan detail tentang aktivitas salinan yang dijalankan.

  1. Tambahkan kode berikut ke Main metode untuk terus memeriksa status alur hingga selesai menyalin 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. Tambahkan kode berikut ke Main metode yang mengambil eksekusi aktivitas salinan, seperti ukuran data yang dibaca atau ditulis.

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

Menjalankan kode

Bangun aplikasi dengan memilih Bangun>Solusi Bangun. Kemudian mulai aplikasi dengan memilih Debug>Mulai mendebug, dan verifikasi eksekusi alur.

Konsol mencetak progres pembuatan pabrik data, layanan tertaut, himpunan data, alur, dan eksekusi alur. Kemudian memeriksa status eksekusi alur. Tunggu hingga Anda melihat detail eksekusi aktivitas salinan dengan ukuran data dibaca/ditulis. Lalu, menggunakan alat seperti SQL Server Management Studio (SSMS) atau Visual Studio, Anda dapat menyambungkan ke Azure SQL Database tujuan Anda dan memeriksa apakah tabel tujuan yang Anda tentukan berisi data yang disalin.

Sampel output

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

Alur dalam sampel ini menyalin data dari satu lokasi ke lokasi lain dalam penyimpanan blob Azure. Anda mempelajari cara untuk:

  • Membuat pabrik data.
  • Buat layanan tertaut Azure Storage dan Azure SQL Database.
  • Buat himpunan data Blob Azure dan Azure SQL Database.
  • Buat alur berisi aktivitas salinan.
  • Memulai eksekusi alur.
  • Pantau eksekusi alur dan aktivitas.

Lanjutkan ke tutorial berikut untuk mempelajari tentang menyalin data dari lokal ke cloud: