完全指南:认识与管理集群内置数据)
StarRocks Default Catalog默认内部 Catalog完全指南认识与管理集群内置数据【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks导读本文以 StarRocks 的Default Catalog默认内部 Catalog为主题系统讲解内部 Catalog 的概念定位、与外部 Catalog 的区别以及如何通过它查询集群内部数据。阅读完本文你将掌握default_catalog的底层实现原理含 FE 端源码佐证、数据库切换与三段式全限定表名的用法并能用SHOW DATABASES、SET CATALOG、USE、SELECT四条语句完成从连接到查询的完整实战流程。本主题对应仓库文档为 default_catalog.md建议配合 catalog_overview.md 一起阅读。什么是 Default CatalogStarRocks 从2.3 版本开始引入 Catalog数据目录功能用于统一管理内部数据与外部数据。在此基础上每个 StarRocks 集群都内置且仅内置一个名为default_catalog的内部 Catalog专门负责管理 StarRocks 自身存储的内部数据。内部数据指的是由 StarRocks 自己管理的数据当你执行CREATE DATABASE、CREATE TABLE等语句创建数据库或表时这些对象就被存储在内部 Catalog 中。与之相对外部数据指存储在 Apache Hive™、Apache Iceberg、Apache Hudi、Delta Lake、JDBC 兼容数据源等外部系统中的数据需要借助外部 Catalog才能访问。关于default_catalog有几个关键限制需要明确每个集群只有唯一一个内部 Catalog名称固定为default_catalog当前无法修改内部 Catalog 的名称当前无法创建新的内部 Catalog。源码视角内部 Catalog 如何被定义上述行为在 FE 源码中有明确实现。在 InternalCatalog.java 中内部 Catalog 的默认名称与 ID 被定义为常量public class InternalCatalog extends Catalog { public static final String DEFAULT_INTERNAL_CATALOG_NAME default_catalog; public static final long DEFAULT_INTERNAL_CATALOG_ID -11; public InternalCatalog(long id, MapString, String config, String comment) { super(id, DEFAULT_INTERNAL_CATALOG_NAME, config, comment); } ... }可以看到InternalCatalog在构造时被硬编码为名称default_catalog因此集群中不可能出现第二个同名的内部 Catalog。在 CatalogMgr.javaFE 端 Catalog 管理器中default_catalog被视为始终存在的 Catalogpublic boolean catalogExists(String catalogName) { if (catalogName.equalsIgnoreCase(InternalCatalog.DEFAULT_INTERNAL_CATALOG_NAME)) { return true; } ... } public static boolean isInternalCatalog(String name) { return name.equalsIgnoreCase(InternalCatalog.DEFAULT_INTERNAL_CATALOG_NAME); } public static boolean isInternalCatalog(long catalogId) { return catalogId InternalCatalog.DEFAULT_INTERNAL_CATALOG_ID; }catalogExists()对default_catalog直接返回true说明它并不依赖动态注册而是集群自带的固定成员isInternalCatalog()则被用于区分内部与外部 Catalog 的逻辑分支。另外在CatalogMgr的CatalogProcNode中default_catalog的类型被标识为Internal其注释为 “An internal catalog contains this clusters self-managed tables.”即“内部 Catalog 包含本集群自管理的数据表”见 CatalogMgr.java。使用 Default Catalog 查询内部数据在default_catalog下查询内部数据的完整流程分为连接、查看、切换、查询四个步骤。第 1 步连接 StarRocks 集群使用MySQL 客户端连接集群后默认即处于default_catalog中无需任何额外操作。使用JDBC连接时可以通过在连接参数中指定default_catalog.db_name例如default_catalog.example_db让连接建立后直接进入默认 Catalog 中的目标数据库。第 2 步可选查看数据库使用SHOW DATABASES查看当前 Catalog 下的所有数据库SHOW DATABASES;也可以显式指定 Catalog 名称来查看某个 Catalog 下的数据库SHOW DATABASES FROM catalog_name;语法细节可参考 SHOW DATABASES。由于一个集群只有一个内部 Catalog在默认场景下上述两条语句查看的都是default_catalog内的数据库当切换或指定到外部 Catalog 时第二条语句可用于查看外部数据源中的数据库。第 3 步可选切换 Catalog 与数据库在当前会话中切换到目标 CatalogSET CATALOG catalog_name;该语句的完整说明见 SET CATALOG。切换 Catalog 后再使用USE指定当前会话的活动数据库USE db_name;或者直接用一条USE语句进入目标 Catalog 下的活动数据库USE catalog_name.db_name;USE语句的语法见 USE。对于default_catalog场景等效写法为USE default_catalog.db_name;第 4 步查询内部数据在选定 Catalog 和数据库后即可用SELECT查询内部数据SELECT * FROM table_name;如果在前面的步骤中没有指定活动数据库可以直接在 SELECT 中指定数据库SELECT * FROM db_name.table_name;也可以使用包含 Catalog 的三段式全限定名显式指定default_catalogSELECT * FROM default_catalog.db_name.table_name;SELECT语句的完整语法参见 SELECT。完整示例查询 olap_db.olap_table假设集群中存在数据库olap_db和表olap_table要查询其中的数据以下三种写法完全等价写法一先切换数据库再查询USE olap_db; SELECT * FROM olap_table limit 1;写法二在 SELECT 中指定数据库SELECT * FROM olap_db.olap_table limit 1;写法三使用三段式全限定名含 CatalogSELECT * FROM default_catalog.olap_db.olap_table limit 1;第三种写法最值得关注它展示了 Catalog、Database、Table 三层命名空间的组织方式即使当前会话停留在其他 Catalog 或数据库也能精确锁定default_catalog中的数据对象。拓展Default Catalog 与跨 Catalog 联邦查询理解了default_catalog后很容易进一步掌握 StarRocks 的跨 Catalog 联邦查询能力。在 catalog_overview.md 中给出了多组示例其核心规则是使用catalog_name.database_name.table_name格式显式指定数据所在位置即可跨越当前 Catalog 进行查询甚至让内部表与外部表直接 JOIN。例如当前会话位于hive_catalog.hive_db一个外部 Hive Catalog要查询default_catalog中的内部表SELECT * FROM default_catalog.olap_db.olap_table;又如将外部表hive_table与内部表olap_table进行 JOINSELECT * FROM hive_table h JOIN default_catalog.olap_db.olap_table o WHERE h.id o.id;在这些场景中default_catalog作为三段式名称的第一段是内部数据在联邦查询中被稳定引用的关键身份标识。与外部 Catalog 的关系从 catalog_overview.md 可以看到StarRocks 目前提供两类 Catalog内部 CatalogInternal catalog管理 StarRocks 内部数据即本文主角default_catalog外部 CatalogExternal catalog如同指向外部元数据服务的“连接器”允许直接访问 Hive、Iceberg、Hudi、Delta Lake、JDBC、Elasticsearch、Paimon、Fluss、Unified 等外部数据源实现零数据加载/迁移的直查。从 FE 源码看二者在 CatalogMgr.java 中被显式区分public static boolean isExternalCatalog(String name) { return !Strings.isNullOrEmpty(name) !isInternalCatalog(name) !isResourceMappingCatalog(name); }即“不是内部 Catalog、也不是资源映射 Catalog 的就是外部 Catalog”。如需了解如何通过外部 Catalog 查询外部数据可参考 Query external data。参考文档与源码索引本文核心结论与实操步骤来自 default_catalog.md并辅以以下仓库资料佐证概念总览与跨 Catalog 查询示例catalog_overview.md内部 Catalog 名称与 ID 的定义InternalCatalog.java内部/外部 Catalog 的判定逻辑CatalogMgr.java相关 SQL 语法文档SET CATALOG、SHOW DATABASES、USE、SELECT外部数据查询指南query_external_data.md【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考