Copy data from Azure Blob to قاعدة بيانات Azure SQL using Azure Data Factory

ينطبق على: Azure Data Factory Azure Synapse Analytics

تلميح

Data Factory في Microsoft Fabric هو الجيل القادم من Azure Data Factory، مع بنية أبسط، وذكاء اصطناعي مدمج، وميزات جديدة. إذا كنت جديدا في تكامل البيانات، ابدأ مع Fabric Data Factory. يمكن لأعباء عمل ADF الحالية الترقية إلى Fabric للوصول إلى قدرات جديدة في علوم البيانات، والتحليلات اللحظية، والتقارير.

في هذا الدرس، تقوم بإنشاء خط أنابيب Data Factory الذي ينسخ البيانات من مساحة تخزين Azure Blob إلى قاعدة بيانات Azure SQL. ينطبق نمط التكوين في هذا البرنامج التعليمي على النسخ من مخزن بيانات يستند إلى ملف إلى مخزن بيانات يعتمد على العلاقات. للحصول على قائمة مخازن البيانات المعتمدة كمصادر ومواضع تلقٍّ، راجع مخازن البيانات المعتمدة والتنسيقات.

يمكنك اتخاذ الخطوات التالية في هذا البرنامج التعليمي:

  • إنشاء data factory.
  • Create تخزين Azure و قاعدة بيانات Azure SQL linked services.
  • Create Azure Blob و قاعدة بيانات Azure SQL datasets.
  • إنشاء خط أنابيب يحتوي على Copy activity.
  • ابدأ تشغيل تدفق.
  • مراقبة تشغيل التدفق والنشاط.

يستخدم هذا الدرس مجموعة تطوير .NET. يمكنك استخدام آليات أخرى للتفاعل مع Azure Data Factory؛ الرجوع إلى العينات تحت Quickstarts.

إذا لم يكن لديك اشتراك Azure، أنشئ حساب Azure مجاني قبل أن تبدأ.

المتطلبات الأساسية

إنشاء كائن ثنائي كبير الحجم وجدول SQL

الآن، جهز Azure Blob وقاعدة بيانات Azure SQL للدرس عن طريق إنشاء كتلة مصدر وجدول SQL لاستخدام السينك.

قم بإنشاء نقطة مصدر

أولاً، قم بإنشاء كائنات مصدر عن طريق إنشاء حاوية وتحميل ملف نصي إدخال إليها:

  1. فتح تطبيق مفكرة التدوين. قم بنسخ النص التالي وحفظه في ملف اسمه inputEmp.txt محليًا.

    John|Doe
    Jane|Doe
    
  2. استخدم أداة مثل Azure Storage Explorer لإنشاء حاوية adfv2tutorial، ولرفع ملف inputEmp.txt إلى الحاوية.

إنشاء جدولsink SQL

بعد ذلك، قم بإنشاء جدول SQL متلقٍّ:

  1. استخدم سكريبت SQL التالي لإنشاء جدول dbo.emp في قاعدة بيانات Azure SQL الخاص بك.

    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 بالوصول إلى قاعدة بيانات SQL. تأكد من السماح بالوصول إلى خدمات Azure في خادمك حتى تتمكن خدمة Data Factory من كتابة البيانات إلى قاعدة بيانات SQL. للتحقق من هذا الإعداد وتشغيله، قم بالخطوات التالية:

    1. اذهب إلى بوابة Azure لإدارة خادم SQL الخاص بك. ابحث عن خوادم SQL وحددها.

    2. حدد الخادم الخاص بك.

    3. ضمن عنوان الأمان بقائمة ملقم SQL، حدد جدران الحماية والشبكات الظاهرية.

    4. في صفحة الجدار الناري والشبكات الافتراضية، تحت السماح Azure الخدمات والموارد بالوصول إلى هذا الخادم، اختر ON.

إنشاء مشروع Visual Studio

باستخدام Visual Studio، أنشئ تطبيق وحدة تحكم بتقنية C# .NET.

  1. افتح Visual Studio.
  2. من نافذة Start، اختر Create a new project.
  3. في نافذة إنشاء مشروع جديد، اختر نسخة C# من Console App (.NET Framework) من قائمة أنواع المشاريع. بعد ذلك حدد التالي.
  4. في نافذة Configure project الجديدة، أدخل Project nameADFv2Tutorial. من أجلالموقع ، استعرض للوصول إلى و/أو إنشاء الدليل لحفظ المشروع فيه. وبعد ذلك، حدد إنشاء. يظهر المشروع الجديد في Visual Studio IDE.

ثبِّت حزم NuGet

بعد ذلك، قم بتثبيت حزم المكتبة المطلوبة باستخدام إدارة حزمة NuGet.

  1. في شريط القوائم، اختر Tools>NuGet مدير الحِزَم>مدير الحِزَم Console.

  2. في لوحة مدير الحِزَم Console، قم بتشغيل الأوامر التالية لتثبيت الحزم. للحصول على معلومات حول حزمة Azure Data Factory NuGet، راجع Microsoft.Azure. Management.DataFactory.

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

كيفية إنشاء مصنع بيانات العميل

اتبع هذه الخطوات لإنشاء عميل مصنع بيانات.

  1. افتح Program.cs، ثم اكتب فوق using العبارات الموجودة مع التعليمات البرمجية التالية لإضافة مراجع إلى مساحات الأسماء.

    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. أضف التعليمات البرمجية التالية إلى Mainالطريقة التي تعين المتغيرات. استبدل العناصر النائبة الـ 14 بقيمك الخاصة.

    للاطلاع على قائمة المناطق Azure التي يتوفر فيها Data Factory حاليا، راجع المنتجات المتاحة حسب المنطقة. ضمن القائمة المنسدلة المنتجات، اختر استعراض>التحليلات>مصنع البيانات. ثم في القائمة المنسدلة المناطق، اختر المناطق التي تهمك. تظهر شبكة بحالة توفر منتجات مصنع البيانات لمناطقك المحددة.

    إشعار

    مخازن البيانات مثل تخزين Azure و قاعدة بيانات Azure SQL، والحوسبات مثل HDInsight التي يستخدمها Data Factory يمكن أن تكون في مناطق أخرى غير ما تختاره ل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. أضف التعليمات البرمجية التالية إلى Mainالطريقة التي تنشئ مثيلاًDataFactoryManagementClient للفئة. يمكنك استخدام هذا الكائن لإنشاء مصنع بيانات وخدمة مرتبطة ومجموعات بيانات وتدفق. يمكنك أيضًا استخدام هذا الكائن لمراقبة تفاصيل تشغيل البنية الأساسية.

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

إنشاء مصدرًا للبيانات

أضف التعليمات البرمجية التالية إلى Mainالطريقة التي تنشئ مصنع البيانات.

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

إنشاء linked services

في هذا البرنامج التعليمي، تقوم بإنشاء خدمتين مرتبطتين للمصدر ومواضع التلقي، على التوالي.

Create an تخزين Azure linked service

أضف الكود التالي إلى طريقة Main التي تنشئ خدمة مرتبطة تخزين Azure. للحصول على معلومات حول الخصائص المدعومة والتفاصيل، راجع 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)
);

أنشئ خدمة مرتبطة قاعدة بيانات Azure SQL

أضف الكود التالي إلى طريقة Main التي تنشئ خدمة مرتبطة قاعدة بيانات Azure SQL. للحصول على معلومات حول الخصائص المدعومة والتفاصيل، راجع قاعدة بيانات Azure SQL خصائص الخدمة المرتبطة.

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

إنشاء datasets

في هذا القسم، يمكنك إنشاء مجموعتي بيانات: واحدة للمصدر والأخرى لمواضع التلقي.

Create a dataset for source Azure Blob

أضف الكود التالي إلى طريقة Main التي تنشئ مجموعة بيانات Azure كلوب. للحصول على معلومات حول الخصائص المدعومة والتفاصيل، راجع Azure خصائص مجموعة بيانات Blob.

أنت تعرف مجموعة بيانات تمثل بيانات المصدر في Azure Blob. تشير مجموعة بيانات Blob هذه إلى الخدمة المرتبطة ب تخزين Azure التي أنشأتها في الخطوة السابقة، وتصف:

  • موقع الكائنات لنسخ من: FolderPath و FileName
  • تنسيق الكائنات الذي يشير إلى كيفية تحليل المحتوى: TextFormat وإعداداته، مثل محدد العمود
  • بنية البيانات، بما في ذلك أسماء الأعمدة وأنواع البيانات، والتي يتم تعيينها في هذا المثال إلى جدول 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)
);

Create a dataset for sink قاعدة بيانات Azure SQL

أضف الكود التالي إلى طريقة Main التي تنشئ مجموعة بيانات قاعدة بيانات Azure SQL. للحصول على معلومات حول الخصائص المدعومة والتفاصيل، انظر قاعدة بيانات Azure SQL propertiess dataset.

أنت تعرف مجموعة بيانات تمثل بيانات المصرف في قاعدة بيانات Azure SQL. تشير هذه المجموعة إلى الخدمة المرتبطة قاعدة بيانات Azure SQL التي أنشأتها في الخطوة السابقة. كما يحدد الجدول SQL الذي يحتوي على البيانات المنسوخة.

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

إنشاء البنية الأساسية لبرنامج ربط العمليات التجارية

أضف التعليمات البرمجية التالية إلى Mainالطريقة التي تنشئ تدفق مع نشاط نسخ. في هذا البرنامج التعليمي، يحتوي التدفق هذا على نشاط واحد: CopyActivity، والذي يأخذ مجموعة بيانات الكائنات كمصدر ومجموعة بيانات SQL كمتلقٍّ. للحصول على معلومات حول copy activity التفاصيل، راجع Copy activity في 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)
);

إنشاء تشغيل البنية الأساسية

أضف التعليمات البرمجية التالية إلى Mainالطريقة التي تدفعتشغيل التدفق.

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

مراقبة تشغيل البنية الأساسية

أدخل الآن التعليمات البرمجية للتحقق من حالات تشغيل التدفق وللحصول على تفاصيل حول تشغيل نشاط النسخ.

  1. أضف التعليمات البرمجية التالية إلى Mainالطريقة للتحقق باستمرار من حالات تشغيل التدفق حتى تنتهي من نسخ البيانات.

    // 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. أضف التعليمات البرمجية التالية إلى Mainالطريقة التي تسترد تفاصيل تشغيل نشاط النسخ، مثل حجم البيانات التي تمت قراءتها أو كتابتها.

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

تشغيل التعليمات البرمجية

إنشاء التطبيق عن طريق اختيار بناء>حل البناء. ثم ابدأ التطبيق باختيار التصحيح>بدء التصحيح، وتحقق من تنفيذ التدفق.

تطبع وحدة التحكم التقدم المحرز في إنشاء مصنع بيانات، وخدمة مرتبطة، ومجموعات بيانات، والتدفق، وتشغيل التدفق. ثم يتحقق من حالة تشغيل المسار. انتظر حتى ترى تفاصيل تشغيل نشاط النسخ مع حجم البيانات المقروءة/المكتوبة. ثم، باستخدام أدوات مثل SQL Server Management Studio (SSMS) أو Visual Studio، يمكنك الاتصال بوجهة قاعدة بيانات Azure SQL والتحقق مما إذا كان جدول الوجهة الذي حددته يحتوي على البيانات المنسوخة.

عينة الإخراج

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

ينسخ خط الأنابيب في هذه العينة البيانات من موقع إلى آخر في مخزن كتلة Azure. لقد تعرفت على كيفية:

  • إنشاء data factory.
  • Create تخزين Azure و قاعدة بيانات Azure SQL linked services.
  • Create Azure Blob و قاعدة بيانات Azure SQL datasets.
  • كيفية إنشاء التدفق من خلال نشاط النسخ.
  • ابدأ تشغيل تدفق.
  • مراقبة تشغيل التدفق والنشاط.

تقدم إلى البرنامج التعليمي التالي للتعرف على نسخ البيانات من الموقع إلى السحابة: