Iceberg catalog
此示例使用了在 StarRocks Basics 快速入门中介绍的本地气候数据 (LCD) 数据集。您可以导入数据并亲自尝试该示例。
Iceberg catalog 是一种外部 catalog,从 StarRocks v2.4 开始支持。使用 Iceberg catalog,您可以:
- 直接查询存储在 Iceberg 中的数据,无需手动创建表。
- 使用 INSERT INTO 或异步物化视 图(从 v2.5 开始支持)来处理存储在 Iceberg 中的数据,并将数据导入到 StarRocks 中。
- 在 StarRocks 上执行操作以创建或删除 Iceberg 数据库和表,或使用 INSERT INTO 将 StarRocks 表中的数据下沉到 Parquet 格式的 Iceberg 表中(此功能从 v3.1 开始支持)。
为了确保在 Iceberg 集群上的 SQL 工作负载成功,您的 StarRocks 集群必须能够访问 Iceberg 集群的存储系统和元存储。StarRocks 支持以下存储系统和元存储:
-
分布式文件系统(HDFS)或对象存储,如 AWS S3、Microsoft Azure Storage、Google GCS 或其他 S3 兼容的存储系统(例如 MinIO)
-
元存储如 Hive metastore、AWS Glue 或 Tabular
- 如果选择 AWS S3 作为存储,可以使用 HMS 或 AWS Glue 作为元存储。如果选择其他存储系统,则只能使用 HMS 作为元存储。
- 如果选择 Tabular 作为元存储,则需要使用 Iceberg REST catalog。
使用注意事项
使用 StarRocks 查询 Iceberg 数据时,请注意以下几点:
| 文件格式 | 压缩格式 | Iceberg 表版本 |
|---|---|---|
| Parquet | SNAPPY, LZ4, ZSTD, GZIP, 和 NO_COMPRESSION |
|
| ORC | ZLIB, SNAPPY, LZO, LZ4, ZSTD, 和 NO_COMPRESSION |
|
集成准备
在创建 Iceberg catalog 之前,请确保您的 StarRocks 集群可以与 Iceberg 集群的存储系统和元存储集成。
存储
选择与您的存储类型匹配的选项卡:
- AWS S3
- HDFS
如果您的 Iceberg 集群使用 AWS S3 作为存储或 AWS Glue 作为元存储,请选择合适的身份验证方法并进行必要的准备,以确保您的 StarRocks 集群可以访问相关的 AWS 云资源。
推荐以下身份验证方法:
- 实例配置文件
- 假设角色
- IAM 用户
在上述三种身份验证方法中,实例配置文件是最广泛使用的。
有关更多信息,请参见 AWS IAM 中的身份验证准备。
如果选择 HDFS 作为存储,请按以下步骤配置您的 StarRocks 集群:
-
(可选)设置用于访问 HDFS 集群和 Hive metastore 的用户名。默认情况下,StarRocks 使用 FE 和 BE 或 CN 进程的用户名来访问 HDFS 集群和 Hive metastore。您还可以通过在每个 FE 的 fe/conf/hadoop_env.sh 文件的开头以及每个 BE 的 be/conf/hadoop_env.sh 文件或每个 CN 的 cn/conf/hadoop_env.sh 文件的开头添加
export HADOOP_USER_NAME="<user_name>"来设置用户名。设置完这些文件中的用户名后,重启每个 FE 和每个 BE 或 CN 以使参数设置生效。每个 StarRocks 集群只能设置一个用户名。 -
当您查询 Iceberg 数据时,StarRocks 集群的 FEs 和 BEs 或 CNs 使用 HDFS 客户端访问您的 HDFS 集群。在大多数情况下,您不需要配置 StarRocks 集群即可实现此目的,StarRocks 使用默认配置启动 HDFS 客户端。您只需在以下情况下配置 StarRocks 集群:
- 您的 HDFS 集群启用了高可用性(HA):将 HDFS 集群的 hdfs-site.xml 文件添加到每个 FE 的 $FE_HOME/conf 路径以及每个 BE 的 $BE_HOME/conf 路径或每个 CN 的 $CN_HOME/conf 路径。
- 您的 HDFS 集群启用了文件系统视图(ViewFs):将 HDFS 集群的 core-site.xml 文件添加到每个 FE 的 $FE_HOME/conf 路径以及每个 BE 的 $BE_HOME/conf 路径或每个 CN 的 $CN_HOME/conf 路径。
如果在发送查询时返回未知主机错误,您必须将 HDFS 集群节点的主机名和 IP 地址映射添加到 /etc/hosts 路径。
Kerberos 身份验证
如果您的 HDFS 集群或 Hive metastore 启用了 Kerberos 身份验证,请按以下步骤配置您的 StarRocks 集群:
- 在每个 FE 和每个 BE 或 CN 上运行
kinit -kt keytab_path principal命令,从密钥分发中心(KDC)获取票证授予票证(TGT)。要运行此命令,您必须具有访问 HDFS 集群和 Hive metastore 的 权限。请注意,使用此命令访问 KDC 是时间敏感的。因此,您需要使用 cron 定期运行此命令。 - 将
JAVA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf"添加到每个 FE 的 $FE_HOME/conf/fe.conf 文件以及每个 BE 的 $BE_HOME/conf/be.conf 文件或每个 CN 的 $CN_HOME/conf/cn.conf 文件中。在此示例中,/etc/krb5.conf是 krb5.conf 文件的保存路径。您可以根据需要修改路径。
创建 Iceberg catalog
语法
CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
"type" = "iceberg",
[SecurityParams],
MetastoreParams,
StorageCredentialParams,
MetadataRelatedParams
)
参数
catalog_name
Iceberg catalog 的名称。命名约定如下:
- 名称可以包含字母、数字(0-9)和下划线(_)。必须以字母开头。
- 名称区分大小写,长度不能超过 1023 个字符。
comment
Iceberg catalog 的描述。此参数是可选的。
type
数据源的类型。将值设置为 iceberg。
SecurityParams
关于 StarRocks 如何管理 Catalog 数据访问的参数。
有关管理 Iceberg REST Catalog 数据访问的详细说明,请参阅Iceberg REST Catalog 的安全设置。
catalog.access.control
数据访 问控制策略。有效值:
native(默认):使用 StarRocks 内置的数据访问控制系统。allowall:所有数据访问检查均委托给 Catalog 本身处理。ranger:数据访问检查委托给 Apache Ranger 处理。
MetastoreParams
关于 StarRocks 如何与数据源的元存储集成的一组参数。选择与您的元存储类型匹配的选项卡:
- Hive metastore
- AWS Glue
- REST
- JDBC
Hive metastore
如果选择 Hive metastore 作为数据源的元存储,请按以下方式配置 MetastoreParams:
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "<hive_metastore_uri>"
在查询 Iceberg 数据之前,必须将 Hive metastore 节点的主机名和 IP 地址映射添加到 /etc/hosts 路径。否则,StarRocks 在启动查询时可能无法访问 Hive metastore。
下表描述了您需要在 MetastoreParams 中配置的参数。
iceberg.catalog.type
必需:是
描述:您用于 Iceberg 集群的元存储类型。将值设置为 hive。
hive.metastore.uris
必需:是
描述:Hive metastore 的 URI。格式:thrift://<metastore_IP_address>:<metastore_port>。
如果 Hive metastore 启用了高可用性(HA),您可以指定多个 metastore URI,并用逗号(,)分隔,例如 "thrift://<metastore_IP_address_1>:<metastore_port_1>,thrift://<metastore_IP_address_2>:<metastore_port_2>,thrift://<metastore_IP_address_3>:<metastore_port_3>"。
AWS Glue
如果选择 AWS Glue 作为数据源的元存储,仅在选择 AWS S3 作为存储时支持,请采取以下措施之一:
-
要选择基于实例配置文件的身份验证方法,请按以下方式配置
MetastoreParams:"iceberg.catalog.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.region" = "<aws_glue_region>" -
要选择基于假设角色的身份验证方法,请按以下方式配置
MetastoreParams:"iceberg.catalog.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.iam_role_arn" = "<iam_role_arn>",
"aws.glue.region" = "<aws_glue_region>" -
要选择基于 IAM 用户的身份验证方法,请按以下方式配置
MetastoreParams:"iceberg.catalog.type" = "glue",
"aws.glue.use_instance_profile" = "false",
"aws.glue.access_key" = "<iam_user_access_key>",
"aws.glue.secret_key" = "<iam_user_secret_key>",
"aws.glue.region" = "<aws_s3_region>"
AWS Glue 的 MetastoreParams:
iceberg.catalog.type
必需:是
描述:您用于 Iceberg 集群的元存储类型。将值设置为 glue。
aws.glue.use_instance_profile
必需:是
描述:指定是否启用基于实例配置文件的身份验证方法和基于假设角色的身份验证方法。有效值:true 和 false。默认值:false。
aws.glue.iam_role_arn
必需:否 描述:在 AWS Glue Data Catalog 上具有权限的 IAM 角色的 ARN。如果使用基于假设角色的身份验证方法访问 AWS Glue,则必须指定此参数。
aws.glue.region
必需:是
描述:您的 AWS Glue Data Catalog 所在的区域。例如:us-west-1。
aws.glue.access_key
必需:否 描述:您的 AWS IAM 用户的访问密钥。如果使用基于 IAM 用户的身份验证方法访问 AWS Glue,则必须指定此参数。
aws.glue.secret_key
必需:否 描述:您的 AWS IAM 用户的秘密密钥。如果使用基于 IAM 用户的身份验证方法访问 AWS Glue,则必须指定此参数。
aws.glue.catalog_id
必需:否 描述:要使用的 AWS Glue Data Catalog 的 ID。未指定时,使用当前 AWS 账户的 Data Catalog。当需要访问其他 AWS 账户中的 Glue Data Catalog(跨账户访问)时,必须指定此参数。
有关如何选择访问 AWS Glue 的身份验证方法以及如何在 AWS IAM 控制台中配置访问控制策略的信息,请参见 访问 AWS Glue 的身份验证参数。
REST
有关为 S3 表创建 Iceberg REST catalog 的详细说明,请参见 为 AWS S3 表创建 Iceberg REST Catalog。
如果使用 REST 作为元存储,必须将元存储类型指定为 REST("iceberg.catalog.type" = "rest")。按以下方式配置 MetastoreParams:
"iceberg.catalog.type" = "rest",
"iceberg.catalog.uri" = "<rest_server_api_endpoint>",
"iceberg.catalog.security" = "oauth2",
"iceberg.catalog.oauth2.credential" = "<credential>",
"iceberg.catalog.warehouse" = "<identifier_or_path_to_warehouse>"
REST catalog 的 MetastoreParams:
iceberg.catalog.type
必需:是
描述:您用于 Iceberg 集群的元存储类型。将值设置为 rest。
iceberg.catalog.uri
必需:是
描述:REST 服务端点的 URI。例如:https://api.tabular.io/ws。
iceberg.catalog.view-endpoints-supported
必需:否
描述:是否使用视图端点支持与视图相关的操作,当早期版本的 REST 服务不在 CatalogConfig 中返回端点时使用。此参数用于与早期版本的 REST 服务器的向后兼容。默认值:false。
iceberg.catalog.security
必需:否
描述:要使用的授权协议类型。默认值:NONE。有效值:OAUTH2,需要 token 或 credential。
iceberg.catalog.oauth2.token
必需:否
描述:用于与服务器交互的承载令牌。OAUTH2 授权协议需要 token 或 credential。例如:AbCdEf123456。
iceberg.catalog.oauth2.credential
必需:否
描述:用于在与服务器的 OAuth2 客户端凭证流中交换令牌的凭证。OAUTH2 授权协议需要 token 或 credential。例如:AbCdEf123456。
iceberg.catalog.oauth2.scope
必需:否
描述:与 REST Catalog 通信时使用的范围。仅在使用 credential 时适用。
iceberg.catalog.oauth2.server-uri
必需:否
描述:从 OAuth2 服务器检索访问令牌的端点。
iceberg.catalog.vended-credentials-enabled
必需:否
描述:是否使用 REST 后端提供的凭证进行文件系统访问。默认值:true。
iceberg.catalog.warehouse
必需:否
描述:Iceberg catalog 的仓库位置或标识符。例如:s3://my_bucket/warehouse_location 或 sandbox。
iceberg.catalog.rest.nested-namespace-enabled
必需:否
描述:是否支持查询嵌套命名空间下的对象。默认值:false。
以下示例创建了一个名为 tabular 的 Iceberg catalog,使用 Tabular 作为元存储:
CREATE EXTERNAL CATALOG tabular
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "rest",
"iceberg.catalog.uri" = "https://api.tabular.io/ws",
"iceberg.catalog.oauth2.credential" = "t-5Ii8e3FIbT9m0:aaaa-3bbbbbbbbbbbbbbbbbbb",
"iceberg.catalog.warehouse" = "sandbox"
);
以下示例创建了一个名为 smith_polaris 的 Iceberg catalog,使用 Polaris 作为元存储:
CREATE EXTERNAL CATALOG smith_polaris
PROPERTIES (
"iceberg.catalog.uri" = "http://xxx.xx.xx.xxx:8181/api/catalog",
"type" = "iceberg",
"iceberg.catalog.type" = "rest",
"iceberg.catalog.warehouse" = "starrocks_catalog",
"iceberg.catalog.security" = "oauth2",
"iceberg.catalog.oauth2.credential" = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"iceberg.catalog.oauth2.scope"='PRINCIPAL_ROLE:ALL'
);
# `ns1.ns2.tpch_namespace` 是一个嵌套命名空间
create table smith_polaris.`ns1.ns2.tpch_namespace`.tbl (c1 string);
mysql> select * from smith_polaris.`ns1.ns2.tpch_namespace`.tbl;
+------+
| c1 |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.34 sec)
以下示例创建了一个名为 r2 的 Iceberg catalog,使用 Cloudflare R2 Data Catalog 作为元存储:
CREATE EXTERNAL CATALOG r2
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "rest",
"iceberg.catalog.uri" = "<r2_catalog_uri>",
"iceberg.catalog.security" = "oauth2",
"iceberg.catalog.oauth2.token" = "<r2_api_token>",
"iceberg.catalog.warehouse" = "<r2_warehouse_name>"
);
SET CATALOG r2;
CREATE DATABASE testdb;
SHOW DATABASES FROM r2;
+--------------------+
| Database |
+--------------------+
| information_schema |
| testdb |
+--------------------+
2 rows in set (0.66 sec)
<r2_warehouse_name>、<r2_api_token> 和 <r2_catalog_uri> 的值可以从 Cloudflare Dashboard 中获取,详细信息 请参见此处。
JDBC
如果选择 JDBC 作为数据源的元存储,请按以下方式配置 MetastoreParams:
"iceberg.catalog.type" = "jdbc",
"iceberg.catalog.uri" = "<jdbc_uri>",
"iceberg.catalog.warehouse" = "<warehouse_location>"
下表描述了您需要在 MetastoreParams 中配置的参数。
iceberg.catalog.type
必需:是
描述:您用于 Iceberg 集群的元存储类型。将值设置为 jdbc。
iceberg.catalog.uri
必需:是
描述:您的数据库的 URI。格式:jdbc:[mysql\|postgresql]://<DB_IP_address>:<DB_PORT>/<DB_NAME>。
iceberg.catalog.warehouse
必需:是
描述:Iceberg catalog 的仓库位置或标识符。例如:s3://my_bucket/warehouse_location。
iceberg.catalog.jdbc.user
必需:否
描述:数据库的用户名。
iceberg.catalog.jdbc.password
必需:否
描述:数据库的密码。
iceberg.catalog.jdbc.init-catalog-tables
必需:否
描述:是否在 iceberg.catalog.uri 指定的数据库中创建用于存储元数据的表 iceberg_namespace_properties 和 iceberg_tables,默认值为false。当iceberg.catalog.uri 指定的数据库中尚未创建上述两张表时需要指定为true。
以下示例创建了一个名为 iceberg_jdbc 的 Iceberg catalog,并使用 JDBC 作为元存储:
CREATE EXTERNAL CATALOG iceberg_jdbc
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "jdbc",
"iceberg.catalog.warehouse" = "s3://my_bucket/warehouse_location",
"iceberg.catalog.uri" = "jdbc:mysql://ip:port/db_name",
"iceberg.catalog.jdbc.user" = "username",
"iceberg.catalog.jdbc.password" = "password",
"aws.s3.endpoint" = "<s3_endpoint>",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>"
);
若使用MySQL或其他自定义的JDBC驱动程序,需要将相应的JAR包放置于 fe/lib 和 be/lib/jni-packages 目录下。
StorageCredentialParams
关于 StarRocks 如何与您的存储系统集成的一组参数。此参数集是可选的。
注意以下几点:
-
如果您使用 HDFS 作为存储,则无需配置
StorageCredentialParams,可以跳过此部分。如果您使用 AWS S3、其他 S3 兼容的存储系统、Microsoft Azure Storage 或 Google GCS 作为存储,则必须配置StorageCredentialParams。 -
如果您使用 Tabular 作为元存储,则无需配置
StorageCredentialParams,可以跳过此部分。如果您使用 HMS 或 AWS Glue 作为元存储,则必须配置StorageCredentialParams。
选择与您的存储类型匹配的选项卡:
- AWS S3
- HDFS
- MinIO
- Microsoft Azure Blob Storage
- Google GCS
AWS S3
如果选择 AWS S3 作为 Iceberg 集群的存储,请采取以下措施之一:
-
要选择基于实例配置文件的身份验证方法,请按以下方式配置
StorageCredentialParams:"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "<aws_s3_region>" -
要选择基于假设角色的身份验证方法,请按以下方式配置
StorageCredentialParams:"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "<iam_role_arn>",
"aws.s3.region" = "<aws_s3_region>" -
要选择基于 IAM 用户的身份验证方法,请按以下方式配置
StorageCredentialParams:"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>",
"aws.s3.region" = "<aws_s3_region>"
AWS S3 的 StorageCredentialParams:
aws.s3.use_instance_profile
必需:是
描述:指定是否启用基于实例配置文件的身份验证方法和基于假设角色的身份验证方法。有效值:true 和 false。默认值:false。
aws.s3.iam_role_arn
必需:否 描述:在您的 AWS S3 存储桶上具有权限的 IAM 角色的 ARN。如果使用基于假设角色的身份验证方法访问 AWS S3,则必须指定此参数。
aws.s3.region
必需:是
描述:您的 AWS S3 存储桶所在的区域。例如:us-west-1。
aws.s3.access_key
必需:否 描述:您的 IAM 用户的访问密钥。如果使用基于 IAM 用户的身份验证方法访问 AWS S3,则必须指定此参数。
aws.s3.secret_key
必需:否 描述:您的 IAM 用户的秘密密钥。如果使用基于 IAM 用户的身份验证方法访问 AWS S3,则必须指定此参数。
有关如何选择访问 AWS S3 的身份验证方法以及如何在 AWS IAM 控制台中配置访问控制策略的信息,请参见 访问 AWS S3 的身份验证参数。
使用 HDFS 存储时跳过存储凭证。
S3 兼容的存储系统
从 v2.5 开始,Iceberg catalog 支持 S3 兼容的存储系统。
如果选择 S3 兼容的存储系统,例如 MinIO,作为 Iceberg 集群的存储,请按以下方式配置 StorageCredentialParams 以确保成功集成:
"aws.s3.enable_ssl" = "false",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "<s3_endpoint>",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_secret_key>"
MinIO 和其他 S3 兼容系统的 StorageCredentialParams:
aws.s3.enable_ssl
必需:是
描述:指定是否启用 SSL 连接。
有效值:true 和 false。默认值:true。
aws.s3.enable_path_style_access
必需:是
描述:指定是否启用路径样式访问。
有效值:true 和 false。默认值:false。对于 MinIO,您必须将值设置为 true。
路径样式 URL 使用以下格式:https://s3.<region_code>.amazonaws.com/<bucket_name>/<key_name>。例如,如果您在美国西部(俄勒冈)区域创建了一个名为 DOC-EXAMPLE-BUCKET1 的存储桶,并且您想要访问该存储桶中的 alice.jpg 对象,可以使用以下路径样式 URL:https://s3.us-west-2.amazonaws.com/DOC-EXAMPLE-BUCKET1/alice.jpg。
aws.s3.endpoint
必需:是 描述:用于连接到您的 S3 兼容存储系统而不是 AWS S3 的端点。
aws.s3.access_key
必需:是 描述:您的 IAM 用户的访问密钥。
aws.s3.secret_key
必需:是 描述:您的 IAM 用户的秘密密钥。
Microsoft Azure Storage
从 v3.0 开始,Iceberg catalog 支持 Microsoft Azure Storage。
Azure Blob Storage
如果选择 Blob Storage 作为 Iceberg 集群的存储,请采取以下措施之一:
-
要选择共享密钥身份验证方法,请按以下方式配置
StorageCredentialParams:"azure.blob.storage_account" = "<storage_account_name>",
"azure.blob.shared_key" = "<storage_account_shared_key>" -
要选择 SAS 令牌身份验证方法,请按以下方式配置
StorageCredentialParams