使用C# Azure.Storage.Files.DataLake下载datalake blob(理想情况下是并行的)

tf7tbtn2  于 2023-06-30  发布在  C#
关注(0)|答案(1)|浏览(86)

我想弄清楚如何从ADLS 2存储blob目录下载文件-我只有一个SAS URL到所述目录,我想递归下载该目录中的所有文件,希望是并行的。
在给定存储凭据的情况下,如何做到这一点非常清楚,并且有许多示例显示如何做到这一点-但我找不到任何使用SAS URL的示例。
任何线索或文档链接将不胜感激!这是我现在的工作方式,但是每当我将其更改为ReadToAsync,或者尝试使用ParallelForEach,ParallelForEachAsync或信号量下载时,对Read/ReadAsync的调用都会崩溃。有没有更好的办法?我应该放弃库,而只是对REST API进行webrequest吗?:

DataLakeDirectoryClient directoryClient = new DataLakeDirectoryClient(_containerSasUri);
if (directoryClient.Exists())
{
    foreach (var blob in directoryClient.GetPaths(true))
    {
        if (blob.IsDirectory.HasValue && !blob.IsDirectory.Value)
        {
            blobClient.ReadTo(Path.Combine(downloadPath, blob.Name), 
            new DataLakeFileReadToOptions() { TransferOptions = new() { MaximumConcurrency = 10 } });
        }
    }
}
gmxoilav

gmxoilav1#

使用C# Azure.Storage.Files.DataLake下载datalake blob(理想情况下是并行的)
我已经在我的环境中复制了,并得到了预期的结果如下:

Inside ADLS Account:

Code:

using Azure.Storage.Files.DataLake;
using System;
using System.IO;
using System.Threading.Tasks;

Console.WriteLine("************");
Console.WriteLine("************");
Console.WriteLine("Started Downloading Parallely");
Uri conUri = new Uri("https://rithwik987.blob.core.windows.net/rithwik?sp=racwdlmeop&st=2023-06-28T05:12:24Z&se=2023-06-28T13:12:24Z&sv=2022-11-02&sr=c&0%3D");
string downPath = @"C:\Users\Desktop\Files";
DataLakeDirectoryClient dc = new DataLakeDirectoryClient(conUri);
var files = dc.GetPaths().Where(b => (bool)!b.IsDirectory).ToList();

Parallel.ForEach(files, b =>
{
    DataLakeFileClient fc = dc.GetFileClient(b.Name);
    string destFilePath = Path.Combine(downPath, b.Name);
    Console.WriteLine("Downloading"+ b.Name);
    using FileStream downloadStream = File.OpenWrite(destFilePath);
    fc.ReadTo(downloadStream);

});
Console.WriteLine("Downloading Parallely Completed");
Console.WriteLine("************");
Console.WriteLine("************");

Output:

相关问题