Ошибка Polybase в Azure Data Lake Gen 2

Я пытаюсь подключиться из Azure SQLDW через Polybase к файлу Parquet в Data Lake Gen 2. Это мой код:

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://[email protected]', 
        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: исключение Java возникло при вызове HdfsBridge_IsDirExist. Сообщение об исключении Java: HdfsBridge :: isDirExist - При проверке наличия директории возникла непредвиденная ошибка: AbfsRestOperationException: HEAD https://xxxx.dfs.core.windows.net/xxxx?resource=filesystem&timeout=90 StatusCode = 403 StatusDescription = Серверу не удалось аутентифицировать запрос. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. ErrorCode = ErrorMessage =

Каталог действительно существует, и у моего субъекта-службы есть доступ. Я подтвердил это, используя тот же принципал службы из Databricks и прочитав файл без ошибок.

Я не понимаю, что я сделал неправильно.


person simon_dmorias    schedule 05.03.2019    source источник


Ответы (2)


Проблема в том, что предоставленные пользователем учетные данные oauth в настоящее время не поддерживаются для abfs / abfss.

Поддерживаемые методы аутентификации:

  • Ключ учетной записи хранения
  • Проверка подлинности на основе MSI
person Ron Dunn    schedule 05.03.2019
comment
Спасибо @Ron - использование ключа работает отлично. Есть ли по этому поводу какие-нибудь документы? Мне интересно попробовать с MSI, но я не знаю, как это сделать. - person simon_dmorias; 05.03.2019
comment
Если вы не против подождать день или два, я составлю подробный обзор процесса. Я не знаю ни одной документации, которая бы связала все это воедино, и я думаю, что нам было бы полезно, если бы она была доступна. - person Ron Dunn; 06.03.2019
comment
Без проблем. Спасибо - person simon_dmorias; 06.03.2019
comment
В Интернете уже была хорошая документация по использованию MSI, но по какой-то причине ее очень трудно найти в поисковой системе. Следуйте инструкциям по этой ссылке, и все будет в порядке. Одно небольшое изменение: если вы используете консоль Powershell на портале Azure, вы можете игнорировать шаг Connect-AZAccount. docs. microsoft.com/en-us/azure/sql-database/ - person Ron Dunn; 07.03.2019
comment
Еще один небольшой совет ... когда сценарий Powershell запрашивает -ServerName, значение должно быть XXXX, а не XXXX.database.windows.net. - person Ron Dunn; 07.03.2019

Кстати - Oauth2.0 теперь поддерживается в Gen2. Если вы проверили, что путь и разрешения верны, то есть через Azure Databricks, я подозреваю, что это связано с сетью. Для подтверждения попробуйте использовать учетную запись хранения с неограниченными сетевыми настройками.

Вы можете получить эту ошибку в результате включения встроенного ПО хранилища - просмотрев docs здесь вы можете увидеть звездочки, обозначающие ограничения FW с использованием различных типов разрешений. Для копирования в вы можете обратиться к этому таблица авторизации.

Обычно вы можете разрешить доверенные службы Microsoft в сети хранения, однако это работает только при использовании MSI - в вашем случае вы используете SPN.

Если вы по-прежнему хотите запросить свою базу данных, используя субъект-службу или идентификатор пользователя (в отличие от MSI), вы можете попробовать выполнить выполните шаги с помощью PowerShell, которые позволят выделенному пулу Synapse ( ранее SQLDW), чтобы передать FW хранилища, затем переключитесь на SPN или UPN для авторизации по спискам ACL POSIX.

Наконец, вот хороший пост в блоге, в котором обсуждается разные варианты.

person alpinedelight    schedule 01.03.2021