注意:说明:
注意:这篇档展示的内容仅适用于 Doris 1.1及以下版本,后续版本建议使用 Multi-Catalog 功能对接外部数据目录。
1. 支持 Iceberg 数据源接入Doris。
2. 支持 Doris 与 Iceberg 数据源中的表联合查询,进行更加复杂的分析操作。
这篇档主要介绍该功能的使用方式和注意事项等。
一、Doris 中创建 Iceberg 的外表
可以通过以下两种方式在 Doris 中创建 Iceberg 外表。建外表时无需声明表的列定义,Doris 可以根据 Iceberg 中表的列定义自动转换。
1. 创建一个单独的外表,用于挂载 Iceberg 表。
— 语法CREATE [EXTERNAL] TABLE table_name ENGINE = ICEBERG[COMMENT "comment"]PROPERTIES ("iceberg.database" = "iceberg_db_name","iceberg.table" = "icberg_table_name","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG");– 例子1:挂载 Iceberg 中 iceberg_db 下的 iceberg_tableCREATE TABLE `t_iceberg` ENGINE = ICEBERGPROPERTIES ("iceberg.database" = "iceberg_db","iceberg.table" = "iceberg_table","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG");– 例子2:挂载 Iceberg 中 iceberg_db 下的 iceberg_table,HDFS开启HACREATE TABLE `t_iceberg`ENGINE = ICEBERGPROPERTIES ("iceberg.database" = "iceberg_db","iceberg.table" = "iceberg_table","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG","dfs.nameservices"="HDFS8000463","dfs.ha.namenodes.HDFS8000463"="nn2,nn1","dfs.namenode.rpc-address.HDFS8000463.nn2"="172.**.**.**:4007","dfs.namenode.rpc-address.HDFS8000463.nn1"="172.**.**.**:4007","dfs.client.failover.proxy.provider.HDFS8000463"="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
2. 创建一个 Iceberg 数据库,用于挂载远端对应 Iceberg 数据库,同时挂载该 database 下的所有 table。具体相关语法,可以通过 CREATE DATABASE 查看。
— 语法CREATE DATABASE db_name [COMMENT "comment"]PROPERTIES ("iceberg.database" = "iceberg_db_name","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG");– 例子:挂载 Iceberg 中的 iceberg_db,同时挂载该 db 下的所有 tableCREATE DATABASE `iceberg_test_db`PROPERTIES ("iceberg.database" = "iceberg_db","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG");
iceberg_test_db 中的建表进度可以通过 HELP SHOW TABLE CREATION 查看。
也可以根据自己的需求明确指定列定义来创建 Iceberg 外表。
1. 创一个 Iceberg 外表
— 语法CREATE [EXTERNAL] TABLE table_name ( col_name col_type [NULL | NOT NULL] [COMMENT "comment"]) ENGINE = ICEBERG[COMMENT "comment"]PROPERTIES ("iceberg.database" = "iceberg_db_name","iceberg.table" = "icberg_table_name","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG");– 例子1:挂载 Iceberg 中 iceberg_db 下的 iceberg_tableCREATE TABLE `t_iceberg` ( `id` int NOT NULL COMMENT "id number", `name` varchar(10) NOT NULL COMMENT "user name") ENGINE = ICEBERGPROPERTIES ("iceberg.database" = "iceberg_db","iceberg.table" = "iceberg_table","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG");– 例子2:挂载 Iceberg 中 iceberg_db 下的 iceberg_table,HDFS开启HACREATE TABLE `t_iceberg` ( `id` int NOT NULL COMMENT "id number", `name` varchar(10) NOT NULL COMMENT "user name") ENGINE = ICEBERGPROPERTIES ("iceberg.database" = "iceberg_db","iceberg.table" = "iceberg_table","iceberg.hive.metastore.uris" = "thrift://172.**.**.**:9083","iceberg.catalog.type" = "HIVE_CATALOG","dfs.nameservices"="HDFS8000463","dfs.ha.namenodes.HDFS8000463"="nn2,nn1","dfs.namenode.rpc-address.HDFS8000463.nn2"="172.**.**.**:4007","dfs.namenode.rpc-address.HDFS8000463.nn1"="172.**.**.**:4007","dfs.client.failover.proxy.provider.HDFS8000463"="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
二、参数说明:
·外表列
·列名要于 Iceberg 表一一对应。
·列的顺序需要与 Iceberg 表一致。
·ENGINE 需要指定为 ICEBERG。
·PROPERTIES 属性:
·iceberg.hive.metastore.uris:Hive Metastore 服务地址。
·iceberg.database:挂载 Iceberg 对应的数据库名。
·iceberg.table:挂载 Iceberg 对应的表名,挂载 Iceberg database 时无需指定。
·iceberg.catalog.type:Iceberg 中使用的 catalog 方式,默认为 HIVE_CATALOG,当前仅支持该方式,后续会支持更多的 Iceberg catalog 接入方式。
三、展示表结构
展示表结构可以通过 SHOW CREATE TABLE 查看。
四、同步挂载
当 Iceberg 表 Schema 发生变更时,可以通过 REFRESH 命令手动同步,该命令会将 Doris 中的 Iceberg 外表删除重建,具体帮助可以通过 HELP REFRESH 查看。
— 同步 Iceberg 表REFRESH TABLE t_iceberg;– 同步 Iceberg 数据库REFRESH DATABASE iceberg_test_db;
五、类型匹配
支持的 Iceberg 列类型与 Doris 对应关系如下表:
| Iceberg | Doris | 描述 |
| BOOLEAN | BOOLEAN | – |
| INTEGER | INT | – |
| LONG | BIGINT | – |
| FLOAT | FLOAT | – |
| DOUBLE | DOUBLE | – |
| DATE | DATE | – |
| TIMESTAMP | DATETIME | Timestamp 转成 Datetime 会损失精度 |
| STRING | STRING | – |
| UUID | VARCHAR | 使用 VARCHAR 来代替 |
| DECIMAL | DECIMAL | – |
| TIME | – | 不支持 |
| FIXED | – | 不支持 |
| BINARY | – | 不支持 |
| STRUCT | – | 不支持 |
| LIST | – | 不支持 |
| MAP | – | 不支持 |
六、查询用法
完成在 Doris 中建立 Iceberg 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、物化视图等)外,与普通的 Doris OLAP 表并无区别。
select * from t_iceberg where k1 > 1000 and k3 ='term' or k4 like '%doris';
七、FE 配置
下面几个配置属于 Iceberg 外表系统级别的配置,可以通过修改 fe.conf 来配置,也可以通过 ADMIN SET CONFIG 来配置。
·iceberg_table_creation_strict_mode
创建 Iceberg 表默认开启 strict mode。strict mode 是指对 Iceberg 表的列类型进行严格过滤,如果有 Doris 目前不支持的数据类型,则创建外表失败。
·iceberg_table_creation_interval_second
自动创建 Iceberg 表的后台任务执行间隔,默认为 10s。
·max_iceberg_table_creation_record_size
Iceberg 表创建记录保留的最大值,默认为 2000。仅针对创建 Iceberg 数据库记录。