Расширение Azure
Расширение azure — это загружаемое расширение, которое добавляет абстракцию файловой системы для хранилища Azure Blob в DuckDB.
Установка и загрузка
Расширение azure будет прозрачно автоматически загружено при первом использовании из официального репозитория расширений. Если вы хотите установить и загрузить его вручную, выполните:
INSTALL azure; LOAD azure;
Использование
После настройки аутентификации вы можете запросить хранилище Azure следующим образом:
Хранилище Azure Blob
Допустимые схемы URI: az или azure
SELECT count(*) FROM 'az://⟨my_container⟩/⟨path⟩/⟨my_file⟩.⟨parquet_or_csv⟩';
Также поддерживаются шаблоны:
SELECT * FROM 'az://⟨my_container⟩/⟨path⟩/*.csv';
SELECT * FROM 'az://⟨my_container⟩/⟨path⟩/**';
Или с синтаксисом полного пути:
SELECT count(*) FROM 'az://⟨my_storage_account⟩.blob.core.windows.net/⟨my_container⟩/⟨path⟩/⟨my_file⟩.⟨parquet_or_csv⟩';
SELECT * FROM 'az://⟨my_storage_account⟩.blob.core.windows.net/⟨my_container⟩/⟨path⟩/*.csv';
Хранилище Azure Data Lake (ADLS)
Допустимые схемы URI: abfss
SELECT count(*) FROM 'abfss://⟨my_filesystem⟩/⟨path⟩/⟨my_file⟩.⟨parquet_or_csv⟩';
Также поддерживаются шаблоны:
SELECT * FROM 'abfss://⟨my_filesystem⟩/⟨path⟩/*.csv';
SELECT * FROM 'abfss://⟨my_filesystem⟩/⟨path⟩/**';
Или с синтаксисом полного пути:
SELECT count(*) FROM 'abfss://⟨my_storage_account⟩.dfs.core.windows.net/⟨my_filesystem⟩/⟨path⟩/⟨my_file⟩.⟨parquet_or_csv⟩';
SELECT * FROM 'abfss://⟨my_storage_account⟩.dfs.core.windows.net/⟨my_filesystem⟩/⟨path⟩/*.csv';
Настройка
Используйте следующие опции конфигурации, чтобы настроить чтение удаленных файлов расширением:
| Имя | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
azure_http_stats | Включить информацию http из хранилища Azure в EXPLAIN ANALYZE операторе. | BOOLEAN | false |
azure_read_transfer_concurrency | Максимальное количество потоков, которые может использовать клиент Azure для одновременного чтения. Если azure_read_transfer_chunk_size меньше azure_read_buffer_size, то установка этого значения > 1 позволит клиенту Azure выполнять одновременные запросы для заполнения буфера. | BIGINT | 5 |
azure_read_transfer_chunk_size | Максимальный размер в байтах, который клиент Azure будет читать в одном запросе. Рекомендуется, чтобы это значение было кратно azure_read_buffer_size. | BIGINT | 1024*1024 |
azure_read_buffer_size | Размер буфера чтения. Рекомендуется, чтобы это значение было кратно azure_read_transfer_chunk_size. | UBIGINT | 1024*1024 |
azure_transport_option_type | Базовый адаптер для использования в Azure SDK. Допустимые значения: default или curl. | VARCHAR | default |
azure_context_caching | Включить/отключить кэширование базового подключения HTTP Azure SDK в контексте подключения DuckDB при выполнении запросов. Если вы подозреваете, что это приводит к побочным эффектам, вы можете попробовать отключить его, установив значение false (не рекомендуется). | BOOLEAN | true |
Явное задание
azure_transport_option_typeв значениеcurlимеет следующие последствия:
- В Linux это может решить проблемы с сертификатами (
Error: Invalid Error: Fail to get a new connection for: https://⟨storage account name⟩.blob.core.windows.net/. Problem with the SSL CA cert (path? access rights?)) потому что при указании расширения оно будет пытаться найти сертификат в различных путях (это не делается по умолчанию curl и может быть неверным из-за статической компоновки).- В Windows это заменяет адаптер по умолчанию (WinHTTP), позволяя использовать все возможности curl (например, использование прокси-серверов socks).
- Во всех операционных системах будут учитываться следующие переменные окружения:
CURL_CA_INFO: Путь к файлу в формате PEM, содержащему авторитетные сертификаты, отправленные в libcurl. Обратите внимание, что эта опция известна тем, что работает только в Linux и может выбросить исключение при установке на других платформах.CURL_CA_PATH: Путь к каталогу, содержащему файлы в формате PEM, содержащие авторитетные сертификаты, отправленные в libcurl.
Пример:
SET azure_http_stats = false; SET azure_read_transfer_concurrency = 5; SET azure_read_transfer_chunk_size = 1_048_576; SET azure_read_buffer_size = 1_048_576;
Аутентификация
Расширение Azure имеет два способа настройки аутентификации. Предпочтительный способ — использовать секреты.
Аутентификация с секретом
Для расширения Azure доступно несколько поставщиков секретов:
- Если вам нужно определить разные секреты для разных учетных записей хранения, используйте конфигурацию
SCOPE. Обратите внимание, что дляSCOPEтребуется конечный слэш (SCOPE 'azure://some_container/'). - Если вы используете полный путь, то атрибут
ACCOUNT_NAMEявляется необязательным.
CONFIG поставщик
Поставщик по умолчанию, CONFIG (т.е., настроенный пользователем), предоставляет доступ к учетной записи хранения с использованием строки подключения или анонимно. Например:
CREATE SECRET secret1 (
TYPE AZURE,
CONNECTION_STRING '⟨value⟩'
); Если вы не используете аутентификацию, вам все равно необходимо указать имя учетной записи хранения. Например:
CREATE SECRET secret2 (
TYPE AZURE,
PROVIDER CONFIG,
ACCOUNT_NAME '⟨storage account name⟩'
); Значение по умолчанию для PROVIDER — CONFIG.
CREDENTIAL_CHAIN поставщик
Поставщик CREDENTIAL_CHAIN позволяет подключиться, используя учетные данные, автоматически полученные Azure SDK через цепочку учетных данных Azure. По умолчанию используется цепочка DefaultAzureCredential, которая пытается получить учетные данные в соответствии с порядком, указанным в документации Azure. Например:
CREATE SECRET secret3 (
TYPE AZURE,
PROVIDER CREDENTIAL_CHAIN,
ACCOUNT_NAME '⟨storage account name⟩'
); DuckDB также позволяет указать определенную цепочку с помощью ключевого слова CHAIN. Это принимает список поставщиков, разделенных точкой с запятой (a;b;c), которые будут проверены в порядке. Например:
CREATE SECRET secret4 (
TYPE AZURE,
PROVIDER CREDENTIAL_CHAIN,
CHAIN 'cli;env',
ACCOUNT_NAME '⟨storage account name⟩'
); Возможные значения: cli; managed_identity; env; default;
Если явный CHAIN не указан, будет использоваться значение по умолчанию default
SERVICE_PRINCIPAL поставщик
Поставщик SERVICE_PRINCIPAL позволяет подключиться, используя Azure Service Principal (SPN).
Либо с секретом:
CREATE SECRET azure_spn (
TYPE AZURE,
PROVIDER SERVICE_PRINCIPAL,
TENANT_ID '⟨tenant id⟩',
CLIENT_ID '⟨client id⟩',
CLIENT_SECRET '⟨client secret⟩',
ACCOUNT_NAME '⟨storage account name⟩'
); Либо с сертификатом:
CREATE SECRET azure_spn_cert (
TYPE AZURE,
PROVIDER SERVICE_PRINCIPAL,
TENANT_ID '⟨tenant id⟩',
CLIENT_ID '⟨client id⟩',
CLIENT_CERTIFICATE_PATH '⟨client cert path⟩',
ACCOUNT_NAME '⟨storage account name⟩'
); Настройка прокси
Для настройки прокси-информации при использовании секретов вы можете добавить HTTP_PROXY, PROXY_USER_NAME, и PROXY_PASSWORD в определение секрета. Например:
CREATE SECRET secret5 (
TYPE AZURE,
CONNECTION_STRING '⟨value⟩',
HTTP_PROXY 'http://localhost:3128',
PROXY_USER_NAME 'john',
PROXY_PASSWORD 'doe'
);
- При использовании секретов переменная среды
HTTP_PROXYвсе равно будет учитываться, за исключением случаев, когда вы явно указываете ее значение.- При использовании секретов переменная
SETсессии «Аутентификация с переменными» будет проигнорирована.- Для поставщика Azure
CREDENTIAL_CHAINфактический токен извлекается во время запроса, а не во время создания секрета.
Аутентификация с переменными (устарело)
SET variable_name = variable_value;
Где variable_name может быть одним из следующих:
| Имя | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
azure_storage_connection_string |
Строка подключения к Azure, используемая для аутентификации и настройки запросов Azure. | STRING |
- |
azure_account_name |
Имя учетной записи Azure. При установке расширение попытается автоматически обнаружить учетные данные (не используется, если вы передаёте строку подключения). | STRING |
- |
azure_endpoint |
Переопределить конечную точку Azure для использования поставщиков учетных данных Azure. | STRING |
blob.core.windows.net |
azure_credential_chain |
Упорядоченный список поставщиков учетных данных Azure в строчном формате, разделённых символом ;. Например: 'cli;managed_identity;env'. См. список возможных значений в разделе поставщика CREDENTIAL_CHAIN. Не используется, если вы передаёте строку подключения. |
STRING |
- |
azure_http_proxy |
Прокси-сервер, используемый при входе в систему и выполнении запросов к Azure. | STRING |
HTTP_PROXY переменная окружения (если задана). |
azure_proxy_user_name |
Имя пользователя прокси-сервера HTTP, если необходимо. | STRING |
- |
azure_proxy_password |
Пароль прокси-сервера HTTP, если необходимо. | STRING |
- |
Дополнительная информация
Ведение журнала
Расширение Azure использует Azure SDK для подключения к хранилищу Azure Blob и поддерживает вывод журналов SDK в консоль. Для управления уровнем журнала установите переменную среды AZURE_LOG_LEVEL.
Например, подробные журналы можно включить следующим образом в Python:
import os
import duckdb
os.environ["AZURE_LOG_LEVEL"] = "verbose"
duckdb.sql("CREATE SECRET myaccount (TYPE AZURE, PROVIDER CREDENTIAL_CHAIN, SCOPE 'az://myaccount.blob.core.windows.net/')")
duckdb.sql("SELECT count(*) FROM 'az://myaccount.blob.core.windows.net/path/to/blob.parquet'")
Различия между ADLS и хранилищем Blob
Несмотря на то, что ADLS реализует функциональность, аналогичную хранилищу Blob, существуют некоторые важные преимущества производительности при использовании конечных точек ADLS для работы с шаблонами, особенно при использовании сложных шаблонов.
Чтобы продемонстрировать это, рассмотрим пример того, как выполняется поиск по шаблону в соответственно конечных точках Glob и ADLS.
Используя следующую файловую систему:
root
├── l_receipmonth=1997-10
│ ├── l_shipmode=AIR
│ │ └── data_0.csv
│ ├── l_shipmode=SHIP
│ │ └── data_0.csv
│ └── l_shipmode=TRUCK
│ └── data_0.csv
├── l_receipmonth=1997-11
│ ├── l_shipmode=AIR
│ │ └── data_0.csv
│ ├── l_shipmode=SHIP
│ │ └── data_0.csv
│ └── l_shipmode=TRUCK
│ └── data_0.csv
└── l_receipmonth=1997-12
├── l_shipmode=AIR
│ └── data_0.csv
├── l_shipmode=SHIP
│ └── data_0.csv
└── l_shipmode=TRUCK
└── data_0.csv
Следующий запрос, выполненный через конечную точку хранилища Blob,
SELECT count(*) FROM 'az://root/l_receipmonth=1997-*/l_shipmode=SHIP/*.csv';
выполнит следующие действия:
- Список всех файлов с префиксом
root/l_receipmonth=1997-root/l_receipmonth=1997-10/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-10/l_shipmode=AIR/data_0.csvroot/l_receipmonth=1997-10/l_shipmode=TRUCK/data_0.csvroot/l_receipmonth=1997-11/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-11/l_shipmode=AIR/data_0.csvroot/l_receipmonth=1997-11/l_shipmode=TRUCK/data_0.csvroot/l_receipmonth=1997-12/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-12/l_shipmode=AIR/data_0.csvroot/l_receipmonth=1997-12/l_shipmode=TRUCK/data_0.csv
- Фильтр результатов с запрошенным шаблоном
root/l_receipmonth=1997-*/l_shipmode=SHIP/*.csvroot/l_receipmonth=1997-10/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-11/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-12/l_shipmode=SHIP/data_0.csv
В то же время, тот же запрос, выполненный через конечную точку хранилища данных,
SELECT count(*) FROM 'abfss://root/l_receipmonth=1997-*/l_shipmode=SHIP/*.csv';
выполнит следующие действия:
- Список всех каталогов в
root/root/l_receipmonth=1997-10root/l_receipmonth=1997-11root/l_receipmonth=1997-12
- Фильтр и список подкаталогов:
root/l_receipmonth=1997-10,root/l_receipmonth=1997-11,root/l_receipmonth=1997-12root/l_receipmonth=1997-10/l_shipmode=SHIProot/l_receipmonth=1997-10/l_shipmode=AIRroot/l_receipmonth=1997-10/l_shipmode=TRUCKroot/l_receipmonth=1997-11/l_shipmode=SHIProot/l_receipmonth=1997-11/l_shipmode=AIRroot/l_receipmonth=1997-11/l_shipmode=TRUCKroot/l_receipmonth=1997-12/l_shipmode=SHIProot/l_receipmonth=1997-12/l_shipmode=AIRroot/l_receipmonth=1997-12/l_shipmode=TRUCK
- Фильтр и список подкаталогов:
root/l_receipmonth=1997-10/l_shipmode=SHIP,root/l_receipmonth=1997-11/l_shipmode=SHIP,root/l_receipmonth=1997-12/l_shipmode=SHIProot/l_receipmonth=1997-10/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-11/l_shipmode=SHIP/data_0.csvroot/l_receipmonth=1997-12/l_shipmode=SHIP/data_0.csv
Как видите, поскольку конечная точка хранилища Blob не поддерживает понятие каталогов, фильтрация может быть выполнена только после перечисления, в то время как конечная точка хранилища данных будет перечислять файлы рекурсивно. Особенно при большом количестве разделов/каталогов разница в производительности может быть очень значительной.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/extensions/azure.html