نسخ جداول متعددة مجمعة باستخدام مصنع بيانات Azure باستخدام PowerShell
ينطبق على: Azure Data Factory Azure Synapse Analytics
تلميح
جرب Data Factory في Microsoft Fabric، وهو حل تحليلي متكامل للمؤسسات. يغطي Microsoft Fabric كل شيء بدءا من حركة البيانات إلى علم البيانات والتحليلات في الوقت الحقيقي والمعلومات المهنية وإعداد التقارير. تعرف على كيفية بدء إصدار تجريبي جديد مجانا!
يوضح هذا البرنامج التعليمي نسخ عدد من الجداول من Azure SQL Database إلى Azure Synapse Analytics. يمكنك أيضاً تطبيق النمط ذاته في سيناريوهات النسخ الأخرى أيضاً. على سبيل المثال، نسخ الجداول من SQL Server/Oracle إلى Azure SQL Database/Data Warehouse/Azure Blob، نسخ مسارات مختلفة من Blob إلى جداول Azure SQL Database.
يتضمن هذا البرنامج التعليمي الخطوات التالية، على مستوى أعلى:
- إنشاء data factory.
- إنشاء الخدمات المتصلة Azure SQL Database وAzure Synapse Analytics وAzure Storage.
- إنشاء Azure SQL Database وAzure Synapse Analytics datasets.
- إنشاء بنية أساسية للبحث عن الجداول المراد نسخها وبنية أساسية أخرى لتنفيذ عملية النسخ الفعلي.
- ابدأ تشغيل تدفق.
- مراقبة تشغيل التدفق والنشاط.
يستخدم هذا البرنامج التعليمي Azure PowerShell. للتعرف على المزيد حول استخدام أدوات/SDKs أخرى لإنشاء مصنع بيانات، راجع "Quickstarts".
سير العمل من البداية إلى النهاية
في هذا البرنامج التعليمي، لدينا عدد من الجداول في Azure SQL Database نرغب في نسخها إلى Azure Synapse Analytics. يرد أدناه التسلسل المنطقي لخطوات سير العمل المتبعة في البنيات الأساسية:
- تبحث البنية الأساسية الأولى عن قائمة الجداول التي تحتاج إلى نسخها إلى مخازن البيانات المتلقية. بدلاً من ذلك يمكنك الاحتفاظ بجدول بيانات تعريف يسرد جميع الجداول المراد نسخها إلى مخزن البيانات المتلقي. ثم تشغل البنية الأساسية بنية أساسية أخرى، والتي تتكرر في كل جدول من جداول قاعدة البيانات وتنفذ عملية نسخ البيانات.
- تنفذ البنية الأساسية الثانية النسخ الفعلي. فهي تأخذ قائمة الجداول كمعلمة. لكل جدول في القائمة، أنسخ الجدول المحدد في Azure SQL Database إلى الجدول المقابل في Azure Synapse Analytics باستخدام staged copy via Blob storage and PolyBase للحصول على أفضل أداء. في هذا المثال، تمرر البنية الأساسية الأولى قائمة الجداول كقيمة للمعلمة.
في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء.
المتطلبات الأساسية
إشعار
نوصي باستخدام الوحدة النمطية Azure Az PowerShell للتفاعل مع Azure. للبدء، راجع تثبيت Azure PowerShell. لمعرفة كيفية الترحيل إلى الوحدة النمطية Az PowerShell، راجع ترحيل Azure PowerShell من AzureRM إلى Az.
- Azure PowerShell. اتبع الإرشادات الموجودة في كيفية تثبيت وتكوين Azure PowerShell.
- حساب في مساحة تخزين Azure. يتم استخدام حساب Azure Storage كمخزن blob المرحلي في عملية النسخ المجمع.
- Azure SQL Database. تحتوي قاعدة البيانات هذه على بيانات المصدر.
- Azure Synapse Analytics. يحتفظ مستودع البيانات هذا بالبيانات المنسوخة من SQL Database.
جهز SQL Database وAzure Synapse Analytics
جهز Azure SQL Database المصدر:
إنشاء قاعدة بيانات باستخدام بيانات عينة Adventure Works LT في SQL Database من خلال مقال Create a database in Azure SQL Database التالي. ينسخ هذا البرنامج التعليمي جميع الجداول من قاعدة بيانات النموذج هذه إلى Azure Synapse Analytics.
جهز Azure Synapse Analytics المتلقي:
إذا لم يكن لديك مساحة عمل Azure Synapse Analytics، فراجع مقالة Get started with Azure Synapse Analytics لمعرفة خطوات إنشاء مساحة عمل.
إنشاء مخططات الجدول المطابق في Azure Synapse Analytics. يمكنك استخدام Azure Data Factory لترحيل/نسخ البيانات في خطوة أخرى.
خدمات Azure للوصول إلى خادم SQL
في كل من SQL Database وAzure Synapse Analytics، أسمح بوصول خدمات Azure إلى خادم SQL. تأكد من تشغيل إعداد Allow access to Azure services لخادمك. هذا الإعداد يسمح لخدمة مصنع البيانات بقراءة بيانات من Azure SQL Database الخاص بك وكتابة بيانات على Azure Synapse Analytics. للتحقق من هذا الإعداد وتشغيله، قم بالخطوات التالية:
- أنقر فوق All services على الشمال ثم أنقر فوق SQL servers.
- حدد الخادم، وأنقر فوق Firewall من SETTINGS.
- في صفحة Firewall settings، انقر فوق ON من أجل Allow access to Azure services.
إنشاء مصدرًا للبيانات
شغّل PowerShell. المحافظة على Azure PowerShell مفتوحاً حتى نهاية هذا البرنامج التعليمي. في حال قمت بإغلاق وإعادة فتح، تحتاج إلى تشغيل الأوامر مرة أخرى.
شغّل الأمر التالي، وأدخل اسم المستخدم وكلمة المرور اللذين تستخدمهما لتسجيل الدخول إلى مدخل Microsoft Azure:
Connect-AzAccount
شغّل الأمر التالي لعرض جميع الاشتراكات لهذا الحساب:
Get-AzSubscription
شغّل الأمر التالي لتحديد الاشتراك الذي تريد العمل معه. استبدل SubscriptionId بـ ID الخاص باشتراك Azure الخاص بك:
Select-AzSubscription -SubscriptionId "<SubscriptionId>"
شغل cmdlet Set-AzDataFactoryV2 لإنشاء مصنع بيانات. استبدل العنصر النائب بقيمك الخاصة قبل تنفيذ الأمر.
$resourceGroupName = "<your resource group to create the factory>" $dataFactoryName = "<specify the name of data factory to create. It must be globally unique.>" Set-AzDataFactoryV2 -ResourceGroupName $resourceGroupName -Location "East US" -Name $dataFactoryName
لاحظ النقاط التالية:
يجب أن يكون اسم Azure Data Factory فريداً بصفة عمومية. في حال تلقيت الخطأ التالي، تغيير الاسم، ثم حاول مرة أخرى.
The specified Data Factory name 'ADFv2QuickStartDataFactory' is already in use. Data Factory names must be globally unique.
لإنشاء مثيلات Data Factory، يجب أن تكون مساهماً أو مسؤولاً في اشتراك Azure.
للحصول على قائمة بمناطق Azure التي يتوفر فيها حالياً Data Factory، حدد المناطق التي تهمك في الصفحة التالية، ثم قم بتوسيع "Analytics" لتحديد موقع Data Factory: "Products available by region". تخزن البيانات (Azure Storage، وAzure SQL Database، وما إلى ذلك) وتحسب (HDInsight، وما إلى ذلك) التي يستخدمها مصنع البيانات في مناطق أخرى.
إنشاء linked services
في هذا البرنامج التعليمي، يمكنك إنشاء ثلاث خدمات متصلة للمصدر، والمتلقي، والبيانات الثنائية الكبيرة المرحلية على التوالي، والتي تشمل اتصالات بمخازن البيانات الخاصة بك:
أنشئ الخدمة المتصلة Azure SQL Database المصدر
أنشئ ملف JSON باسم AzureSqlDatabaseLinkedService.json في المجلد C:\ADFv2TutorialBulkCopy بالمحتوى التالي: (أنشئ المجلد ADFv2TutorialBulkCopy إذا لم يكن موجوداً بالفعل.)
هام
استبدل<servername>، و<databasename>، و<username>@<servername> و<password> بقيم لـ Azure SQL Database قبل حفظ الملف.
{ "name": "AzureSqlDatabaseLinkedService", "properties": { "type": "AzureSqlDatabase", "typeProperties": { "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=<databasename>;User ID=<username>@<servername>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30" } } }
في Azure PowerShell، أنتقل إلى ملف ADFv2TutorialBulkCopy.
شغل cmdlet Set-AzDataFactoryV2LinkedService لإنشاء الخدمة المرتبطة: AzureSqlDatabaseLinkedService.
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDatabaseLinkedService" -File ".\AzureSqlDatabaseLinkedService.json"
فيما يلي ناتج العينة:
LinkedServiceName : AzureSqlDatabaseLinkedService ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDatabaseLinkedService
أنشئ خدمة Azure Synapse Analytics المتصلة المتلقية
أنشئ ملف JSON باسم AzureSqlDWLinkedService.json في المجلد C:\ADFv2TutorialBulkCopy، بالمحتوى التالي:
هام
استبدل<servername>، و<databasename>، و<username>@<servername> و<password> بقيم لـ Azure SQL Database قبل حفظ الملف.
{ "name": "AzureSqlDWLinkedService", "properties": { "type": "AzureSqlDW", "typeProperties": { "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=<databasename>;User ID=<username>@<servername>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=30" } } }
أنشئ الخدمة المتصلة AzureSqlDWLinkedService، شغل cmdlet Set-AzDataFactoryV2LinkedService.
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDWLinkedService" -File ".\AzureSqlDWLinkedService.json"
فيما يلي ناتج العينة:
LinkedServiceName : AzureSqlDWLinkedService ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDWLinkedService
إنشاء خدمة Azure Storage المتصلة المرحلية
في هذا البرنامج التعليمي، يمكنك استخدام Azure Blob storage كمنطقة تدريجية مؤقتة لتمكين PolyBase للحصول على أداء نسخ أفضل.
أنشئ ملف JSON باسم AzureSqlDWLinkedService.json في المجلد C:\ADFv2TutorialBulkCopy، بالمحتوى التالي:
هام
استبدل <accountname>و<accountkey> باسم ومفتاح من حساب Azure Storage الخاص بك قبل حفظ الملف.
{ "name": "AzureStorageLinkedService", "properties": { "type": "AzureStorage", "typeProperties": { "connectionString": "DefaultEndpointsProtocol=https;AccountName=<accountName>;AccountKey=<accountKey>" } } }
لإنشاء الخدمة المتصلة: AzureStorageLinkedService، شغل cmdlet Set-AzDataFactoryV2LinkedService.
Set-AzDataFactoryV2LinkedService -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureStorageLinkedService" -File ".\AzureStorageLinkedService.json"
فيما يلي ناتج العينة:
LinkedServiceName : AzureStorageLinkedService ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Properties : Microsoft.Azure.Management.DataFactory.Models.AzureStorageLinkedService
إنشاء datasets
في هذا البرنامج التعليمي، لإنشاء مجموعات بيانات المصدر والمتلقي، التي تحدد موقع تخزين البيانات:
أنشئ مجموعة بيانات لـ SQL Database المصدر
أنشئ ملف JSON باسم AzureSqlDatabaseDataset.json في مجلد C:\ADFv2TutorialBulkCopy، بالمحتوى التالي. "tableName" هو اسم وهمي حيث أنك تستخدم فيما بعد استعلام SQL في نشاط النسخ لاسترداد البيانات.
{ "name": "AzureSqlDatabaseDataset", "properties": { "type": "AzureSqlTable", "linkedServiceName": { "referenceName": "AzureSqlDatabaseLinkedService", "type": "LinkedServiceReference" }, "typeProperties": { "tableName": "dummy" } } }
لإنشاء مجموعة البيانات: AzureSqlDatabaseDataset، شغل "Set-AzDataFactoryV2Dataset cmdlet.
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDatabaseDataset" -File ".\AzureSqlDatabaseDataset.json"
فيما يلي ناتج العينة:
DatasetName : AzureSqlDatabaseDataset ResourceGroupName : <resourceGroupname> DataFactoryName : <dataFactoryName> Structure : Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlTableDataset
أنشئ مجموعة بيانات لـ Azure Synapse Analytics المتلقي
نشئ ملف JSON باسم AzureSqlDWDataset.json في مجلد C:\ADFv2TutorialBulkCopy، بالمحتوى التالي: يُحدد "tableName" على أنه معلمة، وبعد ذلك يمرر نشاط النسخ الذي يشير إلى مجموعة البيانات هذه القيمة الفعلية إلى مجموعة البيانات.
{ "name": "AzureSqlDWDataset", "properties": { "type": "AzureSqlDWTable", "linkedServiceName": { "referenceName": "AzureSqlDWLinkedService", "type": "LinkedServiceReference" }, "typeProperties": { "tableName": { "value": "@{dataset().DWTableName}", "type": "Expression" } }, "parameters":{ "DWTableName":{ "type":"String" } } } }
لإنشاء مجموعة البيانات: AzureSqlDWDataset، شغل Set-AzDataFactoryV2Dataset cmdlet.
Set-AzDataFactoryV2Dataset -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "AzureSqlDWDataset" -File ".\AzureSqlDWDataset.json"
فيما يلي ناتج العينة:
DatasetName : AzureSqlDWDataset ResourceGroupName : <resourceGroupname> DataFactoryName : <dataFactoryName> Structure : Properties : Microsoft.Azure.Management.DataFactory.Models.AzureSqlDwTableDataset
البنيات الأساسية لتطبيق Azure
في هذا البرنامج التعليمي، تنشئ أثنين بنية أساسية:
أنشئ البنية الأساسية "IterateAndCopySQLTables"
تتخذ هذه البنية الأساسية قائمة جداول على أنها معلمة. بالنسبة لكل جدول في القائمة، تنسخ بيانات من الجدول في Azure SQL Database إلى Azure Synapse Analytics باستخدام النسخ المرحلي وPolyBase.
أنشئ ملف JSON باسم IterateAndCopySQLTables.json في المجلد C:\ADFv2TutorialBulkCopy، بالمحتوى التالي:
{ "name": "IterateAndCopySQLTables", "properties": { "activities": [ { "name": "IterateSQLTables", "type": "ForEach", "typeProperties": { "isSequential": "false", "items": { "value": "@pipeline().parameters.tableList", "type": "Expression" }, "activities": [ { "name": "CopyData", "description": "Copy data from Azure SQL Database to Azure Synapse Analytics", "type": "Copy", "inputs": [ { "referenceName": "AzureSqlDatabaseDataset", "type": "DatasetReference" } ], "outputs": [ { "referenceName": "AzureSqlDWDataset", "type": "DatasetReference", "parameters": { "DWTableName": "[@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]" } } ], "typeProperties": { "source": { "type": "SqlSource", "sqlReaderQuery": "SELECT * FROM [@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]" }, "sink": { "type": "SqlDWSink", "preCopyScript": "TRUNCATE TABLE [@{item().TABLE_SCHEMA}].[@{item().TABLE_NAME}]", "allowPolyBase": true }, "enableStaging": true, "stagingSettings": { "linkedServiceName": { "referenceName": "AzureStorageLinkedService", "type": "LinkedServiceReference" } } } } ] } } ], "parameters": { "tableList": { "type": "Object" } } } }
لإنشاء البنية الأساسية: IterateAndCopySQLTables، شغل Set-AzDataFactoryV2Pipeline cmdlet.
Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "IterateAndCopySQLTables" -File ".\IterateAndCopySQLTables.json"
فيما يلي ناتج العينة:
PipelineName : IterateAndCopySQLTables ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Activities : {IterateSQLTables} Parameters : {[tableList, Microsoft.Azure.Management.DataFactory.Models.ParameterSpecification]}
أنشئ البنية الأساسية "GetTableListAndTriggerCopyData"
تؤدي هذه البنية الأساسية خطوتين اثنتين:
- تبحث عن جدول نظام Azure SQL Database لتحصل على قائمة الجداول المراد نسخها.
- شغل البنية الأساسية "IterateAndCopySQLTables" لإجراء نسخ البيانات الفعلي.
أنشئ ملف JSON باسم GetTableListAndTriggerCopyData.json في المجلدC:\ADFv2TutorialBulkCopy، بالمحتوى التالي:
{ "name":"GetTableListAndTriggerCopyData", "properties":{ "activities":[ { "name": "LookupTableList", "description": "Retrieve the table list from Azure SQL database", "type": "Lookup", "typeProperties": { "source": { "type": "SqlSource", "sqlReaderQuery": "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE = 'BASE TABLE' and TABLE_SCHEMA = 'SalesLT' and TABLE_NAME <> 'ProductModel'" }, "dataset": { "referenceName": "AzureSqlDatabaseDataset", "type": "DatasetReference" }, "firstRowOnly": false } }, { "name": "TriggerCopy", "type": "ExecutePipeline", "typeProperties": { "parameters": { "tableList": { "value": "@activity('LookupTableList').output.value", "type": "Expression" } }, "pipeline": { "referenceName": "IterateAndCopySQLTables", "type": "PipelineReference" }, "waitOnCompletion": true }, "dependsOn": [ { "activity": "LookupTableList", "dependencyConditions": [ "Succeeded" ] } ] } ] } }
لإنشاء البنية الأساسية: GetTableListAndTriggerCopyData، شغل Set-AzDataFactoryV2Pipeline cmdlet.
Set-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -Name "GetTableListAndTriggerCopyData" -File ".\GetTableListAndTriggerCopyData.json"
فيما يلي ناتج العينة:
PipelineName : GetTableListAndTriggerCopyData ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> Activities : {LookupTableList, TriggerCopy} Parameters :
بدء وعرض تشغيل البنية الأساسية
بدء تشغيل بنية أساسية للبنية الأساسية الرئيسية "GetTableListAndTriggerCopyData" لحفظ معرف تشغيل البنية الأساسية من أجل المراقبة المستقبلية. في الأسفل، فإنه ينفذ تشغيل البنية الأساسية "IterateAndCopySQLTables" كما هو محدد في نشاط ExecutePipeline.
$runId = Invoke-AzDataFactoryV2Pipeline -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineName 'GetTableListAndTriggerCopyData'
شغل البرنامج النصي التالي للتحقق باستمرار من حالة تشغيل البنية الأساسية GetTableListAndTriggerCopyData، وأطبع نتيجة التشغيل النهائي للبنية الأساسية ونتيجة تشغيل النشاط.
while ($True) { $run = Get-AzDataFactoryV2PipelineRun -ResourceGroupName $resourceGroupName -DataFactoryName $DataFactoryName -PipelineRunId $runId if ($run) { if ($run.Status -ne 'InProgress') { Write-Host "Pipeline run finished. The status is: " $run.Status -ForegroundColor "Yellow" Write-Host "Pipeline run details:" -ForegroundColor "Yellow" $run break } Write-Host "Pipeline is running...status: InProgress" -ForegroundColor "Yellow" } Start-Sleep -Seconds 15 } $result = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineRunId $runId -RunStartedAfter (Get-Date).AddMinutes(-30) -RunStartedBefore (Get-Date).AddMinutes(30) Write-Host "Activity run details:" -ForegroundColor "Yellow" $result
إليك ناتج تشغيل العينة:
Pipeline run details: ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> RunId : 0000000000-00000-0000-0000-000000000000 PipelineName : GetTableListAndTriggerCopyData LastUpdated : 9/18/2017 4:08:15 PM Parameters : {} RunStart : 9/18/2017 4:06:44 PM RunEnd : 9/18/2017 4:08:15 PM DurationInMs : 90637 Status : Succeeded Message : Activity run details: ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> ActivityName : LookupTableList PipelineRunId : 0000000000-00000-0000-0000-000000000000 PipelineName : GetTableListAndTriggerCopyData Input : {source, dataset, firstRowOnly} Output : {count, value, effectiveIntegrationRuntime} LinkedServiceName : ActivityRunStart : 9/18/2017 4:06:46 PM ActivityRunEnd : 9/18/2017 4:07:09 PM DurationInMs : 22995 Status : Succeeded Error : {errorCode, message, failureType, target} ResourceGroupName : <resourceGroupName> DataFactoryName : <dataFactoryName> ActivityName : TriggerCopy PipelineRunId : 0000000000-00000-0000-0000-000000000000 PipelineName : GetTableListAndTriggerCopyData Input : {pipeline, parameters, waitOnCompletion} Output : {pipelineRunId} LinkedServiceName : ActivityRunStart : 9/18/2017 4:07:11 PM ActivityRunEnd : 9/18/2017 4:08:14 PM DurationInMs : 62581 Status : Succeeded Error : {errorCode, message, failureType, target}
يمكنك الحصول على معرف تشغيل البنية الأساسية "IterateAndCopySQLTables"، وفحص نتيجة تشغيل النشاط بالتفصيل على النحو التالي.
Write-Host "Pipeline 'IterateAndCopySQLTables' run result:" -ForegroundColor "Yellow" ($result | Where-Object {$_.ActivityName -eq "TriggerCopy"}).Output.ToString()
إليك ناتج تشغيل العينة:
{ "pipelineRunId": "7514d165-14bf-41fb-b5fb-789bea6c9e58" }
$result2 = Get-AzDataFactoryV2ActivityRun -DataFactoryName $dataFactoryName -ResourceGroupName $resourceGroupName -PipelineRunId <copy above run ID> -RunStartedAfter (Get-Date).AddMinutes(-30) -RunStartedBefore (Get-Date).AddMinutes(30) $result2
اتصل بـ Azure Synapse Analytics المتلقي وأكد على أنه تم نسخ البيانات من Azure SQL Database بشكل صحيح.
المحتوى ذو الصلة
نفّذت الخطوات التالية في هذا البرنامج التعليمي:
- إنشاء data factory.
- إنشاء الخدمات المتصلة Azure SQL Database وAzure Synapse Analytics وAzure Storage.
- إنشاء Azure SQL Database وAzure Synapse Analytics datasets.
- إنشاء بنية أساسية للبحث عن الجداول المراد نسخها وبنية أساسية أخرى لتنفيذ عملية النسخ الفعلي.
- ابدأ تشغيل تدفق.
- مراقبة تشغيل التدفق والنشاط.
تقدم إلى البرنامج التعليمي التالي للتعرف على نسخ البيانات بشكل تدريجي من مصدر إلى وجهة: