Iceberg Catalog
本示例使用 StarRocks 基础快速入门中的 Local Climatological Data(LCD) 数据集。您可以加载数据并自行尝试该示例。
Iceberg catalog 是 StarRocks v2.4 起支持的一种外部 Catalog。借助 Iceberg catalog,您可以:
- 直接查询 Iceberg 中存储的数据,无需手动创建表。
- 使用 INSERT INTO 或异步物化视图(v2.5 起支持)处理 Iceberg 中存储的数据,并将数据加载到 StarRocks 中。
- 通过 StarRocks 执行操作来创建或删除 Iceberg 数据库和表,或者通过使用 INSERT INTO 将 StarRocks 表中的数据 Sink 到 Parquet 格式的 Iceberg 表中(此功能从 v3.1 起支持)。
为确保 Iceberg 集群上的 SQL 工作负载成功,您的 StarRocks 集群必须能够访问 Iceberg 集群的存储系统和 Metastore。StarRocks 支持以下存储系统和 Metastore:
-
分布式文件系统(HDFS)或对象存储,如 AWS S3、Microsoft Azure Storage、Google GCS 或其他 S3 兼容的存储系统(例如,MinIO)
-
Metastore,如 Hive metastore、AWS Glue 或 Tabular
- 如果您选择 AWS S3 作为存储,则可以使用 HMS 或 AWS Glue 作为 Metastore。如果您选择任何其他存储系统,则只能使用 HMS 作为 Metastore。
- 如果选择 Tabular 作为 Metastore,则需要使用 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 集群的存储系统和 Metastore 集成。
存储
选择与您的存储类型匹配的选项卡
- AWS S3
- HDFS
如果您的 Iceberg 集群使用 AWS S3 作为存储或 AWS Glue 作为 Metastore,请选择合适的身份验证方法并进行必要的准备,以确保您的 StarRocks 集群可以访问相关的 AWS 云资源。
建议使用以下身份验证方法
- 实例配置文件
- Assume Role
- 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="
来设置用户名。在这些文件中设置用户名后,重启每个 FE 和每个 BE 或 CN 以使参数设置生效。每个 StarRocks 集群只能设置一个用户名。" -
查询 Iceberg 数据时,StarRocks 集群的 FE 和 BE 或 CN 使用 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 集群启用了 View File System (ViewFs):将 HDFS 集群的 core-site.xml 文件添加到每个 FE 的 $FE_HOME/conf 路径和每个 BE 的 $BE_HOME/conf 路径或每个 CN 的 $CN_HOME/conf 路径。
如果在发送查询时返回指示未知主机的错误,则必须将您的 HDFS 集群节点的 hostname 和 IP 地址之间的映射添加到 /etc/hosts 路径。
Kerberos 身份验证
如果您的 HDFS 集群或 Hive Metastore 启用了 Kerberos 身份验证,请按如下方式配置您的 StarRocks 集群
- 在每个 FE 和每个 BE 或 CN 上运行
kinit -kt keytab_path principal
命令,以从 Key Distribution Center (KDC) 获取 Ticket Granting Ticket (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",
MetastoreParams,
StorageCredentialParams,
MetadataUpdateParams
)
参数
catalog_name
Iceberg catalog 的名称。命名约定如下:
- 该名称可以包含字母、数字 (0-9) 和下划线 (_)。它必须以字母开头。
- 该名称区分大小写,长度不能超过 1023 个字符。
comment
Iceberg catalog 的描述。此参数为可选。
type
数据源的类型。将值设置为 iceberg
。
MetastoreParams
关于 StarRocks 如何与数据源的 Metastore 集成的一组参数。选择与您的 Metastore 类型匹配的选项卡
- Hive Metastore
- AWS Glue
- REST
- JDBC
Hive Metastore
如果您选择 Hive Metastore 作为数据源的 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 集群的 Metastore 类型。将值设置为
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 作为数据源的 Metastore,这仅在您选择 AWS S3 作为存储时才支持,请执行以下操作之一
-
要选择基于实例配置文件的身份验证方法,请按如下方式配置
MetastoreParams
"iceberg.catalog.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.region" = "<aws_glue_region>" -
要选择基于 Assume Role 的身份验证方法,请按如下方式配置
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 集群的 Metastore 类型。将值设置为
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 的身份验证方法以及如何在 AWS IAM 控制台中配置访问控制策略的信息,请参阅 用于访问 AWS Glue 的身份验证参数。
REST
有关创建 S3 表的 Iceberg REST Catalog 的详细说明,请参阅 创建 AWS S3 表的 Iceberg REST Catalog。
如果使用 REST 作为 Metastore,则必须将 Metastore 类型指定为 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 集群的 Metastore 类型。将值设置为
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 Server 检索访问令牌的端点。
-
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,该 Catalog 使用 Tabular 作为 Metastore
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,该 Catalog 使用 Polaris 作为 Metastore
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` is a nested 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,该 Catalog 使用 Cloudflare R2 Data Catalog 作为 Metastore
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 仪表板(此处详述)获取。
JDBC
如果选择 JDBC 作为数据源的 Metastore,请配置 MetastoreParams
如下:
"iceberg.catalog.type" = "jdbc",
"iceberg.catalog.uri" = "<jdbc_uri>",
"iceberg.catalog.warehouse" = "<warehouse_location>"
下表描述了您需要在 MetastoreParams
中配置的参数。
-
iceberg.catalog.type
- 是否必须:是
- 描述:用于 Iceberg 集群的 Metastore 类型。将值设置为
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_jdbc
的 Iceberg Catalog,并使用 JDBC 作为 Metastore
CREATE EXTERNAL CATALOG iceberg_jdbc
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "jdbc",
"iceberg.catalog.warehouse" = "hdfs:///jdbc_iceberg/warehouse/ ",
"iceberg.catalog.uri" = "jdbc:mysql://ip:port/db_name",
"iceberg.catalog.jdbc.user" = "username",
"iceberg.catalog.jdbc.password" = "password"
);
StorageCredentialParams
一组关于 StarRocks 如何与您的存储系统集成的参数。此参数集是可选的。
请注意以下几点:
-
如果使用 HDFS 作为存储,则无需配置
StorageCredentialParams
,可以跳过此部分。如果使用 AWS S3、其他 S3 兼容的存储系统、Microsoft Azure Storage 或 Google GCS 作为存储,则必须配置StorageCredentialParams
。 -
如果使用 Tabular 作为 Metastore,则无需配置
StorageCredentialParams
,可以跳过此部分。如果使用 HMS 或 AWS Glue 作为 Metastore,则必须配置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 兼容的存储系统
Iceberg catalog 从 v2.5 开始支持 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
Iceberg Catalog 从 v3.0 开始支持 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
"azure.blob.storage_account" = "<storage_account_name>",
"azure.blob.container" = "<container_name>",
"azure.blob.sas_token" = "<storage_account_SAS_token>"
Microsoft Azure 的 StorageCredentialParams
azure.blob.storage_account
是否必须:是 描述:Blob Storage 帐户的用户名。
azure.blob.shared_key
是否必须:是 描述:Blob Storage 帐户的共享密钥。
azure.blob.account_name
是否必须:是 描述:Blob Storage 帐户的用户名。
azure.blob.container
是否必须:是 描述:存储数据的 blob 容器的名称。
azure.blob.sas_token
是否必须:是 描述:用于访问 Blob Storage 帐户的 SAS 令牌。
Azure Data Lake Storage Gen1
如果选择 Data Lake Storage Gen1 作为 Iceberg 集群的存储,请执行以下操作之一:
-
要选择托管服务标识身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls1.use_managed_service_identity" = "true"
或
-
要选择服务主体身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls1.oauth2_client_id" = "<application_client_id>",
"azure.adls1.oauth2_credential" = "<application_client_credential>",
"azure.adls1.oauth2_endpoint" = "<OAuth_2.0_authorization_endpoint_v2>"
Azure Data Lake Storage Gen2
如果选择 Data Lake Storage Gen2 作为 Iceberg 集群的存储,请执行以下操作之一:
-
要选择托管标识身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls2.oauth2_use_managed_identity" = "true",
"azure.adls2.oauth2_tenant_id" = "<service_principal_tenant_id>",
"azure.adls2.oauth2_client_id" = "<service_client_id>"或
-
要选择共享密钥身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls2.storage_account" = "<storage_account_name>",
"azure.adls2.shared_key" = "<storage_account_shared_key>"或
-
要选择服务主体身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls2.oauth2_client_id" = "<service_client_id>",
"azure.adls2.oauth2_client_secret" = "<service_principal_client_secret>",
"azure.adls2.oauth2_client_endpoint" = "<service_principal_client_endpoint>"
Google GCS
Iceberg Catalog 从 v3.0 开始支持 Google GCS。
如果选择 Google GCS 作为 Iceberg 集群的存储,请执行以下操作之一:
-
要选择基于 VM 的身份验证方法,请按如下方式配置
StorageCredentialParams
"gcp.gcs.use_compute_engine_service_account" = "true"
-
要选择基于服务帐户的身份验证方法,请按如下方式配置
StorageCredentialParams
"gcp.gcs.service_account_email" = "<google_service_account_email>",
"gcp.gcs.service_account_private_key_id" = "<google_service_private_key_id>",
"gcp.gcs.service_account_private_key" = "<google_service_private_key>" -
要选择基于模拟的身份验证方法,请按如下方式配置
StorageCredentialParams
-
使 VM 实例模拟服务帐户
"gcp.gcs.use_compute_engine_service_account" = "true",
"gcp.gcs.impersonation_service_account" = "<assumed_google_service_account_email>" -
使服务帐户(暂时命名为 meta service account)模拟另一个服务帐户(暂时命名为 data service account)
"gcp.gcs.service_account_email" = "<google_service_account_email>",
"gcp.gcs.service_account_private_key_id" = "<meta_google_service_account_email>",
"gcp.gcs.service_account_private_key" = "<meta_google_service_account_email>",
"gcp.gcs.impersonation_service_account" = "<data_google_service_account_email>"
-
Google GCS 的 StorageCredentialParams
gcp.gcs.service_account_email
默认值:"" 示例:"user@hello.iam.gserviceaccount.com" 描述:在创建服务帐户时生成的 JSON 文件中的电子邮件地址。
gcp.gcs.service_account_private_key_id
默认值:"" 示例:"61d257bd8479547cb3e04f0b9b6b9ca07af3b7ea" 描述:在创建服务帐户时生成的 JSON 文件中的私钥 ID。
gcp.gcs.service_account_private_key
默认值:"" 示例:"-----BEGIN PRIVATE KEY----xxxx-----END PRIVATE KEY-----\n"
描述:在创建服务帐户时生成的 JSON 文件中的私钥。
gcp.gcs.impersonation_service_account
默认值:""
示例:"hello"
描述:要模拟的服务帐户。
MetadataUpdateParams
关于 StarRocks 如何更新 Iceberg 元数据缓存的一组参数。此参数集为可选。
从 v3.3.3 开始,StarRocks 支持定期元数据刷新策略。在大多数情况下,可以忽略 MetadataUpdateParams
,无需调整其中的策略参数,因为这些参数的默认值已经提供了开箱即用的性能。可以使用系统变量 plan_mode
调整 Iceberg 元数据解析模式。
参数 | 默认 | 描述 |
---|---|---|
enable_iceberg_metadata_cache | true | 是否缓存与 Iceberg 相关的元数据,包括 Table Cache、Partition Name Cache 以及 Manifest 中的 Data File Cache 和 Delete Data File Cache。 |
iceberg_manifest_cache_with_column_statistics | false | 是否缓存列的统计信息。 |
iceberg_manifest_cache_max_num | 100000 | 可以缓存的最大 Manifest 文件数。 |
refresh_iceberg_manifest_min_length | 2 * 1024 * 1024 | 触发 Data File Cache 刷新的最小 Manifest 文件长度。 |
示例
以下示例创建一个名为 iceberg_catalog_hms
或 iceberg_catalog_glue
的 Iceberg Catalog,具体取决于您使用的 Metastore 类型,以查询 Iceberg 集群中的数据。选择与您的存储类型匹配的选项卡
- AWS S3
- HDFS
- MinIO
- Microsoft Azure Blob Storage
- Google GCS
AWS S3
如果选择基于实例配置文件的凭据
-
如果在 Iceberg 集群中使用 Hive Metastore,请运行类似以下的命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-2"
); -
如果在 Amazon EMR Iceberg 集群中使用 AWS Glue,请运行类似以下的命令
CREATE EXTERNAL CATALOG iceberg_catalog_glue
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.region" = "us-west-2",
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-2"
);
如果选择基于假定角色的凭据
-
如果在 HIceberg 集群中使用 Hive Metastore,请运行类似以下的命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/test_s3_role",
"aws.s3.region" = "us-west-2"
); -
如果在 Amazon EMR Iceberg 集群中使用 AWS Glue,请运行类似以下的命令
CREATE EXTERNAL CATALOG iceberg_catalog_glue
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.iam_role_arn" = "arn:aws:iam::081976408565:role/test_glue_role",
"aws.glue.region" = "us-west-2",
"aws.s3.use_instance_profile" = "true",
"aws.s3.iam_role_arn" = "arn:aws:iam::081976408565:role/test_s3_role",
"aws.s3.region" = "us-west-2"
);
如果选择基于 IAM 用户的凭据
-
如果在 Iceberg 集群中使用 Hive Metastore,请运行类似以下的命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"aws.s3.use_instance_profile" = "false",
"aws.s3.access_key" = "<iam_user_access_key>",
"aws.s3.secret_key" = "<iam_user_access_key>",
"aws.s3.region" = "us-west-2"
); -
如果在 Amazon EMR Iceberg 集群中使用 AWS Glue,请运行类似以下的命令
CREATE EXTERNAL CATALOG iceberg_catalog_glue
PROPERTIES
(
"type" = "iceberg",
"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" = "us-west-2",
"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" = "us-west-2"
);
HDFS
如果您使用 HDFS 作为存储,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);
S3 兼容的存储系统
以 MinIO 为例。运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"aws.s3.enable_ssl" = "true",
"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>"
);
Microsoft Azure Storage
Azure Blob Storage
-
如果您选择 Shared Key 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.blob.storage_account" = "<blob_storage_account_name>",
"azure.blob.shared_key" = "<blob_storage_account_shared_key>"
); -
如果您选择 SAS Token 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.blob.storage_account" = "<blob_storage_account_name>",
"azure.blob.container" = "<blob_container_name>",
"azure.blob.sas_token" = "<blob_storage_account_SAS_token>"
);
Azure Data Lake Storage Gen1
-
如果您选择 Managed Service Identity 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.adls1.use_managed_service_identity" = "true"
); -
如果您选择 Service Principal 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.adls1.oauth2_client_id" = "<application_client_id>",
"azure.adls1.oauth2_credential" = "<application_client_credential>",
"azure.adls1.oauth2_endpoint" = "<OAuth_2.0_authorization_endpoint_v2>"
);
Azure Data Lake Storage Gen2
-
如果您选择 Managed Identity 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.adls2.oauth2_use_managed_identity" = "true",
"azure.adls2.oauth2_tenant_id" = "<service_principal_tenant_id>",
"azure.adls2.oauth2_client_id" = "<service_client_id>"
); -
如果您选择 Shared Key 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.adls2.storage_account" = "<storage_account_name>",
"azure.adls2.shared_key" = "<shared_key>"
); -
如果您选择 Service Principal 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.adls2.oauth2_client_id" = "<service_client_id>",
"azure.adls2.oauth2_client_secret" = "<service_principal_client_secret>",
"azure.adls2.oauth2_client_endpoint" = "<service_principal_client_endpoint>"
);
Google GCS
-
如果您选择基于 VM 的身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"gcp.gcs.use_compute_engine_service_account" = "true"
); -
如果您选择基于服务帐户的身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"gcp.gcs.service_account_email" = "<google_service_account_email>",
"gcp.gcs.service_account_private_key_id" = "<google_service_private_key_id>",
"gcp.gcs.service_account_private_key" = "<google_service_private_key>"
); -
如果您选择基于 Impersonation 的身份验证方法
-
如果您使 VM 实例模拟服务帐户,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"gcp.gcs.use_compute_engine_service_account" = "true",
"gcp.gcs.impersonation_service_account" = "<assumed_google_service_account_email>"
); -
如果您使服务帐户模拟另一个服务帐户,请运行如下命令
CREATE EXTERNAL CATALOG iceberg_catalog_hms
PROPERTIES
(
"type" = "iceberg",
"iceberg.catalog.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"gcp.gcs.service_account_email" = "<google_service_account_email>",
"gcp.gcs.service_account_private_key_id" = "<meta_google_service_account_email>",
"gcp.gcs.service_account_private_key" = "<meta_google_service_account_email>",
"gcp.gcs.impersonation_service_account" = "<data_google_service_account_email>"
);
-
使用您的 Catalog
查看 Iceberg catalog
您可以使用 SHOW CATALOGS 查询当前 StarRocks 集群中的所有 Catalog
SHOW CATALOGS;
还可以使用 SHOW CREATE CATALOG 查询外部 Catalog 的创建语句。以下示例查询名为 iceberg_catalog_glue
的 Iceberg Catalog 的创建语句
SHOW CREATE CATALOG iceberg_catalog_glue;
切换到 Iceberg Catalog 及其中的数据库
可以使用以下方法之一切换到 Iceberg Catalog 及其中的数据库:
-
使用 SET CATALOG 在当前会话中指定一个 Iceberg Catalog,然后使用 USE 指定一个活动的数据库
-- Switch to a specified catalog in the current session:
SET CATALOG <catalog_name>
-- Specify the active database in the current session:
USE <db_name> -
直接使用 USE 切换到 Iceberg Catalog 及其中的数据库
USE <catalog_name>.<db_name>
删除 Iceberg catalog
您可以使用 DROP CATALOG 删除外部 Catalog。
以下示例删除名为 iceberg_catalog_glue
的 Iceberg Catalog
DROP Catalog iceberg_catalog_glue;
查看 Iceberg 表的 schema
可以使用以下语法之一查看 Iceberg 表的 schema
-
查看 Schema
DESC[RIBE] <catalog_name>.<database_name>.<table_name>
-
从 CREATE 语句中查看 Schema 和 Location
SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>
查询 Iceberg 表
-
使用 SHOW DATABASES 查看 Iceberg 集群中的数据库
SHOW DATABASES FROM <catalog_name>
-
使用 SELECT 查询指定数据库中的目标表
SELECT count(*) FROM <table_name> LIMIT 10
创建 Iceberg 数据库
与 StarRocks 的内部 Catalog 类似,如果在 Iceberg Catalog 上具有 CREATE DATABASE 权限,则可以使用 CREATE DATABASE 语句在该 Iceberg Catalog 中创建数据库。此功能从 v3.1 开始支持。
切换到 Iceberg Catalog,然后使用以下语句在该 Catalog 中创建 Iceberg 数据库
CREATE DATABASE <database_name>
[PROPERTIES ("location" = "<prefix>://<path_to_database>/<database_name.db>/")]
可以使用 location
参数指定要在其中创建数据库的文件路径。支持 HDFS 和云存储。如果不指定 location
参数,StarRocks 将在 Iceberg Catalog 的默认文件路径中创建数据库。
prefix
的变化取决于您使用的存储系统
HDFS
Prefix
值:hdfs
Google GCS
Prefix
值:gs
Azure Blob Storage
Prefix
值
- 如果您的存储帐户允许通过 HTTP 访问,则
prefix
为wasb
。 - 如果您的存储帐户允许通过 HTTPS 访问,则
prefix
为wasbs
。
Azure Data Lake Storage Gen1
Prefix
值:adl
Azure Data Lake Storage Gen2
Prefix
值
- 如果您的存储帐户允许通过 HTTP 访问,则
prefix
为abfs
。 - 如果您的存储帐户允许通过 HTTPS 访问,则
prefix
为abfss
。
AWS S3 或其他 S3 兼容的存储(例如 MinIO)
Prefix
值:s3
删除 Iceberg 数据库
与 StarRocks 的内部数据库类似,如果在 Iceberg 数据库上具有 DROP 权限,则可以使用 DROP DATABASE 语句删除该 Iceberg 数据库。此功能从 v3.1 开始支持。只能删除空数据库。
删除 Iceberg 数据库时,数据库在 HDFS 集群或云存储上的文件路径不会随数据库一起删除。
切换到 Iceberg Catalog,然后使用以下语句删除该 Catalog 中的 Iceberg 数据库
DROP DATABASE <database_name>;
创建 Iceberg 表
与 StarRocks 的内部数据库类似,如果在 Iceberg 数据库上具有 CREATE TABLE 权限,则可以使用 CREATE TABLE 或 [CREATE TABLE AS SELECT ../../sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE_AS_SELECT.mdELECT.md) 语句在该 Iceberg 数据库中创建表。此功能从 v3.1 开始支持。
切换到 Iceberg Catalog 及其中的数据库,然后使用以下语法在该数据库中创建 Iceberg 表。
语法
CREATE TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...
partition_column_definition1,partition_column_definition2...])
[partition_desc]
[PROPERTIES ("key" = "value", ...)]
[AS SELECT query]
参数
column_definition
column_definition
的语法如下:
col_name col_type [COMMENT 'comment']
所有非分区列必须使用 NULL
作为默认值。这意味着必须为表创建语句中每个非分区列指定 DEFAULT "NULL"
。此外,分区列必须在非分区列之后定义,并且不能使用 NULL
作为默认值。
partition_desc
partition_desc
的语法如下:
PARTITION BY (par_col1[, par_col2...])
目前 StarRocks 仅支持 identity transforms,这意味着 StarRocks 为每个唯一的分区值创建一个分区。
分区列必须在非分区列之后定义。分区列支持除 FLOAT、DOUBLE、DECIMAL 和 DATETIME 之外的所有数据类型,并且不能使用 NULL
作为默认值。
PROPERTIES
可以在 PROPERTIES
中以 "key" = "value"
格式指定表属性。请参阅 Iceberg 表属性。
下表描述了几个关键属性。
location
描述:要在其中创建 Iceberg 表的文件路径。当使用 HMS 作为 Metastore 时,无需指定 location
参数,因为 StarRocks 将在当前 Iceberg Catalog 的默认文件路径中创建表。当使用 AWS Glue 作为 Metastore 时:
- 如果已为要在其中创建表的数据库指定了
location
参数,则无需为表指定location
参数。因此,表默认为其所属数据库的文件路径。 - 如果尚未为要在其中创建表的数据库指定
location
,则必须为表指定location
参数。
file_format
描述:Iceberg 表的文件格式。仅支持 Parquet 格式。默认值:parquet
。
compression_codec
描述:用于 Iceberg 表的压缩算法。支持的压缩算法有 SNAPPY、GZIP、ZSTD 和 LZ4。默认值:gzip
。此属性在 v3.2.3 中已弃用,自该版本起,用于将数据 Sink 到 Iceberg 表的压缩算法统一由会话变量 connector_sink_compression_codec 控制。
示例
-
创建一个名为
unpartition_tbl
的非分区表。该表由两列id
和score
组成,如下所示:CREATE TABLE unpartition_tbl
(
id int,
score double
); -
创建一个名为
partition_tbl_1
的分区表。该表包含三列,分别为action
、id
和dt
,其中id
和dt
被定义为分区列,如下所示:CREATE TABLE partition_tbl_1
(
action varchar(20),
id int,
dt date
)
PARTITION BY (id,dt); -
查询一个已存在的名为
partition_tbl_1
的表,并基于partition_tbl_1
的查询结果创建一个名为partition_tbl_2
的分区表。对于partition_tbl_2
,id
和dt
被定义为分区列,如下所示:CREATE TABLE partition_tbl_2
PARTITION BY (id, dt)
AS SELECT * from employee;
将数据 Sink 到 Iceberg 表
与 StarRocks 的内部表类似,如果您拥有 Iceberg 表的 INSERT 权限,则可以使用 INSERT 语句将 StarRocks 表的数据 Sink 到该 Iceberg 表(目前仅支持 Parquet 格式的 Iceberg 表)。此功能自 v3.1 起支持。
切换到 Iceberg catalog 及其中的数据库,然后使用以下语法将 StarRocks 表的数据 Sink 到该数据库中的 Parquet 格式的 Iceberg 表。
语法
INSERT {INTO | OVERWRITE} <table_name>
[ (column_name [, ...]) ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
-- If you want to sink data to specified partitions, use the following syntax:
INSERT {INTO | OVERWRITE} <table_name>
PARTITION (par_col1=<value> [, par_col2=<value>...])
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
分区列不允许 NULL
值。因此,您必须确保没有空值被加载到 Iceberg 表的分区列中。
参数
INTO
将 StarRocks 表的数据追加到 Iceberg 表。
OVERWRITE
使用 StarRocks 表的数据覆盖 Iceberg 表的现有数据。
column_name
要加载数据的目标列的名称。您可以指定一列或多列。如果指定多列,请用逗号 (,
) 分隔它们。您只能指定 Iceberg 表中实际存在的列,并且您指定的目标列必须包括 Iceberg 表的分区列。您指定的目标列按顺序一一映射到 StarRocks 表的列,而与目标列名无关。如果未指定目标列,则数据将加载到 Iceberg 表的所有列中。如果 StarRocks 表的非分区列无法映射到 Iceberg 表的任何列,则 StarRocks 会将默认值 NULL
写入 Iceberg 表列。如果 INSERT 语句包含查询语句,并且其返回的列类型与目标列的数据类型不同,则 StarRocks 会对不匹配的列执行隐式转换。如果转换失败,则会返回语法解析错误。
expression
为目标列赋值的表达式。
DEFAULT
为目标列分配默认值。
query
结果将被加载到 Iceberg 表中的查询语句。 它可以是 StarRocks 支持的任何 SQL 语句。
PARTITION
您想要加载数据的分区。 您必须在此属性中指定 Iceberg 表的所有分区列。 在此属性中指定的分区列的顺序可以与您在表创建语句中定义的分区列的顺序不同。 如果您指定此属性,则不能指定 column_name
属性。
示例
-
向
partition_tbl_1
表中插入三行数据INSERT INTO partition_tbl_1
VALUES
("buy", 1, "2023-09-01"),
("sell", 2, "2023-09-02"),
("buy", 3, "2023-09-03"); -
将 SELECT 查询的结果(其中包含简单的计算)插入到
partition_tbl_1
表中INSERT INTO partition_tbl_1 (id, action, dt) SELECT 1+1, 'buy', '2023-09-03';
-
将 SELECT 查询的结果(该查询从
partition_tbl_1
表中读取数据)插入到同一表中INSERT INTO partition_tbl_1 SELECT 'buy', 1, date_add(dt, INTERVAL 2 DAY)
FROM partition_tbl_1
WHERE id=1; -
将 SELECT 查询的结果插入到满足两个条件
dt='2023-09-01'
和id=1
的partition_tbl_2
表的分区中INSERT INTO partition_tbl_2 SELECT 'order', 1, '2023-09-01';
或
INSERT INTO partition_tbl_2 partition(dt='2023-09-01',id=1) SELECT 'order';
-
使用
close
覆盖partition_tbl_1
表中满足两个条件dt='2023-09-01'
和id=1
的分区中的所有action
列值INSERT OVERWRITE partition_tbl_1 SELECT 'close', 1, '2023-09-01';
或
INSERT OVERWRITE partition_tbl_1 partition(dt='2023-09-01',id=1) SELECT 'close';
删除 Iceberg 表
与 StarRocks 的内部表类似,如果您拥有 Iceberg 表的 DROP 权限,则可以使用 DROP TABLE 语句删除该 Iceberg 表。 此功能自 v3.1 起支持。
删除 Iceberg 表时,表的 HDFS 集群或云存储上的文件路径和数据不会随表一起删除。
强制删除 Iceberg 表(即,在 DROP TABLE 语句中指定了 FORCE
关键字)时,表的 HDFS 集群或云存储上的数据将随表一起删除,但表的 HDFS 集群或云存储上的文件路径会被保留。
切换到 Iceberg catalog 及其中的数据库,然后使用以下语句删除该数据库中的 Iceberg 表。
DROP TABLE <table_name> [FORCE];
创建 Iceberg 视图
您可以在 StarRocks 中定义 Iceberg 视图,或者将 StarRocks 方言添加到现有的 Iceberg 视图。针对此类 Iceberg 视图的查询支持抽象这些视图的 StarRocks 方言。 此功能自 v3.5 起支持。
CREATE VIEW [IF NOT EXISTS]
[<catalog>.<database>.]<view_name>
(
<column_name>[ COMMENT 'column comment']
[, <column_name>[ COMMENT 'column comment'], ...]
)
[COMMENT 'view comment']
AS <query_statement>
示例
基于 Iceberg 表 iceberg_table
创建 Iceberg 视图 iceberg_view1
。
CREATE VIEW IF NOT EXISTS iceberg.iceberg_db.iceberg_view1 AS
SELECT k1, k2 FROM iceberg.iceberg_db.iceberg_table;
为现有 Iceberg 视图添加或修改 StarRocks 方言
如果您的 Iceberg 视图是从其他系统(如 Apache Spark)创建的,同时您想从 StarRocks 查询这些视图,则可以将 StarRocks 方言添加到这些视图。 此功能自 v3.5 起支持。
- 您必须保证视图的两种方言的基本含义相同。 StarRocks 和其他系统不保证不同定义之间的一致性。
- 您只能为每个 Iceberg 视图定义一个 StarRocks 方言。 您可以使用 MODIFY 子句更改方言的定义。
ALTER VIEW
[<catalog>.<database>.]<view_name>
(
<column_name>
[, <column_name>]
)
{ ADD | MODIFY } DIALECT
<query_statement>
示例
- 将 StarRocks 方言添加到现有 Iceberg 视图
iceberg_view2
。
ALTER VIEW iceberg.iceberg_db.iceberg_view2 ADD DIALECT SELECT k1, k2 FROM iceberg.iceberg_db.iceberg_table;
- 修改现有 Iceberg 视图
iceberg_view2
的 StarRocks 方言。
ALTER VIEW iceberg.iceberg_db.iceberg_view2 MODIFY DIALECT SELECT k1, k2, k3 FROM iceberg.iceberg_db.iceberg_table;
配置元数据缓存
您的 Iceberg 集群的元数据文件可能存储在远程存储中,例如 AWS S3 或 HDFS。 默认情况下,StarRocks 在内存中缓存 Iceberg 元数据。 为了加速查询,StarRocks 采用两级元数据缓存机制,它可以在内存和磁盘上缓存元数据。 对于每个初始查询,StarRocks 都会缓存其计算结果。 如果发出与先前查询语义等效的任何后续查询,StarRocks 首先尝试从其缓存中检索请求的元数据,并且仅当元数据无法在其缓存中命中时才从远程存储中检索元数据。
StarRocks 使用最近最少使用 (LRU) 算法来缓存和逐出数据。 基本规则如下:
- StarRocks 首先尝试从内存中检索请求的元数据。 如果元数据无法在内存中命中,StarRock 尝试从磁盘检索元数据。 StarRocks 从磁盘检索的元数据将被加载到内存中。 如果元数据也无法在磁盘中命中,StarRock 会从远程存储中检索元数据,并将检索到的元数据缓存在内存中。
- StarRocks 将从内存中逐出的元数据写入磁盘,但它直接丢弃从磁盘中逐出的元数据。
从 v3.3.3 开始,StarRocks 支持 定期元数据刷新策略。 您可以使用系统变量 plan_mode
调整 Iceberg 元数据缓存计划。
Iceberg 元数据缓存的 FE 配置
enable_iceberg_metadata_disk_cache
- 单位:N/A
- 默认值:
false
- 描述:指定是否启用磁盘缓存。
iceberg_metadata_cache_disk_path
- 单位:N/A
- 默认值:
StarRocksFE.STARROCKS_HOME_DIR + "/caches/iceberg"
- 描述:磁盘上缓存的元数据文件的保存路径。
iceberg_metadata_disk_cache_capacity
- 单位:字节
- 默认值:
2147483648
,相当于 2 GB - 描述:磁盘上允许的最大缓存元数据大小。
iceberg_metadata_memory_cache_capacity
- 单位:字节
- 默认值:
536870912
,相当于 512 MB - 描述:内存中允许的最大缓存元数据大小。
iceberg_metadata_memory_cache_expiration_seconds
- 单位:秒
- 默认值:
86500
- 描述:从上次访问开始计算,内存中的缓存条目过期的时长。
iceberg_metadata_disk_cache_expiration_seconds
- 单位:秒
- 默认值:
604800
,相当于一周 - 描述:从上次访问开始计算,磁盘上的缓存条目过期的时长。
iceberg_metadata_cache_max_entry_size
- 单位:字节
- 默认值:
8388608
,相当于 8 MB - 描述:可以缓存的文件的最大大小。 无法缓存大小超过此参数的值的文件。 如果查询请求这些文件,StarRocks 会从远程存储中检索它们。
enable_background_refresh_connector_metadata
- 单位:-
- 默认值:true
- 描述:是否启用定期 Iceberg 元数据缓存刷新。 启用后,StarRocks 会轮询 Iceberg 集群的元存储(Hive Metastore 或 AWS Glue),并刷新经常访问的 Iceberg catalog 的缓存元数据,以感知数据更改。
true
表示启用 Iceberg 元数据缓存刷新,false
表示禁用它。
background_refresh_metadata_interval_millis
- 单位:毫秒
- 默认值:600000
- 描述:两次连续 Iceberg 元数据缓存刷新之间的间隔。 - 单位:毫秒。
background_refresh_metadata_time_secs_since_last_access_sec
- 单位:秒
- 默认值:86400
- 描述:Iceberg 元数据缓存刷新任务的过期时间。 对于已访问的 Iceberg catalog,如果超过指定时间未被访问,StarRocks 会停止刷新其缓存的元数据。 对于未访问的 Iceberg catalog,StarRocks 不会刷新其缓存的元数据。
附录 A:定期元数据刷新策略
Iceberg 支持 快照。 使用最新的快照,您可以获得最新的结果。 因此,只有缓存的快照会影响数据新鲜度。 因此,您只需要关注包含快照的缓存的刷新策略。
下图显示了时间线上的时间间隔。
附录 B:元数据文件解析
-
大量元数据的分布式计划
为了有效地处理大量元数据,StarRocks 采用了一种使用多个 BE 和 CN 节点的分布式方法。 这种方法利用了现代查询引擎的并行计算能力,可以将读取、解压缩和过滤清单文件等任务分布在多个节点上。 通过并行处理这些清单文件,可以显着减少元数据检索所需的时间,从而加快作业计划的制定。 这对于涉及大量清单文件的大型查询特别有益,因为它消除了单点瓶颈并提高了整体查询执行效率。
-
少量元数据的本地计划
对于较小的查询,重复解压缩和解析清单文件可能会导致不必要的延迟,因此采用了一种不同的策略。 StarRocks 缓存反序列化的内存对象,尤其是 Avro 文件,以解决此问题。 通过将这些反序列化的文件存储在内存中,系统可以绕过后续查询的解压缩和解析阶段。 这种缓存机制允许直接访问所需的元数据,从而显着减少了检索时间。 因此,该系统变得更具响应性,并且更适合满足高查询需求和物化视图重写需求。
-
自适应元数据检索策略(默认)
StarRocks 旨在根据各种因素(包括 FE 和 BE/CN 节点的数量、它们的 CPU 核心数以及当前查询所需的清单文件数量)自动选择适当的元数据检索方法。 这种自适应方法确保系统动态优化元数据检索,而无需手动调整元数据相关参数。 通过这样做,StarRocks 提供了无缝体验,在分布式计划和本地计划之间取得平衡,以在不同条件下实现最佳查询性能。
您可以使用系统变量 plan_mode
调整 Iceberg 元数据缓存计划。