【问题标题】:Azure DataLake client fails on creating a directoryAzure DataLake 客户端无法创建目录
【发布时间】:2021-11-30 15:24:55
【问题描述】:

我正在按照https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-directory-file-acl-dotnet 中的步骤创建一个 POC 来在 Azure 中存储文件。在下面的 sn-p 中,创建目录失败并显示消息 No such host is known。 (securedfstest02.blob.core.windows.net:443)。感谢任何解决方法的建议 这个问题。

using Azure;
using Azure.Storage;
using Azure.Storage.Files.DataLake;
using Azure.Storage.Files.DataLake.Models;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace DataLakeHelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            try
            {
                CreateFileClientAsync_DirectoryAsync().Wait();
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
        }

        static async Task CreateFileClientAsync_DirectoryAsync()
        {
            // Make StorageSharedKeyCredential to pass to the serviceClient
            string storageAccountName = "secureblobtest02";
            string storageAccountKey = "mykeyredacted";
            string dfsUri = "https://" + storageAccountName + ".dfs.core.windows.net";

            StorageSharedKeyCredential sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);

            // Create DataLakeServiceClient using StorageSharedKeyCredentials
            DataLakeServiceClient serviceClient = new DataLakeServiceClient(new Uri(dfsUri), sharedKeyCredential);

            // Create a DataLake Filesystem
            DataLakeFileSystemClient filesystem = serviceClient.GetFileSystemClient("my-filesystem");
            if(!await filesystem.ExistsAsync())
                await filesystem.CreateAsync();

            //Create a DataLake Directory
            DataLakeDirectoryClient directory = filesystem.CreateDirectory("my-dir");
            if (!await directory.ExistsAsync())
                await directory.CreateAsync();

            // Create a DataLake File using a DataLake Directory
            DataLakeFileClient file = directory.GetFileClient("my-file");
            if(!await file.ExistsAsync())
                await file.CreateAsync();

            // Verify we created one file
            var response = filesystem.GetPathsAsync();
            IAsyncEnumerator<PathItem> enumerator = response.GetAsyncEnumerator();
            Console.WriteLine(enumerator?.Current?.Name);

            // Cleanup
            await filesystem.DeleteAsync();
        }
    }
}

【问题讨论】:

  • 虽然这似乎是一个暂时性错误,但您能否分享完整的代码和更多片段 - 完整的错误消息以便更好地理解。你是如何认证的?这是否具有所需的访问级别?如果通过防火墙或 Vnet,请确保存储具有适当的访问权限。
  • 我复制了上面的整个代码。 Azure 存储资源管理器将 DFS 端点显示为 secureblobtest02.dfs.core.windows.net。但从例外情况来看,客户端似乎正在寻找不正确的 DFS 端点。无法判断客户端从哪里选择了错误的端点。
  • 我希望您也将string dfsUri 行中的storageAccountName 替换为secureblobtest02。并且mykeyredacted 应该替换为您在门户中的存储帐户 > 安全 + 网络设置 > 访问密钥下找到的访问密钥中的一个
  • 您可以通过导航到存储帐户 > 端点 > 数据湖存储来确认端点
  • 看我上面的评论。我从 Azure 存储资源管理器复制了 DFS 终结点。是的,你指的是基本的。如果我有错误的密钥,我就不会创建过去的文件系统。

标签: azure-blob-storage azure-storage azure-data-lake


【解决方案1】:

--更新

在您的问题中,您提到了 Azure 数据湖,但您似乎拥有主机:securedfstest02.blob.core.windows.net

Azure Data Lake Storage 使用 .dfs.core.windows.net/,而 Azure Blob Storage 使用 .blob.core.windows.net/ 在 ADLS 中使用与 Blob 服务相关的操作时,您也必须相应地更改端点。

请注意官方 MS 文档URI templates

我使用了相同的代码并且能够创建目录。刚刚替换了我的 adls 凭据。我没有配置任何额外的权限。 ADLS 允许从所有网络访问。您可能需要检查您的默认配置是否为 specific 网络,或者防火墙是否允许客户端(您的)IP。

using Azure;
using Azure.Storage;
using Azure.Storage.Files.DataLake;
using Azure.Storage.Files.DataLake.Models;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace DataLakeHelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting....");
            try
            {
                Console.WriteLine("Executing...");
                CreateFileClientAsync_DirectoryAsync().Wait();
                Console.WriteLine("Done");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

        static async Task CreateFileClientAsync_DirectoryAsync()
        {
            // Make StorageSharedKeyCredential to pass to the serviceClient
            string storageAccountName = "kteststarageeadls";
            string storageAccountKey = "6fAe+P8LRe8LH0Ahxxxxxxxxx5ma17Slr7SjLy4oVYSgj05m+zWZuy5X8p4/Bbxxx8efzCj/X+On/Fwmxxxo7g==";
            string dfsUri = "https://" + "kteststarageeadls" + ".dfs.core.windows.net";

            StorageSharedKeyCredential sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);

            // Create DataLakeServiceClient using StorageSharedKeyCredentials
            DataLakeServiceClient serviceClient = new DataLakeServiceClient(new Uri(dfsUri), sharedKeyCredential);

            // Create a DataLake Filesystem
            DataLakeFileSystemClient filesystem = serviceClient.GetFileSystemClient("my-filesystem");
            if (!await filesystem.ExistsAsync())
                await filesystem.CreateAsync();

            //Create a DataLake Directory
            DataLakeDirectoryClient directory = filesystem.CreateDirectory("my-dir");
            if (!await directory.ExistsAsync())
                await directory.CreateAsync();

            // Create a DataLake File using a DataLake Directory
            DataLakeFileClient file = directory.GetFileClient("my-file");
            if (!await file.ExistsAsync())
                await file.CreateAsync();

            // Verify we created one file
            var response = filesystem.GetPathsAsync();
            IAsyncEnumerator<PathItem> enumerator = response.GetAsyncEnumerator();
            Console.WriteLine(enumerator?.Current?.Name);

            // Cleanup
            //await filesystem.DeleteAsync();
        }
    }
}

我修改了存储账户密钥,仅供参考。

【讨论】:

  • 即使我打开所有内容,同样的问题仍然存在。我也尝试过使用不同的 DC,但没有任何运气。您使用的是 Azure.Storage.Files.DataLake 版本 12.8.0 和 Azure.Storage.Common 12.9.0 还是其他版本?
  • 两个版本相同
  • 我用 new DataLakeServiceClient("My connection string") 替换了 new DataLakeServiceClient(new Uri(dfsUri), sharedKeyCredential) 并且一切正常。似乎是使用 new DataLakeServiceClient(new Uri(dfsUri), sharedKeyCredential) 创建客户端的问题
  • 就像我在之前的评论中已经提出的问题一样,您是否将storageAccountName 替换为secureblobtest02 行中的string dfsUri = "https://" + storageAccountName + ".dfs.core.windows.net"; 因为在您发布的代码中,它就这样保留了。应该是string dfsUri = "https://" + "secureblobtest02" + ".dfs.core.windows.net";
  • 除非我遗漏了什么,如果你用常量替换变量,结果 dfsUri 是相同的。
猜你喜欢
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2014-08-23
相关资源
最近更新 更多