Doris Catalog 通过提供统一的元数据管理和数据访问能力,支持 Flink 作业直接读写 Apache Doris 数据库中的表。您可以在 Flink SQL 中直接使用三段式表名(catalog.database.table)访问 Doris 数据表,无需在每次作业中重复配置连接参数。
Doris Catalog 通过 Flink Session 集群连接 Doris FE,获取 Doris 中的数据库、表、字段类型和字段注释等元数据。同步完成后,可以在数据目录中查看 Doris 元数据,并在 Flink SQL 任务中使用三段式名称引用已同步的 Doris 表。
Doris 中新增或删除表、增加字段、修改字段类型或字段注释后,需要重新同步 Catalog,使数据目录中的元数据与 Doris 保持一致。
在流式计算 Flink 版控制台的数据目录页面创建 Doris Catalog。
参数 | 说明 |
|---|---|
Catalog 类型 | 固定为 Doris。 |
Catalog 名称 | 必填。自定义 Catalog 名称。 |
Default database | 必填。Doris 默认数据库名。 |
Username | 必填。Doris 用户名。 |
Password | 必填。Doris 密码。 |
Fenodes | 必填。Doris FE 节点地址,格式如 |
| 必填。Doris JDBC 连接地址,格式如 |
Session 集群 | 必填。用于执行数据同步任务的 Session 集群。建议保持运行状态,否则同步任务可能失败。 |
在 Catalog 列表中找到目标 Catalog,然后根据需要单击 查看、编辑 或 删除。
在 Flink SQL 任务中,可以使用 catalog.database.table 三段式名称引用已同步的 Doris 表。以下示例中的 Catalog 名称、数据库名称、表名称和字段需替换为实际值。
以下示例使用 Datagen 连接器生成测试数据,并向包含 JSON 字段的 Doris Unique Key 表写入数据。目标表需要预先在 Doris 中创建并同步到数据目录。
CREATE TABLE datagen_source ( id INTEGER, name STRING, score INTEGER, user_info STRING ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '1', 'fields.id.kind' = 'sequence', 'fields.id.start' = '1', 'fields.id.end' = '20', 'fields.score.min' = '0', 'fields.score.max' = '100', 'fields.name.length' = '8', 'fields.user_info.length' = '10' ); INSERT INTO `<catalog_name>`.`<database_name>`.`<table_name>` SELECT id, name, score, JSON_OBJECT( KEY 'device' VALUE JSON_OBJECT( KEY 'os' VALUE IF(MOD(id, 2) = 0, 'iOS', 'Android') ), KEY 'level' VALUE score, KEY 'metadata' VALUE JSON_OBJECT( KEY 'raw_str' VALUE user_info ) ) AS user_info FROM datagen_source;
以下示例读取 Doris Catalog 表,将 JSON 字段解析为字符串,并通过 Print 连接器输出结果。
CREATE TABLE print_sink ( id INTEGER, name STRING, score INTEGER, parsed_os_type STRING, raw_user_info STRING ) WITH ( 'connector' = 'print' ); INSERT INTO print_sink SELECT id, name, score, JSON_VALUE(user_info, '$.device.os') AS parsed_os_type, user_info AS raw_user_info FROM `<catalog_name>`.`<database_name>`.`<table_name>`;
以下示例将 Doris Catalog 表作为 Lookup 表,根据处理时间与实时流进行时态表 Join。
CREATE TABLE realtime_stream ( req_id INTEGER, proc_time AS PROCTIME() ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '1', 'fields.req_id.kind' = 'sequence', 'fields.req_id.start' = '1', 'fields.req_id.end' = '5' ); CREATE TABLE print_sink ( req_id INTEGER, matched_name STRING, matched_score INTEGER, parsed_json_os STRING, raw_json STRING ) WITH ( 'connector' = 'print' ); INSERT INTO print_sink SELECT req_id, name AS matched_name, score AS matched_score, JSON_VALUE(user_info, '$.device.os') AS parsed_json_os, user_info AS raw_json FROM realtime_stream JOIN `<catalog_name>`.`<database_name>`.`<table_name>` FOR SYSTEM_TIME AS OF proc_time ON req_id = id;
检查 JDBC 查询地址、FE HTTP 地址、用户名、密码和网络连通性。元数据访问和数据写入可能使用不同地址,需要分别检查。
检查 Doris FE 是否可访问、账号是否具有元数据读取权限,以及 Session 集群是否运行。
检查 FE HTTP 地址、目标表写权限,以及源表与目标表的字段数量、顺序和类型是否兼容。