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 poskytují možnost 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

Předpoklady

Nastavení

  1. 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.
  2. 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#.
  3. 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.
  4. Nainstalujte rozšíření C# z Webu Visual Studio Code Marketplace. Restartujte Visual Studio Code.
  5. 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í. Klikněte na Ano. Další výzvou je obnovení nevyřešených závislostí. Klikněte na obnovit.
  6. .vscode Upravte launch.json ho tak, aby jako konzolu používal externí terminál. Toto nastavení by mělo číst jako "console": "externalTerminal"
  7. 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

  1. Do části <project-name>.csproj souboru přidejte nejnovější verzi knihovny dependencies pro přesun dat. V době psaní by tato verze byla "Microsoft.Azure.Storage.DataMovement": "0.6.2"
  2. Měla by se zobrazit výzva k obnovení projektu. Klikněte na 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í kostry aplikace

První věc, kterou uděláme, je nastavit "kostru" kódu naší aplikace. 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)
        {

        }
    }
}

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í

Jednou z funkcí nabízených knihovnou přesunu dat je 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 budete muset experimentovat, abyste zjistili, co funguje nejlépe na základě dostupné šířky pásma sítě.

Pojďme přidat nějaký kód, který nám umožní nastavit počet paralelních operací. Pojďme také přidat kód, který určuje, jak dlouho trvá dokončení přenosu.

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

Znalost doby trvání přenosu dat je užitečná. Možnost vidět průběh přenosu během operace převodu by však byla ještě lepší. K dosažení tohoto scénáře potřebujeme vytvořit TransferContext objekt. Objekt TransferContext má dvě formy: SingleTransferContext a DirectoryTransferContext. První soubor slouží k přenosu jednoho souboru a druhý soubor slouží k přenosu adresáře souborů.

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ší praktickou funkcí, kterou nabízí knihovna pro přesun dat, je možnost obnovit zrušený přenos. Pojďme přidat nějaký kód, který nám umožní dočasně zrušit přenos zadáním ca pak pokračovat v přenosu 3 sekundy později.

Upravit 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 vždy 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

Bylo by to zklamáním, pokud by knihovna pro přesun dat mohla přenášet pouze jeden soubor najednou. Naštěstí to není případ. Knihovna pro přesun dat umožňuje přenášet adresář souborů a všechny jeho podadresáře. Pojďme přidat nějaký kód, který nám to umožní.

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 (např. AWS) 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í, která je jedinečně poskytována knihovnou přesunu dat, je možnost kopírovat z jednoho prostředku Azure Storage do jiného.

Upravit 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. To 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 však 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.