Azure Blob 存储对象存储

Azure 有数个用于访问数据的界面。Vertica 在 Azure 存储中读取并始终写入块 Blob。Vertica 可以读取使用 ADLS Gen2 创建的外部数据,而 Vertica 导出的数据可以使用 ADLS Gen2 读取。

URI 格式

以下几项之一:

  • azb://account/container/path
  • azb://[account@]host[:port]/container/path

在第一个版本中,类似“azb://myaccount/mycontainer/path”的 URI 将“//”后面的第一个令牌视为帐户名。在第二个版本中,您可以指定帐户,并且必须显式指定主机。

以下规则适用于第二种形式:

  • 如果未指定 account,则使用主机的第一个标签。例如,如果 URI 是“azb://myaccount.blob.core.windows.net/mycontainer/my/object”,则“myaccount”用于 account
  • 如果未指定 accounthost 有一个标签并且没有端口,则端点是 host.blob.core.windows.net。否则,端点是 URI 中指定的主机和端口。

协议(HTTP 或 HTTPS)在 AzureStorageEndpointConfig 配置参数中指定。

身份验证

如果您使用的是 Azure 托管身份,则无需在 Vertica 中进一步配置。如果 Azure 存储使用多个托管身份,则必须标记要使用的身份。Vertica 查找键为 VerticaManagedIdentityClientId 的 Azure 标记,其值必须是要使用的托管身份的 client_id 属性。如果更新 Azure 标记,请调用 AZURE_TOKEN_CACHE_CLEAR

如果不使用托管身份,请使用 AzureStorageCredentials 配置参数向 Azure 提供凭据。如果加载数据,您可以在会话级别设置参数。如果在 Azure 上使用 Eon 模式公共存储,则必须在数据库级别设置此配置参数。

在 Azure 中,您还必须为 Vertica 中使用的身份授予对容器的访问权限。

配置参数

以下数据库配置参数适用于 Azure blob 文件系统。您可以使用适当的 ALTER 语句设置不同级别的参数,例如 ALTER SESSION...SET PARAMETER。 查询 CONFIGURATION_PARAMETERS 系统表以确定哪些级别(节点、会话、用户、数据库)对给定参数有效。

AzureStorageCredentials
JSON 对象的集合,其中每个对象指定一个端点的连接凭据。此参数优先于 Azure 托管标识。

该集合必须至少包含一个对象,并且可能会包含多个对象。每个对象必须至少指定 accountNameblobEndpoint 之一,并且至少指定 accountKeysharedAccessSignature 之一。

  • accountName:如果未指定,则使用 blobEndpoint 标签。
  • blobEndpoint:带有可选端口的主机名 (host:port)。如果未指定,则使用 account.blob.core.windows.net
  • accountKey:帐户或端点的访问密钥。
  • sharedAccessSignature:用于更精细访问控制的访问令牌(如果 Azure 端点正在使用)。
AzureStorageEndpointConfig
JSON 对象的集合,其中每个对象指定一个端点的配置元素。每个对象必须至少指定 accountNameblobEndpoint 之一。
  • accountName:如果未指定,则使用 blobEndpoint 标签。
  • blobEndpoint:带有可选端口的主机名 (host:port)。如果未指定,则使用 account.blob.core.windows.net
  • protocol:HTTPS(默认)或 HTTP。
  • isMultiAccountEndpoint:如果端点支持多个帐户,则为 true,否则为 false(默认为 false)。要使用多帐户访问权限,则必须在 URI 中包含帐户名称。如果 URI 路径包含帐户,则系统将假定此值为 true,但显式设置为 false 则除外。

示例

以下示例将这些值用于配置参数。AzureStorageCredentials 包含敏感信息,且此示例中在会话级别设置。

=> ALTER SESSION SET AzureStorageCredentials =
    '[{"accountName": "myaccount", "accountKey": "REAL_KEY"},
      {"accountName": "myaccount", "blobEndpoint": "localhost:8080", "accountKey": "TEST_KEY"}]';

=> ALTER DATABASE default SET AzureStorageEndpointConfig =
    '[{"accountName": "myaccount", "blobEndpoint": "localhost:8080", "protocol": "http"}]';

以下示例使用 Azure 中的数据创建一个外部表。URI 指定帐户名称“myaccount”。

=> CREATE EXTERNAL TABLE users (id INT, name VARCHAR(20))
    AS COPY FROM 'azb://myaccount/mycontainer/my/object/*';

Vertica 使用 AzureStorageEndpointConfig 和帐户名称为文件生成以下位置:

https://myaccount.blob.core.windows.net/mycontainer/my/object/*

使用 REAL_KEY 凭据访问数据。

如果 COPY 语句中的 URI 改为 azb://myaccount.blob.core.windows.net/mycontainer/my/object,则结果位置为 https://myaccount.blob.core.windows.net/mycontainer/my/object,同样使用 REAL_KEY 凭据。

但是,如果 COPY 语句中的 URI 是 azb://myaccount@localhost:8080/mycontainer/my/object,则主机和端口指定不同的端点:http://localhost:8080/myaccount/mycontainer/my/object。此端点配置为使用不同的凭据 TEST_KEY。