Übertragen von Daten mit der Datenverschiebungsbibliothek
Die Azure Storage-Datenverschiebungsbibliothek ist eine plattformübergreifende Open-Source-Bibliothek, die für das Hochladen, Herunterladen und Kopieren von Blobs und Dateien mit hoher Leistung entwickelt wurde. Die Datenverschiebungsbibliothek stellt praktische Methoden bereit, die nicht in der Azure Storage-Clientbibliothek für .NET verfügbar sind. Diese Methoden ermöglichen Ihnen das Festlegen der Anzahl paralleler Vorgänge, das Nachverfolgen des Übertragungsfortschritts, das Fortsetzen einer abgebrochenen Übertragung und mehr.
Die Datenverschiebungsbibliothek ist nur für .NET verfügbar und unterstützt nur Azure Blob Storage und Azure Files. Sie sollten diese Einschränkungen und andere bekannte Probleme berücksichtigen, wenn Sie entscheiden, ob Sie die Datenverschiebungsbibliothek verwenden.
Wenn Sie Code aus der älteren Microsoft.Azure.Storage.DataMovement-Bibliothek (Version 2.X.X) zur aktuellen Azure.Storage.DataMovement-Bibliothek (Version 12.X.X) migrieren, lesen Sie das Migrationshandbuch.
API-Referenzdokumente | Quellcode | Paket (NuGet) | Beispiele: Blobs / Files.Shares
Voraussetzungen
- Azure-Abonnement – Erstellen eines kostenlosen Kontos
- Azure Storage-Konto – Erstellen eines Speicherkontos
- Neuestes .NET SDK für Ihr Betriebssystem. Laden Sie unbedingt das SDK und nicht die Runtime herunter.
Erstellen Ihrer Umgebung
Wenn Sie nicht über ein vorhandenes Projekt verfügen, wird in diesem Abschnitt gezeigt, wie Sie ein Projekt für die Arbeit mit der Azure Blob Storage-Clientbibliothek für .NET einrichten. Die Schritte umfassen die Paketinstallation, das Hinzufügen von using
-Anweisungen und das Erstellen eines autorisierten Clientobjekts.
Installieren von Paketen
Installieren Sie aus Ihrem Projektverzeichnis Pakete für die Azure Storage-Datenverschiebung-Clientbibliothek und die Azure Identity-Clientbibliothek mit dem Befehl dotnet add package
. Für kennwortlose Verbindungen mit Azure-Diensten wird das Azure.Identity-Paket benötigt.
dotnet add package Azure.Storage.DataMovement
dotnet add package Azure.Storage.DataMovement.Blobs
dotnet add package Azure.Identity
Um mit der Erweiterungsbibliothek für Azure Files arbeiten zu können, installieren Sie das Paket Azure.Storage.DataMovement.Files.Shares:
dotnet add package Azure.Storage.DataMovement.Files.Shares
Fügen Sie Anweisungen vom Typ using
hinzu.
Um die Codebeispiele in diesem Artikel auszuführen, fügen Sie die folgenden using
-Direktiven hinzu:
using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Storage.DataMovement;
using Azure.Storage.DataMovement.Blobs;
Wenn Sie die Erweiterungsbibliothek für Azure Files verwenden, fügen Sie die folgende using
-Direktive hinzu:
using Azure.Storage.DataMovement.Files.Shares;
Autorisierung
Der Autorisierungsmechanismus muss über die erforderlichen Berechtigungen zum Ausführen von Upload-, Download- und Kopiervorgängen verfügen. Für die Autorisierung mit Microsoft Entra ID (empfohlen) benötigen Sie mindestens die integrierte Azure RBAC-Rolle Mitwirkender an Storage-Blobdaten.
Informationen zur Datenverschiebungsbibliothek
Die Azure Storage-Datenverschiebungsbibliothek besteht aus einer gemeinsamen Clientbibliothek und Erweiterungsbibliotheken für Azure Blob Storage und Azure Files. Die allgemeine Bibliothek bietet die Kernfunktionen zum Übertragen von Daten, während die Erweiterungsbibliotheken Funktionen speziell für Blob Storage und Azure Files bereitstellen. Weitere Informationen finden Sie in den folgenden Ressourcen:
Erstellen eines TransferManager
-Objekts
TransferManager ist die Hauptklasse zum Starten und Steuern aller Arten von Übertragungen, einschließlich Upload, Download und Kopie. In diesem Abschnitt erfahren Sie, wie Sie ein TransferManager
-Objekt zum Arbeiten mit einem lokalen Dateisystem, Blob Storage oder Azure Files erstellen.
Hinweis
Eine bewährte Methode für die Azure SDK-Clientverwaltung besteht darin, einen Client als Singleton zu behandeln, was bedeutet, dass eine Klasse zu einem gegebenem Zeitpunkt jeweils nur ein Objekt aufweist. Es ist nicht erforderlich, mehr als eine Instanz eines Clients für einen bestimmten Satz von Konstruktorparametern oder Clientoptionen beizubehalten.
Der folgende Code zeigt, wie ein TransferManager
-Objekt erstellt wird.
TransferManager transferManager = new(new TransferManagerOptions());
Optional können Sie eine Instanz von TransferManagerOptions für den Konstruktor bereitstellen, die bestimmte Konfigurationsoptionen auf alle vom TransferManager
-Objekt gestarteten Übertragungen anwendet. Die folgenden Konfigurationsoptionen sind verfügbar:
- CheckpointStoreOptions: Optional. Definiert die Optionen zum Erstellen eines Prüfpunkts, der zum Speichern des Übertragungszustands verwendet wird, damit Übertragungen fortgesetzt werden können.
- Diagnose: Ruft die Diagnoseoptionen des Übertragungs-Managers ab.
-
ErrorHandling: Optional. Definiert, wie Fehler während einer Übertragung behandelt werden. Der Standardwert ist
StopOnAnyFailure
. - MaximumConcurrency: Die maximale Anzahl von Workern, die in einer parallelen Übertragung verwendet werden können.
- ProvidersForResuming: Ressourcenanbieter für den Übertragungs-Manager, der beim Fortsetzen einer Übertragung verwendet werden soll. Erwartet einen Anbieter für jeden verwendeten Speicheranbieter. Weitere Informationen finden Sie unter Fortsetzen einer vorhandenen Übertragung.
Erstellen eines StorageResource
-Objekts
StorageResource ist die Basisklasse für alle Speicherressourcen, einschließlich Blobs und Dateien. Verwenden Sie zum Erstellen eines StorageResource
-Objekts eine der folgenden Anbieterklassen:
-
BlobsStorageResourceProvider: Verwenden Sie diese Klasse, um
StorageResource
-Instanzen für einen Blobcontainer, Blockblobs, Anfügeblob oder Seitenblob zu erstellen. -
ShareFilesStorageResourceProvider: Verwenden Sie diese Klasse, um
StorageResource
-Instanzen für eine Datei oder ein Verzeichnis zu erstellen. -
LocalFilesStorageResourceProvider: Verwenden Sie diese Klasse, um
StorageResource
-Instanzen für ein lokales Dateisystem zu erstellen.
Erstellen eines StorageResource
-Objekts für Blob Storage
Der folgende Code zeigt, wie Sie mithilfe einer Uri
ein StorageResource
-Objekt für BLOB-Container und Blobs erstellen:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
BlobsStorageResourceProvider blobsProvider = new(tokenCredential);
// Get a container resource
StorageResource container = await blobsProvider.FromContainerAsync(
new Uri("http://<storage-account-name>.blob.core.windows.net/sample-container"));
// Get a block blob resource - default is block blob
StorageResource blockBlob = await blobsProvider.FromBlobAsync(
new Uri("http://<storage-account-name>.blob.core.windows.net/sample-container/sample-block-blob"),
new BlockBlobStorageResourceOptions());
// Use a similar approach to get a page blob or append blob resource
Sie können ein StorageResource
-Objekt auch mithilfe eines Clientobjekts aus Azure.Storage.Blobs erstellen.
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
BlobContainerClient blobContainerClient = new(
new Uri("https://<storage-account-name>.blob.core.windows.net/sample-container"),
tokenCredential);
StorageResource containerResource = BlobsStorageResourceProvider.FromClient(blobContainerClient);
BlockBlobClient blockBlobClient = blobContainerClient.GetBlockBlobClient("sample-block-blob");
StorageResource blockBlobResource = BlobsStorageResourceProvider.FromClient(blockBlobClient);
// Use a similar approach to get a page blob or append blob resource
Starten einer neuen Übertragung
Für alle Übertragungen müssen eine Quelle und ein Ziel angegeben werden. Sowohl die Quelle als auch das Ziel sind vom Typ StorageResource
und entweder StorageResourceContainer
oder StorageResourceItem
. Bei einer bestimmten Übertragung müssen Quelle und Ziel vom gleichen Typ sein. Wenn es sich bei der Quelle beispielsweise um einen BLOB-Container handelt, muss es sich auch beim Ziel um einen BLOB-Container handeln.
Sie können eine neue Übertragung starten, indem Sie die folgende Methode aufrufen:
Diese Methode gibt ein TransferOperation-Objekt zurück, das die Übertragung darstellt. Sie können das TransferOperation
-Objekt verwenden, um den Übertragungsfortschritt zu überwachen oder die Übertragungs-ID abzurufen. Die Übertragungs-ID ist ein eindeutiger Bezeichner für die Übertragung, die zum Fortsetzen der Übertragung oder zum Anhalten der Übertragung erforderlich ist.
Optional können Sie eine Instanz von TransferOptions für StartTransferAsync
oder ResumeTransferAsync
bereitstellen, um bestimmte Konfigurationsoptionen auf eine bestimmte Übertragung anzuwenden. Die folgenden Konfigurationsoptionen sind verfügbar:
-
CreationMode: Konfiguriert das Verhalten, wenn eine Übertragung auf eine bereits vorhandene Ressource trifft. Standardmäßig wird
FailIfExists
beim Starten einer neuen Übertragung verwendet. Wenn Sie eine Übertragung fortsetzen, können die Standardwerte variieren. Für alle Ressourcen, die beim Start der Übertragung erfolgreich aufgezählt wurden, wird fürCreationMode
standardmäßig der verwendete Anfangswert eingesetzt. Für alle verbleibenden Ressourcen gilt der reguläre Standardwert. - InitialTransferSize: Die Größe der ersten Bereichsanforderung in Bytes. Einzelne Übertragungen mit einer Größe, die kleiner als dieser Grenzwert sind, werden in einer einzigen Anforderung hochgeladen oder heruntergeladen. Übertragungen, die größer als dieser Grenzwert sind, werden weiterhin heruntergeladen oder in Blöcken der Größe MaximumTransferChunkSizehochgeladen. Der Standardwert ist 32 MiB. Wenn Sie eine Übertragung fortsetzen, ist der Standardwert der Wert, der beim ersten Start der Übertragung angegeben wird.
- MaximumTransferChunkSize: Die maximale Größe, die beim Übertragen von Daten in Datenblöcken für jeden Block verwendet werden soll. Der Standardwert ist 4 MiB. Wenn Sie eine Übertragung fortsetzen, ist der Standardwert der Wert, der beim ersten Start der Übertragung angegeben wird.
- ProgressHandlerOptions: Optional. Optionen zum Ändern des Verhaltens des ProgressHandler-Objekts.
Beispiel: Hochladen eines lokalen Verzeichnisses in einen BLOB-Container
Das folgende Codebeispiel zeigt, wie sie eine neue Übertragung starten, um ein lokales Verzeichnis in einen BLOB-Container hochzuladen:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
TransferManager transferManager = new(new TransferManagerOptions());
BlobsStorageResourceProvider blobsProvider = new(tokenCredential);
string localDirectoryPath = "C:/path/to/directory";
Uri blobContainerUri = new Uri("https://<storage-account-name>.blob.core.windows.net/sample-container");
TransferOperation transferOperation = await transferManager.StartTransferAsync(
sourceResource: LocalFilesStorageResourceProvider.FromDirectory(localDirectoryPath),
destinationResource: await blobsProvider.FromContainerAsync(blobContainerUri));
await transferOperation.WaitForCompletionAsync();
Beispiel: Kopieren eines Containers oder Blobs
Sie können die Datenverschiebungsbibliothek verwenden, um Daten zwischen zwei StorageResource
-Instanzen zu kopieren. Für Blob-Ressourcen wird zur Übertragung der Vorgang Put Blob From URL verwendet, der eine Server-zu-Server-Kopie ausführt.
Das folgende Codebeispiel zeigt, wie Sie eine neue Übertragung starten, um alle in einem Quell-BLOB-Container enthaltenen Blobs in einen Ziel-Blob-Container zu kopieren. Der Zielcontainer muss bereits vorhanden sein. In diesem Beispiel legen wir CreationMode auf OverwriteIfExists
fest, so dass alle bereits vorhandenen Zielblobs überschrieben werden. Sie können die Eigenschaft CreationMode
basierend auf den Anforderungen Ihrer App anpassen.
Uri sourceContainerUri = new Uri("https://<storage-account-name>.blob.core.windows.net/source-container");
Uri destinationContainerUri = new Uri("https://<storage-account-name>.blob.core.windows.net/dest-container");
TransferOperation transferOperation = await transferManager.StartTransferAsync(
sourceResource: await blobsProvider.FromContainerAsync(
sourceContainerUri,
new BlobStorageResourceContainerOptions()
{
BlobPrefix = "source/directory/prefix"
}),
destinationResource: await blobsProvider.FromContainerAsync(
destinationContainerUri,
new BlobStorageResourceContainerOptions()
{
// All source blobs are copied as a single type of destination blob
// Defaults to block blob, if not specified
BlobType = BlobType.Block,
BlobPrefix = "destination/directory/prefix"
}),
transferOptions: new TransferOptions()
{
CreationMode = StorageResourceCreationMode.OverwriteIfExists,
}
);
await transferOperation.WaitForCompletionAsync();
Das folgende Codebeispiel zeigt, wie eine neue Übertragung gestartet wird, um ein Quell-Blob in ein Ziel-Blob zu kopieren. In diesem Beispiel legen wir CreationMode auf OverwriteIfExists
fest, so dass das Ziel-Blob überschrieben wird, wenn es bereits vorhanden ist. Sie können die Eigenschaft CreationMode
basierend auf den Anforderungen Ihrer App anpassen.
Uri sourceBlobUri = new Uri(
"https://<storage-account-name>.blob.core.windows.net/source-container/source-blob");
Uri destinationBlobUri = new Uri(
"https://<storage-account-name>.blob.core.windows.net/dest-container/dest-blob");
TransferOperation transferOperation = await transferManager.StartTransferAsync(
sourceResource: await blobsProvider.FromBlobAsync(sourceBlobUri),
destinationResource: await blobsProvider.FromBlobAsync(destinationBlobUri, new BlockBlobStorageResourceOptions()),
transferOptions: new TransferOptions()
{
CreationMode = StorageResourceCreationMode.OverwriteIfExists,
}
);
await transferOperation.WaitForCompletionAsync();
Fortsetzen einer vorhandenen Übertragung
Durch das Speichern des Übertragungsfortschritts auf den Datenträger können Sie mit der Datenverschiebungsbibliothek eine Übertragung fortsetzen, die vor dem Abschluss fehlgeschlagen ist oder aus anderen Gründen abgebrochen oder angehalten wurde. Um eine Übertragung fortzusetzen, muss das TransferManager
-Objekt mit StorageResourceProvider
-Instanzen, die die Übertragung aus den gespeicherten Daten erneut zusammenführen können, konfiguriert werden. Sie können die Eigenschaft ProvidersForResuming
der TransferManagerOptions-Klasse verwenden, um die Anbieter anzugeben.
Das folgende Codebeispiel zeigt, wie Sie ein TransferManager
-Objekt initialisieren, das eine Übertragung zwischen dem lokalen Dateisystem und Blob Storage fortsetzen kann:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
TransferManager transferManager = new(new TransferManagerOptions()
{
ProvidersForResuming = new List<StorageResourceProvider>()
{
new BlobsStorageResourceProvider(tokenCredential)
}
});
Um eine Übertragung fortzusetzen, rufen Sie die folgende Methode auf:
Geben Sie die Übertragungs-ID der Übertragung an, die Sie fortsetzen möchten. Die Übertragungs-ID ist ein eindeutiger Bezeichner für die Übertragung, die beim Start der Übertragung als Teil des TransferOperation
-Objekts zurückgegeben wird. Wenn Sie den Wert der Übertragungs-ID nicht kennen, können Sie TransferManager.GetTransfersAsync aufrufen, um die Übertragung und die entsprechende ID zu finden.
Das folgende Codebeispiel zeigt, wie eine Übertragung fortgesetzt wird:
TransferOperation resumedTransfer = await transferManager.ResumeTransferAsync(transferId: ID);
Hinweis
Der Speicherort der gespeicherten Übertragungsdaten unterscheidet sich vom Standardspeicherort, wenn TransferCheckpointStoreOptions als Teil von TransferManagerOptions
festgelegt wird. Um Übertragungen fortzusetzen, die mit einem benutzerdefinierten Prüfpunktspeicher aufgezeichnet wurden, müssen Sie die gleichen Prüfpunktspeicheroptionen für das TransferManager
-Objekt, das die Übertragung fortsetzt, bereitstellen.
Überwachen des Übertragungsfortschritts
Übertragungen können abhängig von den Anforderungen Ihrer App über mehrere Mechanismen überwacht und beobachtet werden. In diesem Abschnitt erfahren Sie, wie Sie den Übertragungsfortschritt mithilfe des TransferOperation
-Objekts überwachen und wie Sie eine Übertragung mithilfe von TransferOptions
-Ereignissen überwachen.
Beispiel: Überwachen des Übertragungsfortschritts mithilfe des TransferOperation
-Objekts
Sie können den Übertragungsfortschritt mithilfe des TransferOperation
-Objekts überwachen, das von der StartTransferAsync
-Methode zurückgegeben wird. Sie können auch TransferManager.GetTransfersAsync aufrufen, um alle Übertragungen für ein TransferManager
-Objekt aufzuzählen.
Das folgende Codebeispiel zeigt, wie Sie alle Übertragungen durchlaufen und den Status jeder Übertragung in eine Protokolldatei schreiben:
async Task CheckTransfersAsync(TransferManager transferManager)
{
await foreach (TransferOperation transfer in transferManager.GetTransfersAsync())
{
using StreamWriter logStream = File.AppendText("path/to/log/file");
logStream.WriteLine(Enum.GetName(typeof(TransferState), transfer.Status.State));
}
}
TransferStatus definiert den Status des Übertragungsauftrags.
TransferStatus
beinhaltet die folgenden Eigenschaften:
Eigenschaft | Typ | Beschreibung |
---|---|---|
HasCompletedSuccessfully |
Boolean | Gibt an, ob die Übertragung ohne Fehler oder übersprungene Elemente erfolgreich abgeschlossen wird. |
HasFailedItems |
Boolean | Gibt an, ob bei der Übertragung Fehlerelemente vorhanden sind. Wenn diese Option auf true festgelegt ist, weist die Übertragung mindestens ein Fehlerelement auf. Bei Festlegung auf false enthält die Übertragung derzeit keine Fehler. |
HasSkippedItems |
Boolean | Gibt an, ob die Übertragung über übersprungene Elemente verfügt. Bei Festlegung auf true enthält die Übertragung mindestens ein übersprungenes Element. Wenn diese Option auf false festgelegt ist, weist die Übertragung derzeit keine übersprungenen Elemente auf. Es ist möglich, nie übersprungene Elemente zu enthalten, wenn SkipIfExists in TransferOptions.CreationMode nicht aktiviert ist. |
State |
TransferState | Definiert die Typen des Zustands, den eine Übertragung annehmen kann. Details finden Sie unter TransferState. |
Beispiel: Überwachen des Übertragungsfortschritts mithilfe von TransferOptions
-Ereignissen
Sie können den Übertragungsfortschritt überwachen, indem Sie Ereignisse überwachen, die von der TransferOptions-Klasse bereitgestellt werden. Die TransferOptions
-Instanz wird an die StartTransferAsync
-Methode übergeben und stellt Ereignisse bereit, die ausgelöst werden, wenn eine Übertragung abgeschlossen wird, fehlschlägt, übersprungen wird oder wenn ihr Status geändert wird.
Das folgende Codebeispiel zeigt, wie Sie mit TransferOptions
auf ein Übertragungsabschlussereignis lauschen:
async Task<TransferOperation> ListenToTransfersAsync(
TransferManager transferManager,
StorageResource source,
StorageResource destination)
{
TransferOptions transferOptions = new();
transferOptions.ItemTransferCompleted += (TransferItemCompletedEventArgs args) =>
{
using (StreamWriter logStream = File.AppendText("path/to/log/file"))
{
logStream.WriteLine($"File Completed Transfer: {args.Source.Uri.AbsoluteUri}");
}
return Task.CompletedTask;
};
return await transferManager.StartTransferAsync(
source,
destination,
transferOptions);
}
Verwenden von Erweiterungsmethoden für BlobContainerClient
Für Anwendungen mit vorhandenem Code, die die BlobContainerClient
-Klasse aus Azure.Storage.Blobs verwenden, können Sie Erweiterungsmethoden verwenden, um Übertragungen direkt von einem BlobContainerClient
-Objekt aus zu starten. Die Erweiterungsmethoden werden in der BlobContainerClientExtensions-Klasse (oder ShareDirectoryClientExtensions für Azure Files) bereitgestellt und bieten einige Vorteile der Verwendung von TransferManager
mit minimalen Codeänderungen. In diesem Abschnitt erfahren Sie, wie Sie die Erweiterungsmethoden verwenden, um Übertragungen von einem BlobContainerClient
-Objekt auszuführen.
Installieren Sie das Azure.Storage.Blobs-Paket, sofern noch nicht geschehen:
dotnet add package Azure.Storage.Blobs
Fügen Sie am Anfang Ihres Codes die folgenden using
-Anweisungen hinzu:
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
Das folgende Codebeispiel zeigt, wie Sie ein BlobContainerClient
für einen Blobcontainer namens sample-container
instanziieren:
// Create a token credential
TokenCredential tokenCredential = new DefaultAzureCredential();
BlobServiceClient client = new BlobServiceClient(
new Uri("https://<storage-account-name>.blob.core.windows.net"),
tokenCredential);
BlobContainerClient containerClient = client.GetBlobContainerClient("sample-container");
Das folgende Codebeispiel zeigt, wie sie lokale Verzeichnisinhalte unter Verwendung von UploadDirectoryAsync
in sample-container
hochladen:
TransferOperation transfer = await containerClient
.UploadDirectoryAsync(WaitUntil.Started, "local/directory/path");
await transfer.WaitForCompletionAsync();
Das folgende Codebeispiel zeigt, wie Sie den Inhalt von sample-container
mithilfe von DownloadToDirectoryAsync
in ein lokales Verzeichnis herunterladen:
TransferOperation transfer = await containerClient
.DownloadToDirectoryAsync(WaitUntil.Started, "local/directory/path");
await transfer.WaitForCompletionAsync();
Weitere Informationen zu den Erweiterungsmethoden für BlobContainerClient
finden Sie unter Erweiterungen für BlobContainerClient.
Nächster Schritt
- Codebeispiele für DataMovement.Blobs und DataMovement.Files.Shares sind im Azure SDK für .NET GitHub-Repository verfügbar.