暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

腾讯一面:Doris有哪几种方式连接外部表?

大数据技能圈 2023-10-31
313

Doris外部表包括ODBC外部表、Hive外部表、ES外部表和Iceberg外部表。用户可以借助Doris查询引擎来查询外部数据库中的数据,实现类似于联邦查询的效果。当然,外部表的性能受到源库和网络传输的限制,性能较Doris相差甚远。除特殊场景外,建议先将数据同步到Doris再进行查询,或者仅查询外部表的少量数据。

1

ODBC外部表

ODBC外部表省去了烦琐的数据导入工作,让Doris具有了访问各种数据库的能力,并借助Doris本身的OLAP能力来解决数据分析问题。

ODBC外部表支持各种数据源中的数据接入Doris;支持Doris与各种数据源中的表联合查询,完成更复杂的分析操作;支持通过INSERT INTO语句将Doris查询结果写入外部数据源。

本节主要介绍如何创建基于ODBC协议访问的外部表,以及如何导入这些外部表中的数据。目前,Doris支持的数据源包括MySQL、Oracle、PostgreSQL等。

使用ODBC外部表,首先需要在所有BE节点安装相同的驱动,并且安装路径相同,同时有相同的be/conf/odbcinst.ini配置。

ODBC软件安装及配置在2.4.1节已有详细介绍,这里访问MySQL数据库的链接信息如下:

如果还需要访问其他数据库,例如Oracle、PostgreSQL,可以自行百度安装ODBC驱动并完成ODBC配置和数据库连接。

配置完成以后,通过isql-v验证数据库连接是否成功,如图9-1所示。

图9-1 验证数据库连接是否成功

ODBC外部表创建有两种方式。

第一种是直接将连接信息描述在建表语句中,例如:

然后执行查询,结果如图9-2所示。

图9-2 通过ODBC查询MySQL数据

第二种是通过创建资源的形式统一管理连接信息,并在建表语句中引用该资源。

推荐使用第二种方式,因为可以复用数据库连接信息。

ODBC连接参数说明如表9-1所示。

表9-1 ODBC连接参数

创建的ODBC外部表不仅可以用于读取数据,还可以用于插入数据。这里还是以odbc_event_log2为例插入数据,虽然原表中event_id、create_time、update_time可以自动生成,但是通过Doris插入数据时还是需要给出字段值。操作截图如图9-3所示,在缺少字段的情况下会报错。

图9-3 通过ODBC向My SQL表插入数据

ODBC外部表不支持更新和删除数据,报错截图如图9-4所示。

图9-4 通过ODBC更新和删除MySQL表的数据时报错

对于创建Oracle、PostgreSQL数据库的外部表,只需要安装对应数据库的ODBC驱动,并将odbc_type和driver修改成对应数据库的名称。我们找到be/conf/odbcinst.ini,可以看出其默认配置的就是这三种数据库,截图如图9-5所示。也就是说,Doris读取的ODBC配置文件不是ODBC软件自带的,而是Doris内置的。

图9-5 ODBC配置示例

然后,不同来源数据库的表字段类型和Doris中的表字段类型进行映射和转换。以上三种数据库中常用表字段类型和Doris中表字段类型的对应关系如表9-2所示。

表9-2 不同数据库中表字段类型

此外,对于ODBC外部表,我们还有以下注意要点。

❑对于ODBC外部表,除了无法使用Doris中的数据模型(ROLLUP、预聚合、物化视图等)外,与普通的Doris表在查询方面并无区别。但是,ODBC外部表不支持更新和删除数据操作。

❑ODBC外部表本质上是通过单一ODBC客户端访问数据源,因此并不适合一次性导入大量数据,建议分批多次导入。

❑对于外部表的查询,Doris本质上是通过某个BE节点上的ODBC客户端对外部数据源进行连接和查询,所以要求外部数据源和BE节点双向连通。

最后,Doris查询外部表时并不是分布式查询,而是将单个BE节点作为客户端连接目标数据库进行查询并获取数据,所以性能上要远低于Doris内部表。ODBC外部表比较适用的场景是对一些频繁更新的维度表和Doris中存储的事实表进行关联查询,支持通过INSERT INTO SELECT语句将外部数据源中的数据同步到Doris。

2

Hive外部表

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

Hive外部表支持将Hive数据源接入Doris,并与Doris内部表进行联合查询或者更复杂的分析操作。

Hive外部表创建有两种方式。

方式一:Doris直接基于HDFS创建外部表。与访问MySQL类似,Doris访问HDFS文件之前,需要提前建立与之相对应的外部表,具体如下:

参数说明如下。

❑broker_name:Broker的名字。

❑path:HDFS文件路径。

❑column_separator:列分隔符。

❑line_delimiter:行分隔符。

Doris不能直接访问HDFS文件,需要通过Broker进行访问,所以建表时除了需要指定HDFS文件的相关信息之外,还需要指定Broker的相关信息。关于Broker的相关介绍,读者可以参见5.3节。

方式二:Doris基于Hive创建外部表。

一个Hive资源对应一个Hive集群,管理Doris使用的Hive集群的相关配置。创建Hive表时需要指定使用的Hive资源。

创建数据库:

创建Hive外部表:

Hive外部表有以下限制。

1)当前,Hive外部表仅支持Text、Parquet和ORC存储格式。

2)Hive外部表的列名要与Hive表的列名一一对应,列的顺序需要与Hive表的列的顺序一致,并且必须包含Hive表中的全部列。

3)Hive外部表的分区列无须通过partition by语句指定,需要与普通列一样定义到描述列表中。

4)当前,Doris默认支持的Hive版本为2.3.7、3.1.2,未在其他版本中进行测试。5)Hive表Schema变更不会自动同步,需要在Doris中重建。

Hive和Doris列类型对比如表9-3所示。

表9-3 Hive和Doris列类型对比

Hive外部表只支持Doris查询操作,不支持删除和修改操作,也不支持创建ROLLUP、物化视图等数据库对象。

3

ES外部表

ElasticSearch(以下简称ES)是一个分布式搜索引擎,底层基于Lucene实现。ES屏蔽了Lucene的底层细节,具有分布式特性,同时对外提供了RESTful API。ES以其易用性迅速赢得大量用户,被用在网站搜索、日志分析等诸多方面。由于ES具有强大的横向扩展能力,很多人会直接将其当作NoSQL来用。

ES的优点是索引,支持多列索引,甚至支持全文语义索引(如term、match、fuzzy等);缺点是没有分布式计算引擎,不支持关联操作等。与ES相反,Doris具备丰富的SQL计算能力,以及分布式查询能力,然而索引性能较低,不支持全文索引。

在Doris数据库中创建ES外部表后,FE会请求建表语句指定的主机,获取所有节点的HTTP端口信息以及索引分片信息等,如果请求失败,FE会按顺序遍历主机列表,直至获取成功或完全失败。当用户发起针对ES外部表的查询时,Doris会根据FE得到的一些节点信息和索引元数据信息,生成查询计划并发给对应的BE节点。BE节点会依据就近原则优先请求本地部署的ES节点,通过HTTP Scroll方式流式地在每个索引分片中并发地从source或DocValue中获取数据并进行计算。BE节点完成计算后将结果返给用户。

本节主要介绍该功能的简单使用方法。

第一步:建立一张ES索引表。

第二步:向ES索引表导入数据。

第三步:创建一张基于ES索引的Doris外部表。

ES参数说明如表9-4所示。

表9-4 ES参数说明

在Doris中创建ES外部表,引擎必须指定为ES。Doris表中的列名需要和ES中的字段名完全匹配,字段类型应该保持一致。此外,PROPERTIES部分还有几个关键参数。

1)enable_docvalue_scan:是否开启从ES列式存储中获取查询字段的值,默认为false,表示关闭。开启后,Doris从ES列式存储中获取数据时会遵循以下两个原则。

❑尽力而为:自动探测要读取的字段是否开启列式存储,如果获取的字段全部为列式存储,Doris会从列式存储中获取所有字段的值。

❑自动降级:要获取的字段只要有一个字段没有开启列式存储,所有字段的值都会从行存_source中解析获取。

2)enable_keyword_sniff:是否对ES中字符串分词类型(text)进行探测,获取额外的未分词(Keyword)字段名,默认为true。在ES中,可以不建立索引直接进行数据导入,因为ES会自动创建一个新的索引。针对字符串类型字段,ES会创建一个既有text类型的字段又有Keyword类型的字段,这就是ES的Multi-fields特性。

3)es_nodes_discovery:是否开启ES节点,默认为true。当配置为true时,Doris将从ES中找到所有可用的数据节点。如果ES中数据节点的地址不能被BE节点访问,该参数设置为false。ES集群部署在与公共网络隔离的内网,需用户通过代理访问。

4)http_ssl_enabled:ES是否开启HTTPS访问模式,默认为false。

Doris基于ES外部表的查询还有一个重要功能:过滤条件的下推。将过滤条件下推给ES,只有真正满足条件的数据才会被ES发送到Doris的BE节点,这样能够显著提高查询性能和降低CPU、内存占用。

表9-5中SQL操作符可优化成对应的ES操作符,以过滤数据。

表9-5 SQL操作符和ES操作符对应关系表

在Doris中创建的ES外部表也无法使用ROLLUP、物化视图等。更多关于ES外部表的用法,读者可以查看Doris官方文档。

4

Iceberg外部表

Iceberg是由Netflix开发并开源的、用于庞大分析数据集的开放表格式。Iceberg在Presto和Spark中添加了使用高性能格式的表。官方对Iceberg的定义是一种表格式。我们可以简单理解为Iceberg是基于计算层(Flink、Spark)和存储层(ORC、Parquet)的一个中间层。

Iceberg与存储层的存储格式(比如ORC、Parquet之类的列式存储格式)的最大的区别是,它并不定义数据存储方式,而是定义数据的组织方式,向上提供统一的表的语义。它构建在存储层之上,存储层中的数据仍然以Parquet、ORC格式等进行存储。Iceberg并未绑定于某一特定引擎,实现了通用的数据组织格式,方便与不同引擎(如Flink、Hive、Spark)对接。

Iceberg作为“数据湖三剑客”之一,得到了广泛应用。在数据仓库中引入Iceberg,主要是为了解决以下两个痛点。

❑T+0的数据落地和处理。传统的数据处理流程(从数据入库到数据处理)通常需要一个较长的环节,涉及许多复杂的逻辑来保证数据的一致性,且由于架构复杂,整个流水线延时明显。Iceberg的ACID能力可以简化整个流水线的设计,缩短整个流水线的延时。

❑降低数据修正的成本。传统Hive、Spark在修正数据时需要先读取数据,修正后再写入,产生极大的成本。Iceberg的修改、删除能力能够有效降低开销,提高效率。

Doris支持通过外部表的方式查询Iceberg数据湖中的数据,以实现对数据的极速分析。本节介绍如何在Doris中创建外部表,如何查询Iceberg中的数据。

创建Iceberg外部表的前提条件是Doris有权限访问Iceberg对应的Hive Metastore、HDFS集群或者对象存储的Bucket。目前,Iceberg外部表仅支持Catalog类型为Hive且数据存储格式为Parquet或者ORC,支持写时复制(Copy On Write)的表。同时,Iceberg外部表只能用于读取数据,不能写入数据。

在Doris中创建Iceberg外部表有两种方式。

方式一:单独创建一个外部表,用于挂载Iceberg表,示例如下。

方式二:创建一个Iceberg数据库,用于挂载远端对应的Iceberg数据库iceberg_db,同时挂载iceberg_db数据库下的所有表,示例如下。

通过上述两种方式创建Iceberg外部表时无须声明表的列定义,Doris可以根据Iceberg表的列定义自动转换。Doris表字段类型和Iceberg表字段类型默认匹配如表9-6所示。

表9-6 Doris表字段类型和Iceberg表字段类型默认匹配对照

如果Iceberg表结构发生变更,Doris不会自动同步,需要执行REFRESH命令来刷新Iceberg外部表的元数据。该命令会将Doris中的Iceberg外部表删除重建。

我们也可以根据需求明确指定列定义来创建Iceberg外部表,但是需要自定义列名与Iceberg表列名一一对应,并且列顺序需要与Iceberg表的列顺序一致。Doris中建立的Iceberg外部表仅用于查询分析,不支持修改和删除数据操作,也不支持创建物化视图和ROLLUP对象等。

参考:Doris实时数仓实战:https://weread.qq.com/web/reader/e3432570813ab8029g019a69k6f4322302126f4922f45dec

点击蓝字

关注我们

文章转载自大数据技能圈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论