苏州网站设计网站中国建设银行官网个人网上银行
一、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 可以作为数据处理的中枢,灵活地与外部数据源交互,实现复杂的数据同步和处理逻辑。
