Iceberg External Table of Doris

Iceberg External Table of Doris 提供了 Doris 直接访问 Iceberg 外部表的能力,外部表省去了繁琐的数据导入工作,并借助 Doris 本身的 OLAP 的能力来解决 Iceberg 表的数据分析问题:

  1. 支持 Iceberg 数据源接入Doris
  2. 支持 Doris 与 Iceberg 数据源中的表联合查询,进行更加复杂的分析操作

本文档主要介绍该功能的使用方式和注意事项等。

名词解释

Doris 相关

  • FE:Frontend,Doris 的前端节点,负责元数据管理和请求接入
  • BE:Backend,Doris 的后端节点,负责查询执行和数据存储

使用方法

Doris 中创建 Iceberg 的外表

可以通过以下两种方式在 Doris 中创建 Iceberg 外表。建外表时无需声明表的列定义,Doris 可以根据 Iceberg 中表的列定义自动转换。

  1. 创建一个单独的外表,用于挂载 Iceberg 表。 具体相关语法,可以通过 CREATE TABLE 查看。

1. -- 语法 2. CREATE [EXTERNAL] TABLE table_name 3. ENGINE = ICEBERG 4. [COMMENT "comment"] 5. PROPERTIES ( 6. "iceberg.database" = "iceberg_db_name", 7. "iceberg.table" = "icberg_table_name", 8. "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083", 9. "iceberg.catalog.type" = "HIVE_CATALOG" 10. );

1. -- 例子1:挂载 Iceberg 中 iceberg_db 下的 iceberg_table
2. CREATE TABLE `t_iceberg`
3. ENGINE = ICEBERG
4. PROPERTIES (
5. "iceberg.database" = "iceberg_db",
6. "iceberg.table" = "iceberg_table",
7. "iceberg.hive.metastore.uris"  =  "thrift://192.168.0.1:9083",
8. "iceberg.catalog.type"  =  "HIVE_CATALOG"
9. );

11. -- 例子2:挂载 Iceberg 中 iceberg_db 下的 iceberg_table,HDFS开启HA
12. CREATE TABLE `t_iceberg`
13. ENGINE = ICEBERG
14. PROPERTIES (
15. "iceberg.database" = "iceberg_db",
16. "iceberg.table" = "iceberg_table",
17. "iceberg.hive.metastore.uris"  =  "thrift://192.168.0.1:9083",
18. "iceberg.catalog.type"  =  "HIVE_CATALOG",
19. "dfs.nameservices"="HDFS8000463",
20. "dfs.ha.namenodes.HDFS8000463"="nn2,nn1",
21. "dfs.namenode.rpc-address.HDFS8000463.nn2"="172.21.16.5:4007",
22. "dfs.namenode.rpc-address.HDFS8000463.nn1"="172.21.16.26:4007",
23. "dfs.client.failover.proxy.provider.HDFS8000463"="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
24. );
25. ```
  1. 创建一个 Iceberg 数据库,用于挂载远端对应 Iceberg 数据库,同时挂载该 database 下的所有 table。 具体相关语法,可以通过 CREATE DATABASE 查看。

``` 1. -- 语法 2. CREATE DATABASE db_name 3. [COMMENT "comment"] 4. PROPERTIES ( 5. "iceberg.database" = "iceberg_db_name", 6. "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083", 7. "iceberg.catalog.type" = "HIVE_CATALOG" 8. );

  1. -- 例子:挂载 Iceberg 中的 iceberg_db,同时挂载该 db 下的所有 table
  2. CREATE DATABASE iceberg_test_db
  3. PROPERTIES (
  4. "iceberg.database" = "iceberg_db",
  5. "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083",
  6. "iceberg.catalog.type" = "HIVE_CATALOG"
  7. ); ```

iceberg_test_db 中的建表进度可以通过 HELP SHOW TABLE CREATION 查看。

也可以根据自己的需求明确指定列定义来创建 Iceberg 外表。

  1. 创一个 Iceberg 外表

``` 1. -- 语法 2. CREATE [EXTERNAL] TABLE table_name ( 3. col_name col_type [NULL | NOT NULL] [COMMENT "comment"] 4. ) ENGINE = ICEBERG 5. [COMMENT "comment"] 6. PROPERTIES ( 7. "iceberg.database" = "iceberg_db_name", 8. "iceberg.table" = "icberg_table_name", 9. "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083", 10. "iceberg.catalog.type" = "HIVE_CATALOG" 11. );

  1. -- 例子1:挂载 Iceberg 中 iceberg_db 下的 iceberg_table
  2. CREATE TABLE t_iceberg (
  3. id int NOT NULL COMMENT "id number",
  4. name varchar(10) NOT NULL COMMENT "user name"
  5. ) ENGINE = ICEBERG
  6. PROPERTIES (
  7. "iceberg.database" = "iceberg_db",
  8. "iceberg.table" = "iceberg_table",
  9. "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083",
  10. "iceberg.catalog.type" = "HIVE_CATALOG"
  11. );

  12. -- 例子2:挂载 Iceberg 中 iceberg_db 下的 iceberg_table,HDFS开启HA

  13. CREATE TABLE t_iceberg (
  14. id int NOT NULL COMMENT "id number",
  15. name varchar(10) NOT NULL COMMENT "user name"
  16. ) ENGINE = ICEBERG
  17. PROPERTIES (
  18. "iceberg.database" = "iceberg_db",
  19. "iceberg.table" = "iceberg_table",
  20. "iceberg.hive.metastore.uris" = "thrift://192.168.0.1:9083",
  21. "iceberg.catalog.type" = "HIVE_CATALOG",
  22. "dfs.nameservices"="HDFS8000463",
  23. "dfs.ha.namenodes.HDFS8000463"="nn2,nn1",
  24. "dfs.namenode.rpc-address.HDFS8000463.nn2"="172.21.16.5:4007",
  25. "dfs.namenode.rpc-address.HDFS8000463.nn1"="172.21.16.26:4007",
  26. "dfs.client.failover.proxy.provider.HDFS8000463"="org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
  27. ); ```

参数说明:

  • 外表列
  • 列名要于 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 查看。

1. -- 同步 Iceberg 表
2. REFRESH TABLE t_iceberg;

4. -- 同步 Iceberg 数据库
5. 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 - 不支持

注意:

  • Iceberg 表 Schema 变更不会自动同步,需要在 Doris 中通过 REFRESH 命令同步 Iceberg 外表或数据库。
  • 当前默认支持的 Iceberg 版本为 0.12.0、0.13.2,未在其他版本进行测试。后续后支持更多版本。

查询用法

完成在 Doris 中建立 Iceberg 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、物化视图等)外,与普通的 Doris OLAP 表并无区别

1. 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 数据库记录。