1

我正在尝试通过 Polybase 从 Azure SQLDW 连接到 Data Lake Gen 2 中的 Parquet 文件。这是我的代码:

CREATE DATABASE SCOPED CREDENTIAL DSC_ServicePrincipal
    WITH IDENTITY = '1234567890@https://login.microsoftonline.com/1234567890/oauth2/token',
    SECRET = '1234567890'
GO

CREATE EXTERNAL DATA SOURCE [DS_ADLS] WITH (TYPE = HADOOP, 
        LOCATION = N'abfss://filesystem@storageacc.dfs.core.windows.net', 
        CREDENTIAL = DSC_ServicePrincipal)
GO

CREATE EXTERNAL FILE FORMAT [ParquetFileFormatSnappy] 
WITH (FORMAT_TYPE = PARQUET, DATA_COMPRESSION = N'org.apache.hadoop.io.compress.SnappyCodec')
GO

CREATE EXTERNAL TABLE [dbo].[DimDate]
  (
        [DateSKey]        int   not null,
      [Date]              date  not null,
      [Year]              int   not null,
      [Month]             int   not null,
      [Day]             int not null,
      [WeekOfYear]      int not null,
      [MonthNameShort]  varchar(50) not null,
      [MonthName]         varchar(50)   not null,
      [DayNameShort]      varchar(50)   not null,
      [DayName]         varchar(50) not null
  )
  WITH (DATA_SOURCE = [DS_ADLS],LOCATION = N'/PRESENTED/dimDate',FILE_FORMAT = [ParquetFileFormatSnappy],REJECT_TYPE = VALUE,REJECT_VALUE = 0)

创建外部表执行失败,返回如下错误:

访问 HDFS 时出错:调用 HdfsBridge_IsDirExist 时引发 Java 异常。Java 异常消息:HdfsBridge::isDirExist - 检查directoy 是否存在时遇到意外错误:AbfsRestOperationException: HEAD https://xxxx.dfs.core.windows.net/xxxx?resource=filesystem&timeout=90 StatusCode=403 StatusDescription=Server failed对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。错误代码= 错误消息=

该目录确实存在,并且我的服务主体有权访问。我已经通过使用来自 Databricks 的相同服务主体并无错误地读取文件来确认这一点。

我对自己做错了什么感到迷茫。

4

2 回答 2

1

问题是 abfs/abfss 目前不支持用户提供的 oauth 凭据。

支持的身份验证方法有:

  • 存储帐户密钥
  • 基于 MSI 的身份验证
于 2019-03-05T12:50:57.400 回答
0

顺便说一句,Gen2 现在支持 Oauth2.0。如果您已验证路径和权限是否正确,即通过 Azure Databricks,我会怀疑它与网络有关。尝试使用具有不受限制的网络设置的存储帐户进行确认。

由于启用了存储固件,您可能会收到此错误 - 查看此处的文档,您可以看到星号表示使用各种权限类型的固件限制。对于复制到您可以参考此授权表

通常您可以在存储网络中“允许受信任的微软服务”,但这仅在使用 MSI 时有效——在您的情况下,您使用的是 SPN。

如果您仍想使用服务主体或用户身份(而不是 MSI)查询您的数据湖,您可以尝试通过 powershell 执行此处的步骤,这将允许 Synapse 专用池(以前称为 SQLDW)通过存储 FW,然后切换到SPN 或 UPN 对 POSIX ACL 进行授权。

最后,这是一篇很好的博客文章,讨论了不同的选项

于 2021-03-01T09:37:36.480 回答