Unified Catalog
统一 Catalog 是一种外部 Catalog,StarRocks 从 v3.2 版本开始提供,用于将来自 Apache Hive™、Apache Iceberg、Apache Hudi、Delta Lake 和 Apache Kudu 数据源的表作为统一数据源进行处理,而无需导入数据。借助统一 Catalog,您可以
- 直接查询存储在 Hive、Iceberg、Hudi、Delta Lake、Paimon 和 Kudu 中的数据,而无需手动创建表。
- 使用 INSERT INTO 或异步物化视图(从 v2.5 版本开始支持)来处理存储在 Hive、Iceberg、Hudi、Delta Lake、Paimon 和 Kudu 中的数据,并将数据加载到 StarRocks 中。
- 在 StarRocks 上执行操作以创建或删除 Hive 和 Iceberg 数据库和表。
为确保您的统一数据源上的 SQL 工作负载成功,您的 StarRocks 集群必须能够访问您的统一数据源的存储系统和 Metastore。StarRocks 支持以下存储系统和 Metastore
-
分布式文件系统(HDFS)或对象存储,如 AWS S3、Microsoft Azure Storage、Google GCS 或其他 S3 兼容的存储系统(例如,MinIO)
-
Metastore,如 Hive Metastore 或 AWS Glue
注意
如果您选择 AWS S3 作为存储,则可以使用 HMS 或 AWS Glue 作为 Metastore。如果您选择任何其他存储系统,则只能使用 HMS 作为 Metastore。
限制
一个统一 Catalog 仅支持与单个存储系统和单个 Metastore 服务集成。因此,请确保您要作为统一数据源与 StarRocks 集成的所有数据源都使用相同的存储系统和 Metastore 服务。
使用说明
-
请参阅 Hive catalog、Iceberg catalog、Hudi catalog、Delta Lake catalog、Paimon catalog 和 Kudu catalog 中的“使用说明”部分,以了解支持的文件格式和数据类型。
-
格式特定的操作仅针对特定表格式支持。例如,CREATE TABLE 和 DROP TABLE 仅针对 Hive 和 Iceberg 支持,而 REFRESH EXTERNAL TABLE 仅针对 Hive 和 Hudi 支持。
当您使用 CREATE TABLE 语句在统一 Catalog 中创建表时,请使用
ENGINE
参数指定表格式(Hive 或 Iceberg)。
集成准备
在创建统一 Catalog 之前,请确保您的 StarRocks 集群可以与您的统一数据源的存储系统和 Metastore 集成。
AWS IAM
如果您使用 AWS S3 作为存储或 AWS Glue 作为 Metastore,请选择您合适的身份验证方法并进行必要的准备,以确保您的 StarRocks 集群可以访问相关的 AWS 云资源。有关更多信息,请参阅 验证到 AWS 资源的身份 - 准备工作。
HDFS
如果您选择 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 集群设置一个用户名。 - 当您查询数据时,您的 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 集群启用了视图文件系统 (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
命令,以从密钥分发中心 (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 文件的保存路径。您可以根据需要修改路径。
创建统一 Catalog
语法
CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES
(
"type" = "unified",
MetastoreParams,
StorageCredentialParams,
MetadataUpdateParams,
PaimonCatalogParams,
KuduCatalogParams
)
参数
catalog_name
统一 Catalog 的名称。命名约定如下
- 该名称可以包含字母、数字 (0-9) 和下划线 (_)。它必须以字母开头。
- 该名称区分大小写,长度不能超过 1023 个字符。
comment
统一 Catalog 的描述。此参数是可选的。
type
您的数据源的类型。将值设置为 unified
。
MetastoreParams
一组关于 StarRocks 如何与您的 Metastore 集成的参数。
Hive Metastore
如果您选择 Hive Metastore 作为您的统一数据源的 Metastore,请按如下方式配置 MetastoreParams
"unified.metastore.type" = "hive",
"hive.metastore.uris" = "<hive_metastore_uri>"
注意
在查询数据之前,您必须将您的 Hive Metastore 节点的 Hostname 和 IP 地址之间的映射添加到 /etc/hosts 路径。否则,当您启动查询时,StarRocks 可能无法访问您的 Hive Metastore。
下表描述了您需要在 MetastoreParams
中配置的参数。
参数 | 必需 | 描述 |
---|---|---|
unified.metastore.type | 是 | 您用于统一数据源的 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
"unified.metastore.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.region" = "<aws_glue_region>" -
要选择基于 Assume Role 的身份验证方法,请按如下方式配置
MetastoreParams
"unified.metastore.type" = "glue",
"aws.glue.use_instance_profile" = "true",
"aws.glue.iam_role_arn" = "<iam_role_arn>",
"aws.glue.region" = "<aws_glue_region>" -
要选择基于 IAM 用户的身份验证方法,请按如下方式配置
MetastoreParams
"unified.metastore.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>"
下表描述了您需要在 MetastoreParams
中配置的参数。
参数 | 必需 | 描述 |
---|---|---|
unified.metastore.type | 是 | 您用于统一数据源的 Metastore 的类型。将值设置为 glue 。 |
aws.glue.use_instance_profile | 是 | 指定是否启用基于实例配置文件的身份验证方法和基于 Assume Role 的身份验证。有效值:true 和 false 。默认值:false 。 |
aws.glue.iam_role_arn | 否 | 具有对您的 AWS Glue Data Catalog 权限的 IAM 角色的 ARN。如果您使用基于 Assume Role 的身份验证方法访问 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 的身份验证参数。
StorageCredentialParams
一组关于 StarRocks 如何与您的存储系统集成的参数。此参数集是可选的。
如果您使用 HDFS 作为存储,则无需配置 StorageCredentialParams
。
如果您使用 AWS S3、其他 S3 兼容的存储系统、Microsoft Azure Storage 或 Google GCS 作为存储,则必须配置 StorageCredentialParams
。
AWS S3
如果您选择 AWS S3 作为存储,请执行以下操作之一
-
要选择基于实例配置文件的身份验证方法,请按如下方式配置
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>"
下表描述了需要在 StorageCredentialParams
中配置的参数。
参数 | 必需 | 描述 |
---|---|---|
aws.s3.use_instance_profile | 是 | 指定是否启用基于实例配置文件的身份验证方法和基于 Assume Role 的身份验证方法。有效值:true 和 false 。默认值:false 。 |
aws.s3.iam_role_arn | 否 | 具有对您的 AWS S3 存储桶权限的 IAM 角色的 ARN。如果您使用基于 Assume Role 的身份验证方法访问 AWS S3,则必须指定此参数。 |
aws.s3.region | 是 | 您的 AWS S3 bucket 所在的区域。示例: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 的身份验证参数。
S3 兼容的存储系统
如果您选择与 S3 兼容的存储系统(例如 MinIO)作为存储,请按如下方式配置 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>"
下表描述了需要在 StorageCredentialParams
中配置的参数。
参数 | 必需 | 描述 |
---|---|---|
aws.s3.enable_ssl | 是 | 指定是否启用 SSL 连接。 有效值: true 和 false 。默认值:true 。 |
aws.s3.enable_path_style_access | 是 | 指定是否启用 path-style 访问。 有效值: true 和 false 。默认值:false 。对于 MinIO,您必须将值设置为 true 。Path-style URL 使用以下格式: https://s3.<region_code>.amazonaws.com/<bucket_name>/<key_name> 。例如,如果您在美国西部(俄勒冈)区域中创建一个名为 DOC-EXAMPLE-BUCKET1 的存储桶,并且您想要访问该存储桶中的 alice.jpg 对象,则可以使用以下 path-style 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
Azure Blob Storage
如果您选择 Blob Storage 作为存储,请执行以下操作之一
-
要选择共享密钥身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.blob.storage_account" = "<storage_account_name>",
"azure.blob.shared_key" = "<storage_account_shared_key>"下表描述了需要在
StorageCredentialParams
中配置的参数。参数 必需 描述 azure.blob.storage_account 是 您的 Blob Storage 帐户的用户名。 azure.blob.shared_key 是 您的 Blob Storage 帐户的共享密钥。 -
要选择 SAS 令牌身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.blob.storage_account" = "<storage_account_name>",
"azure.blob.container" = "<container_name>",
"azure.blob.sas_token" = "<storage_account_SAS_token>"下表描述了需要在
StorageCredentialParams
中配置的参数。参数 必需 描述 azure.blob.storage_account 是 您的 Blob Storage 帐户的用户名。 azure.blob.container 是 存储数据的 Blob 容器的名称。 azure.blob.sas_token 是 用于访问 Blob 存储帐户的 SAS 令牌。
Azure Data Lake Storage Gen2
如果您选择 Data Lake Storage Gen2 作为存储,请执行以下操作之一
-
要选择托管标识身份验证方法,请按如下方式配置
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.oauth2_use_managed_identity 是 指定是否启用托管标识身份验证方法。将值设置为 true
。azure.adls2.oauth2_tenant_id 是 您要访问其数据的租户的 ID。 azure.adls2.oauth2_client_id 是 托管标识的客户端(应用程序)ID。 -
要选择共享密钥身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls2.storage_account" = "<storage_account_name>",
"azure.adls2.shared_key" = "<storage_account_shared_key>"下表描述了需要在
StorageCredentialParams
中配置的参数。参数 必需 描述 azure.adls2.storage_account 是 您的 Data Lake Storage Gen2 存储帐户的用户名。 azure.adls2.shared_key 是 您的 Data Lake Storage Gen2 存储帐户的共享密钥。 -
要选择服务主体身份验证方法,请按如下方式配置
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>"下表描述了您需要在
StorageCredentialParams
中配置的参数。参数 必需 描述 azure.adls2.oauth2_client_id 是 服务主体的客户端(应用程序)ID。 azure.adls2.oauth2_client_secret 是 创建的新客户端(应用程序)密钥的值。 azure.adls2.oauth2_client_endpoint 是 服务主体或应用程序的 OAuth 2.0 令牌端点 (v1)。
Azure Data Lake Storage Gen1
如果您选择 Data Lake Storage Gen1 作为存储,请执行以下操作之一
-
要选择托管服务标识身份验证方法,请按如下方式配置
StorageCredentialParams
"azure.adls1.use_managed_service_identity" = "true"
下表描述了需要在
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>"下表描述了需要在
StorageCredentialParams
中配置的参数。参数 必需 描述 azure.adls1.oauth2_client_id 是 服务主体的客户端(应用程序)ID。 azure.adls1.oauth2_credential 是 创建的新客户端(应用程序)密钥的值。 azure.adls1.oauth2_endpoint 是 服务主体或应用程序的 OAuth 2.0 令牌端点 (v1)。
Google GCS
如果您选择 Google GCS 作为存储,请执行以下操作之一
-
要选择基于 VM 的身份验证方法,请按如下方式配置
StorageCredentialParams
"gcp.gcs.use_compute_engine_service_account" = "true"
下表描述了需要在
StorageCredentialParams
中配置的参数。参数 默认值 值 示例 描述 gcp.gcs.use_compute_engine_service_account false true 指定是否直接使用绑定到您的 Compute Engine 的服务帐户。 -
要选择基于服务帐户的身份验证方法,请按如下方式配置
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
中配置的参数。参数 默认值 值 示例 描述 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 文件中的私钥。 -
要选择基于模拟的身份验证方法,请按如下方式配置
StorageCredentialParams
-
使 VM 实例模拟服务帐户
"gcp.gcs.use_compute_engine_service_account" = "true",
"gcp.gcs.impersonation_service_account" = "<assumed_google_service_account_email>"下表描述了需要在
StorageCredentialParams
中配置的参数。参数 默认值 值 示例 描述 gcp.gcs.use_compute_engine_service_account false true 指定是否直接使用绑定到您的 Compute Engine 的服务帐户。 gcp.gcs.impersonation_service_account "" "hello" 您要模拟的服务帐户。 -
使服务帐户(暂时命名为 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>"下表描述了需要在
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 如何更新 Hive、Hudi 和 Delta Lake 的缓存元数据的参数。此参数集是可选的。有关从 Hive、Hudi 和 Delta Lake 更新缓存元数据的策略的更多信息,请参阅 Hive catalog、Hudi catalog 和 Delta Lake catalog。
在大多数情况下,您可以忽略 MetadataUpdateParams
,并且无需调整其中的策略参数,因为这些参数的默认值已经为您提供了开箱即用的性能。
但是,如果 Hive、Hudi 或 Delta Lake 中的数据更新频率很高,您可以调整这些参数以进一步优化自动异步更新的性能。
参数 | 必需 | 描述 |
---|---|---|
enable_metastore_cache | 否 | 指定 StarRocks 是否缓存 Hive、Hudi 或 Delta Lake 表的元数据。有效值:true 和 false 。默认值:true 。值 true 启用缓存,值 false 禁用缓存。 |
enable_remote_file_cache | 否 | 指定 StarRocks 是否缓存 Hive、Hudi 或 Delta Lake 表或分区的底层数据文件的元数据。有效值:true 和 false 。默认值:true 。值 true 启用缓存,值 false 禁用缓存。 |
metastore_cache_refresh_interval_sec | 否 | StarRocks 异步更新自身缓存的 Hive、Hudi 或 Delta Lake 表或分区的元数据的时间间隔。单位:秒。默认值:7200 ,即 2 小时。 |
remote_file_cache_refresh_interval_sec | 否 | StarRocks 异步更新自身缓存的 Hive、Hudi 或 Delta Lake 表或分区的底层数据文件的元数据的时间间隔。单位:秒。默认值:60 。 |
metastore_cache_ttl_sec | 否 | StarRocks 自动丢弃自身缓存的 Hive、Hudi 或 Delta Lake 表或分区的元数据的时间间隔。单位:秒。默认值:86400 ,即 24 小时。 |
remote_file_cache_ttl_sec | 否 | StarRocks 自动丢弃自身缓存的 Hive、Hudi 或 Delta Lake 表或分区的底层数据文件的元数据的时间间隔。单位:秒。默认值:129600 ,即 36 小时。 |
PaimonCatalogParams
一组关于如何连接 Paimon Catalog 的参数。此参数集是可选的。
参数 | 必需 | 描述 |
---|---|---|
paimon.catalog.warehouse | 否 | 您的 Paimon 数据的 Warehouse 存储路径。 |
KuduCatalogParams
一组关于如何连接 Kudu Catalog 的参数。此参数集是可选的。
参数 | 必需 | 描述 |
---|---|---|
kudu.master | 否 | 指定 Kudu Master 地址,默认为 localhost:7051 。 |
kudu.schema-emulation.enabled | 否 | 用于启用或禁用 schema 仿真的选项。默认情况下,它处于关闭状态(false),这意味着所有表都属于 default schema 。 |
kudu.schema-emulation.prefix | 否 | 仅当 kudu.schema-emulation.enabled = true 时才应设置 schema 仿真的前缀。使用的默认前缀是空字符串: 。 |
示例
以下示例创建了一个名为 unified_catalog_hms
或 unified_catalog_glue
的统一 Catalog,具体取决于您使用的 Metastore 的类型,以查询来自您的统一数据源的数据。
HDFS
如果您使用 HDFS 作为存储,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083"
);
AWS S3
基于实例配置文件的身份验证
-
如果您使用 Hive Metastore,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"aws.s3.use_instance_profile" = "true",
"aws.s3.region" = "us-west-2"
); -
如果您将 AWS Glue 与 Amazon EMR 结合使用,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_glue
PROPERTIES
(
"type" = "unified",
"unified.metastore.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"
);
基于 Assume Role 的身份验证
-
如果您使用 Hive Metastore,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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"
); -
如果您将 AWS Glue 与 Amazon EMR 结合使用,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_glue
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 用户的身份验证
-
如果您使用 Hive Metastore,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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"
); -
如果您将 AWS Glue 与 Amazon EMR 结合使用,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_glue
PROPERTIES
(
"type" = "unified",
"unified.metastore.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"
);
S3 兼容的存储系统
以 MinIO 为例。运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"azure.adls1.use_managed_service_identity" = "true"
); -
如果您选择 Service Principal 身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.type" = "hive",
"hive.metastore.uris" = "thrift://xx.xx.xx.xx:9083",
"gcp.gcs.use_compute_engine_service_account" = "true"
); -
如果您选择基于服务帐户的身份验证方法,请运行如下命令
CREATE EXTERNAL CATALOG unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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 unified_catalog_hms
PROPERTIES
(
"type" = "unified",
"unified.metastore.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
您可以使用 SHOW CATALOGS 查询当前 StarRocks 集群中的所有 Catalog
SHOW CATALOGS;
您还可以使用 SHOW CREATE CATALOG 查询外部 Catalog 的创建语句。以下示例查询名为 unified_catalog_glue
的统一 Catalog 的创建语句
SHOW CREATE CATALOG unified_catalog_glue;
切换到统一 Catalog 及其中的数据库
您可以使用以下方法之一切换到统一 Catalog 及其中的数据库
-
使用 SET CATALOG 在当前会话中指定一个统一 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 切换到统一 Catalog 及其中的数据库
USE <catalog_name>.<db_name>
删除统一 Catalog
您可以使用 DROP CATALOG 删除外部 Catalog。
以下示例删除名为 unified_catalog_glue
的统一 Catalog
DROP CATALOG unified_catalog_glue;
查看来自统一 Catalog 的表的 Schema
您可以使用以下语法之一查看来自统一 Catalog 的表的 Schema
-
查看 Schema
DESC[RIBE] <catalog_name>.<database_name>.<table_name>
-
从 CREATE 语句中查看 Schema 和 Location
SHOW CREATE TABLE <catalog_name>.<database_name>.<table_name>
从统一 Catalog 查询数据
要从统一 Catalog 查询数据,请按照以下步骤操作
-
使用 SHOW DATABASES 查看您的统一数据源中的数据库,该统一数据源与统一 Catalog 相关联
SHOW DATABASES FROM <catalog_name>
-
使用 SELECT 查询指定数据库中的目标表
SELECT count(*) FROM <table_name> LIMIT 10
从 Hive、Iceberg、Hudi、Delta Lake 或 Kudu 加载数据
您可以使用 INSERT INTO 将 Hive、Iceberg、Hudi、Delta Lake 或 Kudu 表的数据加载到在统一 Catalog 中创建的 StarRocks 表中。
以下示例将 Hive 表 hive_table
的数据加载到在属于统一 Catalog unified_catalog
的数据库 test_database
中创建的 StarRocks 表 test_tbl
中
INSERT INTO unified_catalog.test_database.test_table SELECT * FROM hive_table
在统一 Catalog 中创建数据库
与 StarRocks 的内部 Catalog 类似,如果您具有对统一 Catalog 的 CREATE DATABASE 权限,则可以使用 CREATE DATABASE 语句在该 Catalog 中创建数据库。
注意
StarRocks 仅支持在统一 Catalog 中创建 Hive 和 Iceberg 数据库。
切换到统一 Catalog,然后使用以下语句在该 Catalog 中创建数据库
CREATE DATABASE <database_name>
[properties ("location" = "<prefix>://<path_to_database>/<database_name.db>")]
location
参数指定您要在其中创建数据库的文件路径,该路径可以在 HDFS 或云存储中。
- 当您使用 Hive Metastore 作为您的数据源的 Metastore 时,如果您在创建数据库时未指定该参数,则
location
参数默认为<warehouse_location>/<database_name.db>
,Hive Metastore 支持该参数。 - 当您使用 AWS Glue 作为您的数据源的 Metastore 时,
location
参数没有默认值,因此您必须在创建数据库时指定该参数。
prefix
的变化取决于您使用的存储系统
存储系统 | Prefix 值 |
---|---|
HDFS | hdfs |
Google GCS | gs |
Azure Blob Storage |
|
Azure Data Lake Storage Gen1 | adl |
Azure Data Lake Storage Gen2 |
|
AWS S3 或其他 S3 兼容的存储(例如,MinIO) | s3 |
从统一 Catalog 中删除数据库
与 StarRocks 的内部数据库类似,如果您具有对在统一 Catalog 中创建的数据库的 DROP 权限,则可以使用 DROP DATABASE 语句删除该数据库。您只能删除空数据库。
注意
StarRocks 仅支持从统一 Catalog 中删除 Hive 和 Iceberg 数据库。
当您从统一 Catalog 中删除数据库时,数据库在您的 HDFS 集群或云存储上的文件路径不会随数据库一起删除。
切换到统一 Catalog,然后使用以下语句在该 Catalog 中删除数据库
DROP DATABASE <database_name>
在统一 Catalog 中创建表
与 StarRocks 的内部数据库类似,如果您具有对在统一 Catalog 中创建的数据库的 CREATE TABLE 权限,则可以使用 CREATE TABLE 或 [CREATE TABLE AS SELECT ../../sql-reference/sql-statements/table_bucket_part_index/CREATE_TABLE_AS_SELECT.mdELECT.md) 语句在该数据库中创建表。
注意
StarRocks 仅支持在统一 Catalog 中创建 Hive 和 Iceberg 表。
切换到 Hive Catalog 及其中的数据库。然后,使用 CREATE TABLE 在该数据库中创建 Hive 或 Iceberg 表
CREATE TABLE <table_name>
(column_definition1[, column_definition2, ...]
ENGINE = {|hive|iceberg}
[partition_desc]
有关更多信息,请参阅 创建 Hive 表 和 创建 Iceberg 表。
以下示例创建了一个名为 hive_table
的 Hive 表。该表由三列 action
、id
和 dt
组成,其中 id
和 dt
是分区列。
CREATE TABLE hive_table
(
action varchar(65533),
id int,
dt date
)
ENGINE = hive
PARTITION BY (id,dt);
将数据 Sink 到统一 Catalog 中的表
与 StarRocks 的内部表类似,如果您具有对在统一 Catalog 中创建的表的 INSERT 权限,则可以使用 INSERT 语句将 StarRocks 表的数据 Sink 到该统一 Catalog 表(当前仅支持 Parquet 格式的统一 Catalog 表)。
注意
StarRocks 仅支持将数据 Sink 到统一 Catalog 中的 Hive 和 Iceberg 表。
切换到 Hive Catalog 及其中的数据库。然后,使用 INSERT INTO 将数据插入到该数据库中的 Hive 或 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 }
有关更多信息,请参阅 将数据 Sink 到 Hive 表 和 将数据 Sink 到 Iceberg 表。
以下示例将三个数据行插入到名为 hive_table
的 Hive 表
INSERT INTO hive_table
VALUES
("buy", 1, "2023-09-01"),
("sell", 2, "2023-09-02"),
("buy", 3, "2023-09-03");
从统一 Catalog 中删除表
与 StarRocks 的内部表类似,如果您具有对在统一 Catalog 中创建的表的 DROP 权限,则可以使用 DROP TABLE 语句删除该表。
注意
StarRocks 仅支持从统一 Catalog 中删除 Hive 和 Iceberg 表。
切换到 Hive Catalog 及其中的数据库。然后,使用 DROP TABLE 删除该数据库中的 Hive 或 Iceberg 表
DROP TABLE <table_name>
有关更多信息,请参阅 删除 Hive 表 和 删除 Iceberg 表。
以下示例删除名为 hive_table
的 Hive 表
DROP TABLE hive_table FORCE