Copiare dati da un BLOB di Azure al database SQL di Azure con Azure Data Factory
SI APPLICA A: Azure Data Factory Azure Synapse Analytics
Suggerimento
Provare Data Factory in Microsoft Fabric, una soluzione di analisi all-in-one per le aziende. Microsoft Fabric copre tutto, dallo spostamento dati al data science, all'analisi in tempo reale, alla business intelligence e alla creazione di report. Vedere le informazioni su come iniziare una nuova prova gratuita!
In questa esercitazione si crea una pipeline di Data Factory che copia i dati da un archivio BLOB di Azure al database SQL di Azure. Il modello di configurazione di questa esercitazione si applica alla copia da un archivio dati basato su file a un archivio dati relazionale. Per un elenco degli archivi dati supportati come origini e sink, vedere i formati e gli archivi dati supportati.
In questa esercitazione vengono completati i passaggi seguenti:
- Creare una data factory.
- Creare servizi collegati Archiviazione di Azure e Database SQL di Azure.
- Creare i set di dati del BLOB di Azure e del database SQL di Azure.
- Creare una pipeline contenente un'attività di copia.
- Avviare un'esecuzione della pipeline.
- Monitorare le esecuzioni di pipeline e attività.
In questa esercitazione viene usato .NET SDK. È possibile usare altri meccanismi per interagire con Azure Data Factory. Vedere gli esempi in Avvii rapidi.
Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.
Prerequisiti
- Account di archiviazione di Azure. Usare l'archivio BLOB come archivio dati di origine. Se non si ha un account di archiviazione di Azure, vedere Creare un account di archiviazione per utilizzo generico.
- Database SQL di Azure. Usare il database come archivio dati sink. Se non si ha un database nel database SQL di Azure, vedere Creare un database nel database SQL di Azure.
- Visual Studio. Nella procedura guidata illustrata in questo articolo viene usato Visual Studio 2019.
- Azure SDK per .NET.
- Applicazione Microsoft Entra. Se non si dispone di un'applicazione Microsoft Entra, vedere la sezione Creare un'applicazione Microsoft Entra di Procedura: Usare il portale per creare un'applicazione Microsoft Entra. Copiare i valori seguenti da usare nei passaggi successivi: ID applicazione (client), chiave di autenticazione e ID directory (tenant). Assegnare l'applicazione al ruolo Collaboratore seguendo le istruzioni disponibili nello stesso articolo.
Creare un BLOB e una tabella SQL
Preparare ora il BLOB di Azure e database SQL di Azure per l'esercitazione creando un BLOB di origine e una tabella SQL sink.
Creare un BLOB di origine
Prima di tutto, creare un BLOB di origine creando un contenitore e caricando al suo interno un file di testo di input:
Aprire il Blocco note. Copiare il testo seguente e salvarlo in locale in un file denominato inputEmp.txt.
John|Doe Jane|Doe
Usare uno strumento come Azure Storage Explorer per creare il contenitore adfv2tutorial e per caricare il file inputEmp.txt nel contenitore.
Creare una tabella SQL sink
Creare quindi una tabella SQL sink:
Usare lo script SQL seguente per creare la tabella dbo.emp nel database SQL di Azure.
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);
Consentire ai servizi di Azure di accedere al database SQL. Assicurarsi di aver consentito l'accesso ai servizi di Azure nel server in modo che il servizio Data Factory possa scrivere dati nel database SQL. Per verificare e attivare l'impostazione, seguire questa procedura:
Passare al portale di Azure per gestire il server SQL. Cercare e selezionare Server SQL.
Selezionare il server.
Nell'intestazione Sicurezza menu del server SQL selezionare Firewall e reti virtuali.
Nella pagina Firewall e reti virtuali selezionare SÌ per Consenti alle risorse e ai servizi di Azure di accedere a questo server.
Creare un progetto di Visual Studio
Creare un'applicazione console .NET in C# con Visual Studio.
- Aprire Visual Studio.
- Nella finestra iniziale selezionare Crea un nuovo progetto.
- Nella finestra Crea un nuovo progetto scegliere la versione C# di App console (.NET Framework) dall'elenco dei tipi di progetto. Quindi seleziona Avanti.
- Nella finestra Configura il nuovo progetto in Nome progetto immettere ADFv2Tutorial. Per Percorso, individuare e/o creare la directory in cui salvare il progetto. Selezionare Crea. Il nuovo progetto verrà visualizzato nell'IDE di Visual Studio.
Installare i pacchetti NuGet
Installare quindi i pacchetti di libreria necessari usando Gestione pacchetti NuGet.
Nella barra dei menu scegliere Strumenti>Gestione pacchetti NuGet>Console di Gestione pacchetti.
Nel riquadro Console di Gestione pacchetti eseguire questi comandi per installare i pacchetti. Per altre informazioni sul pacchetto NuGet per Azure Data Factory, vedere il Microsoft.Azure.Management.DataFactory.
Install-Package Microsoft.Azure.Management.DataFactory Install-Package Microsoft.Azure.Management.ResourceManager -PreRelease Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
Creare un client di data factory
Per creare un client di data factory, seguire questa procedura.
Aprire il file Program.cs, sovrascrivere le istruzioni
using
esistenti con il codice seguente per aggiungere i riferimenti agli spazi dei nomi.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;
Aggiungere il codice seguente al metodo
Main
per impostare le variabili. Sostituire i 14 segnaposto con i valori personalizzati.Per visualizzare l'elenco delle aree di Azure in cui Data Factory è attualmente disponibile, vedere Prodotti disponibili in base all'area. Nell'elenco a discesa Prodotti scegliere Esplora>Analisi>Data Factory. Quindi nell'elenco a discesa Aree selezionare le aree a cui si è interessati. Verrà visualizzata una griglia con lo stato di disponibilità dei prodotti Data Factory per le aree selezionate.
Nota
Gli archivi dati, ad esempio, Archiviazione di Azure e il database SQL di Azure, e le risorse di calcolo, ad esempio HDInsight, usati da Data Factory possono risiedere in aree diverse da quelle scelte dall'utente per 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";
Aggiungere il codice seguente al metodo
Main
per creare un'istanza della classeDataFactoryManagementClient
. Usare questo oggetto per creare una data factory, il servizio collegato, i set di dati e la pipeline. È possibile usare questo oggetto anche per monitorare i dettagli sull'esecuzione della pipeline.// 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 };
Creare una data factory
Aggiungere il codice seguente al metodo Main
per creare una data factory.
// 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);
}
Creare servizi collegati
In questa esercitazione verranno creati due servizi collegati, rispettivamente per l'origine e il sink.
Creare un servizio collegato Archiviazione di Azure
Aggiungere il codice seguente al metodo Main
per creare un servizio collegato di Archiviazione di Azure. Per informazioni sulle proprietà supportate e i dettagli, vedere Proprietà del servizio collegato BLOB di 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)
);
Creare un servizio collegato Database SQL di Azure
Aggiungere il codice seguente al metodo Main
per creare un servizio collegato Database SQL di Azure. Per informazioni sulle proprietà supportate e i dettagli, vedere Proprietà del servizio collegato Database SQL di Azure.
// 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)
);
Creare i set di dati
In questa sezione vengono creati due set di dati: uno per l'origine e l'altro per il sink.
Creare un set di dati per il BLOB di Azure di origine
Aggiungere il codice seguente al metodo Main
per creare un set di dati del BLOB di Azure. Per informazioni sulle proprietà supportate e i dettagli, vedere Proprietà del set di dati del BLOB di Azure.
Definire un set di dati che rappresenta i dati di origine nel BLOB di Azure. Questo set di dati del BLOB fa riferimento al servizio collegato Archiviazione di Azure creato nel passaggio precedente e descrive quanto segue:
- Posizione del BLOB da cui eseguire la copia:
FolderPath
eFileName
- Formato del BLOB che indica come analizzare il contenuto:
TextFormat
e relative impostazioni, ad esempio il delimitatore di colonna - Struttura dei dati, inclusi i nomi di colonna e i tipi di dati mappati in questo esempio alla tabella 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)
);
Creare un set di dati per il database SQL di Azure sink
Aggiungere il codice seguente al metodo Main
per creare un set di dati del database SQL di Azure. Per informazioni sulle proprietà supportate e i dettagli, vedere Proprietà del set di dati del database SQL di Azure.
Definire un set di dati che rappresenta i dati sink nel database SQL di Azure. Questo set di dati fa riferimento al servizio collegato Database SQL di Azure creato nel passaggio precedente e specifica anche la tabella SQL contenente i dati copiati.
// 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)
);
Creare una pipeline
Aggiungere il codice seguente al metodo Main
per creare una pipeline con un'attività di copia. In questa esercitazione la pipeline contiene solo un'attività, CopyActivity
, che usa il set di dati del BLOB come origine e il set di dati SQL come sink. Per informazioni sui dettagli dell'attività di copia, vedere Attività di copia in 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)
);
Creare un'esecuzione della pipeline
Aggiungere il codice seguente al metodo Main
per attivare un'esecuzione della pipeline.
// 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);
Monitorare un'esecuzione della pipeline
A questo punto, inserire il codice per controllare gli stati di esecuzione della pipeline e per ottenere i dettagli sull'esecuzione dell'attività di copia.
Aggiungere il codice seguente al metodo
Main
per controllare continuamente gli stati dell'esecuzione della pipeline fino al termine della copia dei dati.// 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; }
Aggiungere il codice seguente al metodo
Main
per recuperare i dettagli dell'esecuzione dell'attività di copia, ad esempio le dimensioni dei dati letti o scritti.// 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();
Eseguire il codice
Per compilare l'applicazione scegliere Compila>Compila soluzione. Avviare quindi l'applicazione e scegliere Debug>Avvia debug e verificare l'esecuzione della pipeline.
La console stampa lo stato di avanzamento della creazione di una data factory, del servizio collegato, dei set di dati, della pipeline e della relativa esecuzione. Controlla quindi lo stato di esecuzione della pipeline. Attendere fino a quando non vengono visualizzati i dettagli sull'esecuzione dell'attività di copia con le dimensioni dei dati letti/scritti. Usare quindi strumenti come SSMS (SQL Server Management Studio) o Visual Studio per connettersi al database SQL di Azure di destinazione e verificare se la tabella di destinazione specificata contiene i dati copiati.
Output di esempio
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...
Contenuto correlato
La pipeline in questo esempio copia i dati da una posizione a un'altra in un archivio BLOB di Azure. Contenuto del modulo:
- Creare una data factory.
- Creare servizi collegati Archiviazione di Azure e Database SQL di Azure.
- Creare i set di dati del BLOB di Azure e del database SQL di Azure.
- Creare una pipeline contenente un'attività di copia.
- Avviare un'esecuzione della pipeline.
- Monitorare le esecuzioni di pipeline e attività.
Passare all'esercitazione successiva per ottenere informazioni sulla copia di dati dall'ambiente locale al cloud: