为 AWS S3 表创建 Iceberg REST Catalog
本文介绍如何在 StarRocks 中创建 Iceberg REST Catalog,以便通过 AWS Glue Iceberg REST 端点访问 AWS S3 表中的数据。
AWS Glue Iceberg REST 端点实现了 Iceberg REST Catalog Open API 规范,该规范为与 Iceberg 表交互提供了标准化接口。要使用此端点访问 S3 表,您需要通过组合 IAM 策略和 AWS Lake Formation 授权来配置凭据。以下部分将指导您完成访问权限设置,包括定义所需的策略、建立数据库和表级别的 Lake Formation 权限,以及使用 StarRocks 创建 Iceberg REST catalog 以访问 S3 表。
(可选)创建表存储桶
如果您已经有 S3 表的表存储桶,则可以跳过此步骤。
- 以具有管理员权限的用户身份登录到 Amazon S3 控制台。
- 在页面右上角,选择您的 AWS 区域。
- 在左侧导航窗格中,从导航面板中选择 表存储桶。
- 单击 创建表存储桶 以创建一个表存储桶。
- 创建表存储桶后,选择它并单击 使用 Athena 创建表。
- 创建一个命名空间。
- 创建命名空间后,再次单击 使用 Athena 创建表 以创建一个表。
注意
您可以使用 Athena 创建数据库和表,然后使用 StarRocks 查询它们。或者,您可以只创建一个表存储桶,然后使用 StarRocks 创建数据库和表。
创建 IAM 策略
要通过 AWS Glue 端点访问 S3 表,请创建一个 IAM 策略,其中包含 AWS Glue 和 Lake Formation 操作的权限。
- 以具有管理员权限的用户身份登录到 Amazon IAM 控制台。
- 在页面右上角,选择您的 AWS 区域。
- 在左侧导航窗格中,从导航面板中选择 策略。
- 选择 创建策略,在策略编辑器中选择 JSON。
- 添加以下策略以授予对 AWS Glue 和 Lake Formation 操作的访问权限。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"glue:GetCatalog",
"glue:GetDatabase",
"glue:GetDatabases",
"glue:GetTable",
"glue:GetTables",
"glue:CreateTable",
"glue:UpdateTable"
],
"Resource": [
"arn:aws:glue:<region>:<account-id>:catalog",
"arn:aws:glue:<region>:<account-id>:catalog/s3tablescatalog",
"arn:aws:glue:<region>:<account-id>:catalog/s3tablescatalog/<s3_table_bucket_name>",
"arn:aws:glue:<region>:<account-id>:table/s3tablescatalog/<s3_table_bucket_name>/<namespace>/*",
"arn:aws:glue:<region>:<account-id>:database/s3tablescatalog/<s3_table_bucket_name>/<namespace>"
]
},
{
"Effect": "Allow",
"Action": [
"lakeformation:GetDataAccess"
],
"Resource": "*"
}
]
}
创建 IAM 策略后,将其附加到目标 IAM 用户
- 从导航面板中选择 用户。
- 选择需要 S3 表访问权限的用户。
- 单击 添加权限 并选择 直接附加策略。
- 附加新创建的策略。
通过 Lake Formation 管理权限
要访问 S3 表,StarRocks 需要 Lake Formation 首先设置权限,以允许第三方查询引擎访问 S3 表。
- 以具有管理员权限的用户身份登录到 Lake Formation 控制台。
- 在页面右上角,选择您的 AWS 区域。
- 在左侧导航窗格中,从导航面板中选择 应用程序集成设置。
- 选择 允许外部引擎访问 Amazon S3 位置中的数据,并具有完全表访问权限。
接下来,授予上述 IAM 用户在 Lake Formation 中的访问权限。
- 在 Lake Formation 控制台 的左侧导航窗格中,从导航面板中选择 数据权限。
- 单击 授权。
- 在 主体 部分中,选择 IAM 用户和角色,然后从 IAM 用户和角色 下拉列表中选择授权的 IAM 用户。
- 在 LF 标签或目录资源 部分中,选择 命名数据目录资源,然后在 目录 下拉列表中选择您创建的表存储桶。
- 在 目录权限 部分中,为 目录权限 选择 超级。
- 单击 授权。
注意
在此,为方便测试而授予了超级权限。您需要根据生产环境中的实际需求分配适当的权限。
创建 Iceberg REST Catalog
在 StarRocks 中创建 Iceberg REST catalog
CREATE EXTERNAL CATALOG starrocks_lakehouse_s3tables PROPERTIES(
"type"="iceberg",
"iceberg.catalog.type" = "rest",
"iceberg.catalog.uri" = "https://glue.<region>.amazonaws.com/iceberg",
"iceberg.catalog.rest.sigv4-enabled" = "true",
"iceberg.catalog.rest.signing-name" = "glue",
"iceberg.catalog.rest.access-key-id" = "<iam_user_access_key>",
"iceberg.catalog.rest.secret-access-key" = "<iam_user_secret_key>",
"iceberg.catalog.warehouse" = "<accountid>:s3tablescatalog/<table-bucket-name>",
"aws.s3.region" = "<region>"
);
然后,您可以在其中创建数据库和表并运行查询。
示例
-- Switch to the catalog
StarRocks> SET CATALOG starrocks_lakehouse_s3tables;
-- Create database
StarRocks> CREATE DATABASE s3table_db;
Query OK, 0 rows affected
-- Switch database
StarRocks> USE s3table_db;
Database changed
-- Create table
StarRocks> CREATE TABLE taxis (
trip_id BIGINT,
trip_distance FLOAT,
fare_amount DOUBLE,
store_and_fwd_flag STRING,
vendor_id BIGINT
) PARTITION BY (vendor_id);
Query OK, 0 rows affected
-- Insert data
StarRocks> INSERT INTO taxis
VALUES (1000371, 1.8, 15.32, 'N', 1),
(1000372, 2.5, 22.15, 'N', 2),
(1000373, 0.9, 9.01, 'N', 2),
(1000374, 8.4, 42.13, 'Y', 1);
Query OK, 4 rows affected
-- Query data
StarRocks> SELECT * FROM taxis;
+---------+---------------+-------------+--------------------+-----------+
| trip_id | trip_distance | fare_amount | store_and_fwd_flag | vendor_id |
+---------+---------------+-------------+--------------------+-----------+
| 1000372 | 2.5 | 22.15 | N | 2 |
| 1000373 | 0.9 | 9.01 | N | 2 |
| 1000371 | 1.8 | 15.32 | N | 1 |
| 1000374 | 8.4 | 42.13 | Y | 1 |
+---------+---------------+-------------+--------------------+-----------+
4 rows in set