Přenos dat s využitím knihovny pro přesun dat
Poznámka:
Tento článek obsahuje pokyny pro práci s verzí 2.0.XX knihovny pro přesun dat ve službě Azure Storage. Verze 2.0.XX je aktuálně v režimu údržby a knihovna přijímá pouze opravy integrity dat a problémů se zabezpečením. Nebudou přidány žádné nové funkce ani funkce a knihovna nebude podporovat nové verze služby úložiště.
Beta verze moderní knihovny pro přesun dat jsou v současné době ve vývoji. Další informace najdete v tématu Běžná klientská knihovna pro přesun dat služby Azure Storage pro .NET na GitHubu.
Knihovna pro přesun dat ve službě Azure Storage je multiplatformní opensourcová knihovna, která je navržená pro vysoce výkonné nahrávání, stahování a kopírování objektů blob a souborů. Knihovna pro přesun dat poskytuje vhodné metody, které nejsou dostupné v klientské knihovně Azure Storage pro .NET. Tyto metody umožňují nastavit počet paralelních operací, sledovat průběh přenosu, snadno obnovit zrušený přenos a mnoho dalšího.
Tato knihovna také používá .NET Core, což znamená, že ji můžete použít při vytváření aplikací .NET pro Windows, Linux a macOS. Další informace o .NET Core najdete v dokumentaci k .NET Core. Tato knihovna také funguje pro tradiční aplikace .NET Framework pro Windows.
Tento dokument ukazuje, jak vytvořit konzolovou aplikaci .NET Core, která běží ve Windows, Linuxu a macOS a provádí následující scénáře:
- Nahrajte soubory a adresáře do služby Blob Storage.
- Definujte počet paralelních operací při přenosu dat.
- Sledování průběhu přenosu dat
- Obnovení zrušeného přenosu dat
- Zkopírujte soubor z adresy URL do služby Blob Storage.
- Kopírování ze služby Blob Storage do služby Blob Storage
Požadavky
Nastavení
- Navštivte průvodce instalací .NET Core a nainstalujte sadu .NET Core SDK. Při výběru prostředí zvolte možnost příkazového řádku.
- Z příkazového řádku vytvořte adresář pro váš projekt. Přejděte do tohoto adresáře a zadáním příkazu
dotnet new console -o <sample-project-name>
vytvořte projekt konzoly jazyka C#. - Otevřete tento adresář v editoru Visual Studio Code. Tento krok můžete rychle provést přes příkazový řádek zadáním
code .
do Windows. - Nainstalujte rozšíření C# z Webu Visual Studio Code Marketplace. Restartujte Visual Studio Code.
- V tomto okamžiku by se měly zobrazit dvě výzvy. Jedním z nich je přidání požadovaných prostředků pro sestavení a ladění. Vyberte ano. Další výzvou je obnovení nevyřešených závislostí. Vyberte obnovit.
.vscode
Upravtelaunch.json
ho tak, aby jako konzolu používal externí terminál. Toto nastavení by mělo číst jako"console": "externalTerminal"
- Visual Studio Code umožňuje ladit aplikace .NET Core. Spusťte
F5
aplikaci a ověřte, že vaše nastavení funguje. V konzole by se měla zobrazit zpráva "Hello World!".
Přidání knihovny pro přesun dat do projektu
- Do části
<project-name>.csproj
souboru přidejte nejnovější verzi knihovnydependencies
pro přesun dat. V době psaní by tato verze byla"Microsoft.Azure.Storage.DataMovement": "0.6.2"
- Měla by se zobrazit výzva k obnovení projektu. Vyberte tlačítko Obnovit. Projekt můžete obnovit také z příkazového řádku zadáním příkazu
dotnet restore
do kořenového adresáře projektu.
Upravit <project-name>.csproj
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Storage.DataMovement" Version="0.6.2" />
</ItemGroup>
</Project>
Nastavení aplikační architektury
První věc, kterou uděláme, je nastavení architektury kódu pro naši aplikaci. Tento kód nás vyzve k zadání názvu účtu úložiště a klíče účtu a použije tyto přihlašovací údaje k vytvoření objektu CloudStorageAccount
. Tento objekt se používá k interakci s účtem úložiště ve všech scénářích přenosu. Kód nás také vyzve k výběru typu operace přenosu, který chceme provést.
Upravit Program.cs
:
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using Microsoft.Azure.Storage.DataMovement;
namespace DMLibSample
{
public class Program
{
public static void Main()
{
Console.WriteLine("Enter Storage account name:");
string accountName = Console.ReadLine();
Console.WriteLine("\nEnter Storage account key:");
string accountKey = Console.ReadLine();
string storageConnectionString = "DefaultEndpointsProtocol=https;AccountName=" + accountName + ";AccountKey=" + accountKey;
CloudStorageAccount account = CloudStorageAccount.Parse(storageConnectionString);
ExecuteChoice(account);
}
public static void ExecuteChoice(CloudStorageAccount account)
{
Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
int choice = int.Parse(Console.ReadLine());
if(choice == 1)
{
TransferLocalFileToAzureBlob(account).Wait();
}
else if(choice == 2)
{
TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
}
else if(choice == 3)
{
TransferUrlToAzureBlob(account).Wait();
}
else if(choice == 4)
{
TransferAzureBlobToAzureBlob(account).Wait();
}
}
public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
}
public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
{
}
public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
{
}
public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
{
}
}
}
Důležité
Tento příklad kódu používá připojovací řetězec k autorizaci přístupu k vašemu účtu úložiště. Tato konfigurace je určená například pro účely. Připojovací řetězce a přístupové klíče účtu by se měly používat s opatrností v kódu aplikace. Pokud dojde ke ztrátě nebo náhodnému umístění přístupového klíče k účtu do nezabezpečeného umístění, může být vaše služba zranitelná. Každý, kdo má přístupový klíč, může autorizovat požadavky na účet úložiště a efektivně má přístup ke všem datům.
Nahrání místního souboru do objektu blob
Přidejte metody GetSourcePath
a GetBlob
do Program.cs
:
public static string GetSourcePath()
{
Console.WriteLine("\nProvide path for source:");
string sourcePath = Console.ReadLine();
return sourcePath;
}
public static CloudBlockBlob GetBlob(CloudStorageAccount account)
{
CloudBlobClient blobClient = account.CreateCloudBlobClient();
Console.WriteLine("\nProvide name of Blob container:");
string containerName = Console.ReadLine();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
container.CreateIfNotExistsAsync().Wait();
Console.WriteLine("\nProvide name of new Blob:");
string blobName = Console.ReadLine();
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
return blob;
}
Upravte metodu TransferLocalFileToAzureBlob
:
public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
string localFilePath = GetSourcePath();
CloudBlockBlob blob = GetBlob(account);
Console.WriteLine("\nTransfer started...");
await TransferManager.UploadAsync(localFilePath, blob);
Console.WriteLine("\nTransfer operation complete.");
ExecuteChoice(account);
}
Tento kód nás vyzve k zadání cesty k místnímu souboru, názvu nového nebo existujícího kontejneru a názvu nového objektu blob. Metoda TransferManager.UploadAsync
provádí nahrávání pomocí těchto informací.
Stiskněte klávesu a F5
spusťte aplikaci. Nahrání můžete ověřit zobrazením účtu úložiště pomocí Průzkumník služby Microsoft Azure Storage.
Nastavení počtu paralelních operací
Knihovna pro přesun dat nabízí možnost nastavit počet paralelních operací pro zvýšení propustnosti přenosu dat. Ve výchozím nastavení nastaví knihovna pro přesun dat počet paralelních operací na 8 × počet jader na vašem počítači.
Mějte na paměti, že mnoho paralelních operací v prostředí s nízkou šířkou pásma může zahltit síťové připojení a ve skutečnosti zabránit úplnému dokončení operací. S tímto nastavením byste měli experimentovat, abyste zjistili, co nejlépe funguje na základě dostupné šířky pásma sítě.
V tomto příkladu přidáme kód, který nám umožní nastavit počet paralelních operací. Přidáme také kód, který bude trvat, než se přenos dokončí.
Přidejte metodu SetNumberOfParallelOperations
do Program.cs
:
public static void SetNumberOfParallelOperations()
{
Console.WriteLine("\nHow many parallel operations would you like to use?");
string parallelOperations = Console.ReadLine();
TransferManager.Configurations.ParallelOperations = int.Parse(parallelOperations);
}
Upravte metodu ExecuteChoice
tak, aby používala SetNumberOfParallelOperations
:
public static void ExecuteChoice(CloudStorageAccount account)
{
Console.WriteLine("\nWhat type of transfer would you like to execute?\n1. Local file --> Azure Blob\n2. Local directory --> Azure Blob directory\n3. URL (e.g. Amazon S3 file) --> Azure Blob\n4. Azure Blob --> Azure Blob");
int choice = int.Parse(Console.ReadLine());
SetNumberOfParallelOperations();
if(choice == 1)
{
TransferLocalFileToAzureBlob(account).Wait();
}
else if(choice == 2)
{
TransferLocalDirectoryToAzureBlobDirectory(account).Wait();
}
else if(choice == 3)
{
TransferUrlToAzureBlob(account).Wait();
}
else if(choice == 4)
{
TransferAzureBlobToAzureBlob(account).Wait();
}
}
Upravte metodu TransferLocalFileToAzureBlob
tak, aby používala časovač:
public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
string localFilePath = GetSourcePath();
CloudBlockBlob blob = GetBlob(account);
Console.WriteLine("\nTransfer started...");
Stopwatch stopWatch = Stopwatch.StartNew();
await TransferManager.UploadAsync(localFilePath, blob);
stopWatch.Stop();
Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
ExecuteChoice(account);
}
Sledování průběhu přenosu
Průběh přenosu můžete sledovat během operace přenosu vytvořením objektu TransferContext
. Objekt TransferContext
má dvě formy: SingleTransferContext
pro přenosy s jedním souborem a DirectoryTransferContext
pro přenosy adresářů.
Přidejte metody GetSingleTransferContext
a GetDirectoryTransferContext
do Program.cs
:
public static SingleTransferContext GetSingleTransferContext(TransferCheckpoint checkpoint)
{
SingleTransferContext context = new SingleTransferContext(checkpoint);
context.ProgressHandler = new Progress<TransferStatus>((progress) =>
{
Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
});
return context;
}
public static DirectoryTransferContext GetDirectoryTransferContext(TransferCheckpoint checkpoint)
{
DirectoryTransferContext context = new DirectoryTransferContext(checkpoint);
context.ProgressHandler = new Progress<TransferStatus>((progress) =>
{
Console.Write("\rBytes transferred: {0}", progress.BytesTransferred );
});
return context;
}
Upravte metodu TransferLocalFileToAzureBlob
tak, aby používala GetSingleTransferContext
:
public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
string localFilePath = GetSourcePath();
CloudBlockBlob blob = GetBlob(account);
TransferCheckpoint checkpoint = null;
SingleTransferContext context = GetSingleTransferContext(checkpoint);
Console.WriteLine("\nTransfer started...\n");
Stopwatch stopWatch = Stopwatch.StartNew();
await TransferManager.UploadAsync(localFilePath, blob, null, context);
stopWatch.Stop();
Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
ExecuteChoice(account);
}
Obnovení zrušeného převodu
Další funkcí, kterou nabízí knihovna přesunu dat, je možnost obnovení zrušeného přenosu. Dále přidáme kód, který nám umožní dočasně zrušit přenos zadáním c
a potom pokračovat v přenosu 3 sekundy později.
Upravte metodu TransferLocalFileToAzureBlob
:
public static async Task TransferLocalFileToAzureBlob(CloudStorageAccount account)
{
string localFilePath = GetSourcePath();
CloudBlockBlob blob = GetBlob(account);
TransferCheckpoint checkpoint = null;
SingleTransferContext context = GetSingleTransferContext(checkpoint);
CancellationTokenSource cancellationSource = new CancellationTokenSource();
Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");
Stopwatch stopWatch = Stopwatch.StartNew();
Task task;
ConsoleKeyInfo keyinfo;
try
{
task = TransferManager.UploadAsync(localFilePath, blob, null, context, cancellationSource.Token);
while(!task.IsCompleted)
{
if(Console.KeyAvailable)
{
keyinfo = Console.ReadKey(true);
if(keyinfo.Key == ConsoleKey.C)
{
cancellationSource.Cancel();
}
}
}
await task;
}
catch(Exception e)
{
Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
}
if(cancellationSource.IsCancellationRequested)
{
Console.WriteLine("\nTransfer will resume in 3 seconds...");
Thread.Sleep(3000);
checkpoint = context.LastCheckpoint;
context = GetSingleTransferContext(checkpoint);
Console.WriteLine("\nResuming transfer...\n");
await TransferManager.UploadAsync(localFilePath, blob, null, context);
}
stopWatch.Stop();
Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
ExecuteChoice(account);
}
Až doteď byla naše checkpoint
hodnota nastavena na null
. Když teď přenos zrušíme, načteme poslední kontrolní bod přenosu a pak použijeme tento nový kontrolní bod v kontextu přenosu.
Přenos místního adresáře do úložiště objektů blob
Knihovna přesunu dat umožňuje přenášet adresář souborů a všechny jeho podadresáře, jak je znázorněno v následujícím příkladu.
Nejprve přidejte metodu GetBlobDirectory
do Program.cs
:
public static CloudBlobDirectory GetBlobDirectory(CloudStorageAccount account)
{
CloudBlobClient blobClient = account.CreateCloudBlobClient();
Console.WriteLine("\nProvide name of Blob container. This can be a new or existing Blob container:");
string containerName = Console.ReadLine();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
container.CreateIfNotExistsAsync().Wait();
CloudBlobDirectory blobDirectory = container.GetDirectoryReference("");
return blobDirectory;
}
Pak upravte TransferLocalDirectoryToAzureBlobDirectory
:
public static async Task TransferLocalDirectoryToAzureBlobDirectory(CloudStorageAccount account)
{
string localDirectoryPath = GetSourcePath();
CloudBlobDirectory blobDirectory = GetBlobDirectory(account);
TransferCheckpoint checkpoint = null;
DirectoryTransferContext context = GetDirectoryTransferContext(checkpoint);
CancellationTokenSource cancellationSource = new CancellationTokenSource();
Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");
Stopwatch stopWatch = Stopwatch.StartNew();
Task task;
ConsoleKeyInfo keyinfo;
UploadDirectoryOptions options = new UploadDirectoryOptions()
{
Recursive = true
};
try
{
task = TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context, cancellationSource.Token);
while(!task.IsCompleted)
{
if(Console.KeyAvailable)
{
keyinfo = Console.ReadKey(true);
if(keyinfo.Key == ConsoleKey.C)
{
cancellationSource.Cancel();
}
}
}
await task;
}
catch(Exception e)
{
Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
}
if(cancellationSource.IsCancellationRequested)
{
Console.WriteLine("\nTransfer will resume in 3 seconds...");
Thread.Sleep(3000);
checkpoint = context.LastCheckpoint;
context = GetDirectoryTransferContext(checkpoint);
Console.WriteLine("\nResuming transfer...\n");
await TransferManager.UploadDirectoryAsync(localDirectoryPath, blobDirectory, options, context);
}
stopWatch.Stop();
Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
ExecuteChoice(account);
}
Mezi touto metodou a metodou pro nahrání jednoho souboru existuje několik rozdílů. Teď používáme TransferManager.UploadDirectoryAsync
a metodu getDirectoryTransferContext
, kterou jsme vytvořili dříve. Kromě toho teď poskytujeme options
hodnotu pro naši operaci nahrávání, což nám umožňuje indikovat, že chceme do nahrávání zahrnout podadresáře.
Kopírování souboru z adresy URL do objektu blob
Teď přidáme kód, který nám umožní zkopírovat soubor z adresy URL do objektu blob Azure.
Upravit TransferUrlToAzureBlob
:
public static async Task TransferUrlToAzureBlob(CloudStorageAccount account)
{
Uri uri = new Uri(GetSourcePath());
CloudBlockBlob blob = GetBlob(account);
TransferCheckpoint checkpoint = null;
SingleTransferContext context = GetSingleTransferContext(checkpoint);
CancellationTokenSource cancellationSource = new CancellationTokenSource();
Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");
Stopwatch stopWatch = Stopwatch.StartNew();
Task task;
ConsoleKeyInfo keyinfo;
try
{
task = TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
while(!task.IsCompleted)
{
if(Console.KeyAvailable)
{
keyinfo = Console.ReadKey(true);
if(keyinfo.Key == ConsoleKey.C)
{
cancellationSource.Cancel();
}
}
}
await task;
}
catch(Exception e)
{
Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
}
if(cancellationSource.IsCancellationRequested)
{
Console.WriteLine("\nTransfer will resume in 3 seconds...");
Thread.Sleep(3000);
checkpoint = context.LastCheckpoint;
context = GetSingleTransferContext(checkpoint);
Console.WriteLine("\nResuming transfer...\n");
await TransferManager.CopyAsync(uri, blob, CopyMethod.ServiceSideAsyncCopy, null, context, cancellationSource.Token);
}
stopWatch.Stop();
Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
ExecuteChoice(account);
}
Jedním z důležitých případů použití této funkce je, když potřebujete přesunout data z jiné cloudové služby do Azure. Pokud máte adresu URL, která poskytuje přístup k prostředku, můžete tento prostředek snadno přesunout do objektů blob Azure pomocí TransferManager.CopyAsync
této metody. Tato metoda také zavádí parametr CopyMethod . Následující tabulka uvádí dostupné možnosti pro tento parametr:
Název členu | Hodnota | Popis |
---|---|---|
SyncCopy | 0 | Stáhněte data ze zdroje do paměti a nahrajte data z paměti do cíle. Aktuálně je k dispozici pouze pro kopírování z jednoho prostředku Azure Storage do jiného. |
ServiceSideAsyncCopy | 0 | Odeslání žádosti o spuštění kopírování do Azure Storage, aby to umožnilo kopírování; monitoruje průběh operace kopírování, dokud se kopie nedokončila. |
ServiceSideSyncCopy | 2 | Obsah každého bloku zkopírujte pomocí adresy URL Put Block From, Append Block From URL nebo Put Page From URL. |
Kopírování objektu blob
Další funkcí, kterou poskytuje knihovna pro přesun dat, je možnost kopírovat z jednoho prostředku Azure Storage do jiného.
Upravte metodu TransferAzureBlobToAzureBlob
:
public static async Task TransferAzureBlobToAzureBlob(CloudStorageAccount account)
{
CloudBlockBlob sourceBlob = GetBlob(account);
CloudBlockBlob destinationBlob = GetBlob(account);
TransferCheckpoint checkpoint = null;
SingleTransferContext context = GetSingleTransferContext(checkpoint);
CancellationTokenSource cancellationSource = new CancellationTokenSource();
Console.WriteLine("\nTransfer started...\nPress 'c' to temporarily cancel your transfer...\n");
Stopwatch stopWatch = Stopwatch.StartNew();
Task task;
ConsoleKeyInfo keyinfo;
try
{
task = TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
while(!task.IsCompleted)
{
if(Console.KeyAvailable)
{
keyinfo = Console.ReadKey(true);
if(keyinfo.Key == ConsoleKey.C)
{
cancellationSource.Cancel();
}
}
}
await task;
}
catch(Exception e)
{
Console.WriteLine("\nThe transfer is canceled: {0}", e.Message);
}
if(cancellationSource.IsCancellationRequested)
{
Console.WriteLine("\nTransfer will resume in 3 seconds...");
Thread.Sleep(3000);
checkpoint = context.LastCheckpoint;
context = GetSingleTransferContext(checkpoint);
Console.WriteLine("\nResuming transfer...\n");
await TransferManager.CopyAsync(sourceBlob, destinationBlob, CopyMethod.SyncCopy, null, context, cancellationSource.Token);
}
stopWatch.Stop();
Console.WriteLine("\nTransfer operation completed in " + stopWatch.Elapsed.TotalSeconds + " seconds.");
ExecuteChoice(account);
}
V tomto příkladu nastavíme logický parametr TransferManager.CopyAsync
tak, aby CopyMethod.SyncCopy
značil, že chceme provést synchronní kopii. Tato konfigurace znamená, že se prostředek nejprve stáhne do místního počítače a pak se nahraje do objektu blob Azure. Možnost synchronního kopírování je skvělý způsob, jak zajistit, aby operace kopírování byla konzistentní. Naproti tomu rychlost asynchronní kopie na straně serveru závisí na dostupné šířce pásma sítě na serveru, která může kolísat. Synchronní kopie ale může generovat další náklady na výchozí přenos dat ve srovnání s asynchronní kopií. Doporučeným přístupem je použití synchronní kopie na virtuálním počítači Azure, který je ve stejné oblasti jako zdrojový účet úložiště, abyste se vyhnuli nákladům na výchozí přenos dat.
Aplikace pro přesun dat je teď dokončená. Kompletní ukázka kódu je k dispozici na GitHubu.
Další kroky
Referenční dokumentace ke knihovně pro přesun dat ve službě Azure Storage
Tip
Správa prostředků azure Blob Storage pomocí Průzkumník služby Azure Storage Průzkumník služby Azure Storage je bezplatná samostatná aplikace od Microsoftu, která umožňuje spravovat prostředky azure Blob Storage. Pomocí Průzkumník služby Azure Storage můžete vizuálně vytvářet, číst, aktualizovat a odstraňovat kontejnery objektů blob a objekty blob a také spravovat přístup k kontejnerům objektů blob a objektům blob.