Doris catalog操作
一、Doris Catalog简介
Doris Catalog是Apache Doris中用于管理和组织数据的核心组件,主要负责存储和管理元数据。以下是详细介绍:
- 主要功能:
- 数据组织:可管理多个数据库,每个数据库又能包含多个表。同时,负责管理表的元数据,如表名、列信息、分区信息等,还支持创建和管理视图,以及管理表的分区信息,有助于数据的高效存储和查询。
- 元数据管理:Doris Catalog维护所有数据库对象的元数据,并将其存储在元数据存储系统中,支持元数据的创建、修改和删除操作,确保元数据的一致性。
- 数据发现与查询优化:通过元数据可以快速发现和定位所需的数据,还能基于元数据的信息帮助优化查询计划,提高查询性能。
- 权限管理:能够管理用户和角色,并分配不同的权限,通过细粒度的权限控制,确保数据的安全性和访问控制。
- 数据血缘:可以记录数据的来源和变更过程,帮助用户理解数据的生成和传输路径,例如对表进行ETL操作时,能记录输入表、输出表和变更步骤等详细信息。
- 类型:
- Internal Catalog:是Doris内置的默认Catalog,用户不可修改或删除。用户登录Doris后,默认进入该Catalog,可直接使用
SHOW DATABASES
、USE DB
等命令查看和切换数据库。 - External Catalog:用户可通过
CREATE CATALOG
命令创建。创建后,可通过SHOW CATALOGS
命令查看,能使用SWITCH
命令切换到相应的External Catalog。目前Doris只支持对External Catalog中的数据进行只读访问,可删除Catalog,此操作仅会删除Doris中该Catalog的映射信息,不会修改外部数据目录的内容。
- Internal Catalog:是Doris内置的默认Catalog,用户不可修改或删除。用户登录Doris后,默认进入该Catalog,可直接使用
- 支持的数据源:
- Hive Metastore:可以访问包括Hive、Iceberg、Hudi在内的数据表,也可对接兼容Hive Metastore的数据源,如阿里云的DataLake Formation,同时支持HDFS和对象存储上的数据访问。
- Elasticsearch:可用于访问ES数据源。
- 其他:还可通过JDBC Catalog访问支持JDBC接口的数据库,如MySQL等。
- 作用:Doris Catalog使得用户可以方便地查询外部系统的数据,并且这些数据之间还可以进行join操作,实现多源数据的联邦查询。例如,通过Hive Catalog,用户可使用SQL语句直接查询Hive的数据,相较于传统方式,使用门槛低且效率高。
二、Doris Catalog 常用命令
序号 | 操作 | 命令 | 结果 |
---|---|---|---|
1 | 增 | CREATE CATALOG MY_CATA_MYSQL PROPERTIES ([KEY1]=[VALUE1],…) | 详见如下 SQL-1 |
2 | 删 | DROP catalog MY_CATA_MYSQL; | |
3 | 查询所有 | SHOW catalogs; | |
4 | 查询某一个的创建语句 | SHOW CREATE catalog MY_CATA_MYSQL; | |
5 | 查询Catalog下的所有原始库 | SHOW DATABASES FROM MY_CATA_MYSQL; | 详见如下 SQL-2 |
6 | 查询Catalog下指定原始库下的所有表 | SHOW TABLES FROM MY_CATA_MYSQL.database_1 | 详见如下 SQL-3 |
SQL-1:
CREATE CATALOG MY_CATA_MYSQL PROPERTIES ("type" = "jdbc","user" = "root","password" = "*XXXX","jdbc_url" = "jdbc:mysql://11.11.11.11:3306/biz_database?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&yearIsDateType=false&tinyInt1isBit=false&rewriteBatchedStatements=true&characterEncoding=utf-8","driver_url" = "mysql-connector-java-8.0.25.jar","driver_class" = "com.mysql.cj.jdbc.Driver","maximum_pool_size" = "30", -- 增加最大连接数"minimum_idle" = "5", -- 增加最小空闲连接数"idle_timeout" = "600000", -- 空闲连接超时时间(毫秒)"max_lifetime" = "1800000", -- 连接最大生命周期(毫秒)"connection_timeout" = "30000" -- 连接超时时间(毫秒)
);
SQL-2:
SHOW DATABASES FROM MY_CATA_MYSQL;database_1
database_2
information_schema
mysql
SQL-3:
SHOW TABLES FROM MY_CATA_MYSQL.database_1;tbl_1
tbl_2
tbl_3
tbl_4
三、Doris 中 CALL EXECUTE_STMT
说明
CALL EXECUTE_STMT
是 Doris 2.x 版本引入的一个存储过程,用于通过 JDBC Catalog 直接执行外部数据源(如 MySQL、PostgreSQL)的 SQL 语句。这个功能允许 Doris 作为中间层,将 DML 操作(如 INSERT、UPDATE、DELETE)透传到外部数据库,实现跨数据源的数据同步。
核心功能
- 跨源 DML 操作:支持对外部数据源执行 INSERT、UPDATE、DELETE 等修改语句。
- 事务支持:执行的 SQL 语句在外部数据源中遵循事务特性(原子性、一致性)。
- 参数传递:可通过变量动态传递 SQL 语句内容。
语法格式
CALL EXECUTE_STMT(catalog_name, -- 外部 Catalog 名称sql_statement -- 需要执行的 SQL 语句
);
示例:
-- 1、向 MySQL 表插入数据
CALL EXECUTE_STMT("mysql_catalog", "INSERT INTO test_table VALUES (1, 'data')");-- 2、UPSERT 操作(MySQL 特有语法)
CALL EXECUTE_STMT("mysql", "INSERT INTO test.test_mysql VALUES (1, 'M03', 'P02', 'Desc xxxx') ON DUPLICATE KEY UPDATE product_desc = VALUES(product_desc)");-- 3、更新 MySQL 表数据
CALL EXECUTE_STMT("mysql_catalog", "UPDATE test_table SET value = 'new' WHERE id = 1");-- 4、删除 MySQL 表数据
CALL EXECUTE_STMT("mysql_catalog", "DELETE FROM test_table WHERE id > 100");
使用限制
-
仅支持 DML 语句:
- 不支持 SELECT 查询(会报
Can not issue SELECT via executeUpdate()
错误)。 - 不支持 CREATE/DROP 等 DDL 语句。
- 不支持 SELECT 查询(会报
-
权限要求:
- 执行用户需要对 Catalog 有
LOAD
权限。 - 外部数据源用户需要有对应表的操作权限。
- 执行用户需要对 Catalog 有
-
SQL 语法限制:
- 必须使用外部数据库的原生语法(如 MySQL 的
INSERT...ON DUPLICATE KEY UPDATE
)。 - Doris 不会对 SQL 进行语法检查,错误会在执行时抛出。
- 必须使用外部数据库的原生语法(如 MySQL 的
-
结果处理:
- 不返回执行结果(如影响行数),只能通过查询验证。
常见错误及解决
-
Can not issue SELECT via executeUpdate()
:- 原因:尝试执行 SELECT 查询。
- 解决:改用
SELECT * FROM catalog.db.table
直接查询。
-
External catalog 'xxx' is not allowed in 'DeleteStmt'
:- 原因:直接在 DELETE 语句中使用外部 Catalog(如
DELETE FROM mysql.db.table
)。 - 解决:必须通过
CALL EXECUTE_STMT
执行。
- 原因:直接在 DELETE 语句中使用外部 Catalog(如
-
Connection is not available
:- 原因:JDBC 连接池耗尽或网络问题。
- 解决:调整 Catalog 连接池参数(如
maximum_pool_size
),检查网络连通性。
-
Can not issue empty query
:- 原因:SQL 语句为空或包含非法字符。
- 解决:检查 SQL 内容,避免空字符串或未转义的特殊字符。
最佳实践
-
参数化执行:
-- 在 DolphinScheduler 中通过变量传递 SQL CALL EXECUTE_STMT("mysql_catalog", "${delete_sql}");
-
批量操作:
-- 合并多条语句减少连接次数 CALL EXECUTE_STMT("mysql_catalog", "DELETE FROM t1; INSERT INTO t2 VALUES(...);");
-
事务控制:
-- 确保原子性 CALL EXECUTE_STMT("mysql_catalog", "START TRANSACTION; ...; COMMIT;");
-
异常处理:
- 先在外部数据库测试 SQL 语句的有效性。
- 通过日志监控执行结果(如 Doris FE 日志)。
适用场景
- 数据同步:将 Doris 中的计算结果实时写入外部数据库。
- 数据清理:定期删除外部数据库中的过期数据。
- ETL 流程:在复杂的数据处理流程中执行中间步骤。
四、 示例:在 DolphinScheduler 中使用
-- 1. 定义工作流参数
-- delete_sql = "DELETE FROM mysql_table WHERE id > 100"-- 2. 在 SQL 任务中执行
CALL EXECUTE_STMT("mysql_catalog", "${delete_sql}");
通过 CALL EXECUTE_STMT
,Doris 可以作为数据处理的中枢,灵活地与外部数据源交互,实现复杂的数据同步和处理逻辑。