Amazon Athena Vertica 连接器
Vertica 是一个列存数据库平台,可以部署在云中或在支持 EB 级数据仓库的本地部署。您可以在联合查询中使用 Amazon Athena Vertica 连接器来查询来自 Athena 的 Vertica 数据来源。例如,您可以通过 Vertica 上的数据仓库和 Amazon S3 中的数据湖运行分析查询。
先决条件
可以使用 Athena 控制台或 AWS Serverless Application Repository 将该连接器部署到您的 AWS 账户。有关更多信息,请参阅部署数据来源连接器或使用 AWS Serverless Application Repository 部署数据来源连接器。
使用此连接器前,请先设置 VPC 和安全组。有关更多信息,请参阅 为数据来源连接器创建 VPC。
限制
-
由于 Athena Vertica 连接器使用 Amazon S3 Select 从 Amazon S3 读取 Parquet 文件,因此连接器的性能可能很慢。查询大型表时,我们建议您使用创建表为(选择...)查询和 SQL 谓词。
-
目前,由于 Athena 联合查询中存在一个已知问题,连接器会让 Vertica 将查询表的所有列导出到 Amazon S3,但在 Athena 控制台的结果中只能看到被查询的列。
-
不支持写入 DDL 操作。
-
任何相关的 Lambda 限制。有关更多信息,请参阅《AWS Lambda 开发人员指南》中的 Lambda 配额。
工作流
以下图表显示了使用 Vertica 连接器运行查询的工作流程。
-
针对 Vertica 中的一个或多个表发出 SQL 查询。
-
连接器解析 SQL 查询,以通过 JDBC 连接将相关部分发送到 Vertica。
-
连接字符串使用存储在 AWS Secrets Manager 中的用户名和密码,以获得 Vertica 的访问权限。
-
连接器使用 Vertica
EXPORT
命令包装 SQL 查询,如以下示例所示。EXPORT TO PARQUET (directory = 's3://amzn-s3-demo-bucket/
folder_name
, Compression='Snappy', fileSizeMB=64) OVER() as SELECT PATH_ID, ... SOURCE_ITEMIZED, SOURCE_OVERRIDE FROM DELETED_OBJECT_SCHEMA.FORM_USAGE_DATA WHERE PATH_ID <= 5; -
Vertica 处理 SQL 查询并将结果集发送到 Amazon S3 存储桶。为了提高吞吐量,Vertica 使用
EXPORT
选项并行处理多个 Parquet 文件的写入操作。 -
Athena 扫描 Amazon S3 存储桶,以确定要为结果集读取的文件数。
-
Athena 对 Lambda 函数进行多次调用,并使用 Amazon S3 Select 从结果集中读取 Parquet 文件。多次调用使 Athena 能够并行读取 Amazon S3 文件,实现高达每秒 100GB 的吞吐量。
-
Athena 使用数据湖扫描的数据处理从 Vertica 返回的数据并返回结果。
术语
以下术语与 Vertica 连接器有关。
-
数据库实例 — 部署在 Amazon EC2 上的 Vertica 数据库的任何实例。
-
处理程序 — 访问您数据库实例的 Lambda 处理程序。处理程序可以用于元数据或数据记录。
-
元数据处理程序 — 从您的数据库实例中检索元数据的 Lambda 处理程序。
-
记录处理程序 — 从您的数据库实例中检索数据记录的 Lambda 处理程序。
-
复合处理程序 — 从您的数据库实例中检索元数据和数据记录的 Lambda 处理程序。
-
属性或参数 — 处理程序用来提取数据库信息的数据库属性。您可以将这些属性配置为 Lambda 环境变量。
-
连接字符串 — 用于建立数据库实例连接的文本字符串。
-
目录 — 向 Athena 注册的非 AWS Glue 目录,是
connection_string
属性的必要前缀。
参数
Amazon Athena Vertica 连接器通过 Lambda 环境变量显示了配置选项。您可以使用以下 Lambda 环境变量来配置连接器。
-
AthenaCatalogName — Lambda 函数名称
-
ExportBucket — 将 Vertica 查询结果导出到的 Amazon S3 存储桶。
-
SpillBucket — 此函数可以溢出数据的 Amazon S3 存储桶的名称。
-
SpillPrefix — 此函数可以溢出数据的
SpillBucket
位置的前缀。 -
SecurityGroupIds — 与应该应用于 Lambda 函数的安全组对应的一个或多个 ID(例如
sg1
、sg2
或sg3
)。 -
SubnetIds — 与 Lambda 函数可用于访问您数据来源的子网对应的一个或多个子网 ID(例如
subnet1
或subnet2
)。 -
SecretNameOrPrefix — 此函数有权访问的 Secrets Manager 中一组密钥的名称或前缀(例如
vertica-*
) -
VerticaConnectionString — 如果未定义特定于目录的连接,则默认使用的 Vertica 连接详细信息。该字符串可以选择使用 AWS Secrets Manager 语法(例如
${secret_name}
)。 -
VPC ID — 要附加到 Lambda 函数的 VPC ID。
连接字符串
使用以下格式的 JDBC 连接字符串连接到数据库实例。
vertica://jdbc:vertica://
host_name
:port
/database
?user=vertica-username
&password=vertica-password
使用单个连接处理程序
您可以使用以下单个连接元数据和记录处理程序连接到单个 Vertica 实例。
处理程序类型 | 类 |
---|---|
复合处理程序 | VerticaCompositeHandler |
元数据处理程序 | VerticaMetadataHandler |
记录处理程序 | VerticaRecordHandler |
单个连接处理程序参数
参数 | 描述 |
---|---|
default |
必需。默认连接字符串。 |
单个连接处理程序支持一个数据库实例,并且必须提供 default
连接字符串参数。将忽略所有其他连接字符串。
提供凭证
要在 JDBC 连接字符串中为数据库提供用户名和密码,可以使用连接字符串属性或 AWS Secrets Manager。
-
连接字符串 — 可以将用户名和密码指定为 JDBC 连接字符串中的属性。
重要
作为安全最佳实践,请勿在您的环境变量或连接字符串中使用硬编码凭证。有关将硬编码密钥移至 AWS Secrets Manager 的信息,请参阅《AWS Secrets Manager 用户指南》中的将硬编码密钥移至 AWS Secrets Manager。
-
AWS Secrets Manager - 要将 Athena 联合查询功能与 AWS Secrets Manager 配合使用,连接到您的 Lambda 函数的 VPC 应该拥有互联网访问权限
或者 VPC 端点,以连接到 Secrets Manager。 您可以将 AWS Secrets Manager 中的密钥名称放入您的 JDBC 连接字符串中。连接器将该密钥名称替换为来自 Secrets Manager 的
username
和password
值。对于 Amazon RDS 数据库实例,将紧密集成这种支持。如果您使用 Amazon RDS,我们强烈建议您使用 AWS Secrets Manager 和凭证轮换。如果您的数据库不使用 Amazon RDS,请按以下格式将凭证存储为 JSON:
{"username": "${username}", "password": "${password}"}
带有密钥名称的示例连接字符串
以下字符串带有密钥名称 ${vertica-username
} 和 ${vertica-password}
。
vertica://jdbc:vertica://
host_name
:port
/database
?user=${vertica-username}&password=${vertica-password}
该连接器使用该密钥名称来检索密钥,并提供用户名和密码,如以下示例所示。
vertica://jdbc:vertica://
host_name
:port
/database
?user=sample-user&password=sample-password
目前,Vertica 连接器可以识别 vertica-username
和 vertica-password
JDBC 属性。
溢出参数
Lambda 开发工具包可以将数据溢出到 Amazon S3。由同一 Lambda 函数访问的所有数据库实例都会溢出到同一位置。
参数 | 描述 |
---|---|
spill_bucket |
必需。溢出桶名称。 |
spill_prefix |
必需。溢出桶密钥前缀。 |
spill_put_request_headers |
(可选)用于溢出的 Amazon S3 putObject 请求的请求标头和值的 JSON 编码映射(例如,{"x-amz-server-side-encryption" :
"AES256"} )。有关其他可能的标头,请参阅《Amazon Simple Storage Service API 参考》中的 PutObject。 |
数据类型支持
下表显示了 Vertica 连接器支持的数据类型。
布尔值 |
---|
BigInt |
短型 |
整数 |
长整型 |
浮点型 |
Double |
Date |
Varchar |
字节 |
BigDecimal |
作为 Varchar 的时间戳 |
性能
Lambda 函数执行投影下推,以减少查询扫描的数据。LIMIT
子句会减少扫描的数据量,但如果未提供谓词,则预期要使用包含 LIMIT
子句的 SELECT
查询,来扫描至少 16 MB 的数据。Vertica 连接器能够灵活地应对并发造成的节流。
传递查询
Vertica 连接器支持传递查询。传递查询使用表函数将完整查询下推到数据来源来执行查询。
要在 Vertica 中执行传递查询,可以使用以下语法:
SELECT * FROM TABLE( system.query( query => '
query string
' ))
以下示例查询将查询下推到 Vertica 中的数据来源。该查询选择了 customer
表中的所有列,将结果限制为 10。
SELECT * FROM TABLE( system.query( query => 'SELECT * FROM customer LIMIT 10' ))
许可证信息
使用此连接器,即表示您确认包含第三方组件(这些组件的列表可在此连接器的 pom.xml
其他 资源
有关最新 JDBC 驱动程序版本信息,请参见 GitHub.com 上适用于 Vertica 连接器的 pom.xml
有关此连接器的更多信息,请参阅 GitHub.com 上的相应站点