Doris On ES
- ES中的多index分布式Join查询
- Doris和ES中的表联合查询,更复杂的全文检索过滤
- ES keyword类型字段的聚合查询:适用于index 频繁发生变化、单个分片文档数量千万级以上且该字段基数(cardinality)非常大
本文档主要介绍该功能的实现原理、使用方式等。
- FE:Frontend,Doris 的前端节点。负责元数据管理和请求接入。
- BE:Backend,Doris 的后端节点。负责查询执行和数据存储。
- Elasticsearch(ES):目前最流行的开源分布式搜索引擎。
- DataNode:ES的数据存储与计算节点。
- MasterNode:ES的Master节点,管理元数据、节点、数据分布等。
- scroll:ES内置的数据集游标特性,用来对数据进行流式扫描和过滤。
参数说明:
查询
基本条件过滤
扩展的esquery sql语法
通过esquery
函数将一些无法用sql表述的ES query如match、geoshape等下推给ES进行过滤处理,esquery
的第一个列名参数用于关联index
,第二个参数是ES的基本Query DSL
的json表述,使用花括号{}
包含,json的root key
有且只能有一个,如match、geo_shape、bool等
match查询:
geo相关查询:
select * from es_table where esquery(k4, '{
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
53
],
[
14,
52
]
},
"relation": "within"
}
}
}');
+----------------------------------------------+
| |
| Doris +------------------+ |
| | FE +--------------+-------+
| | | Request Shard Location
| +--+-------------+-+ | |
| ^ ^ | |
| | | | |
| +-------------------+ +------------------+ | |
| | | | | | | | |
| | +----------+----+ | | +--+-----------+ | | |
| | | BE | | | | BE | | | |
| | +---------------+ | | +--------------+ | | |
+----------------------------------------------+ |
| HTTP SCROLL | | HTTP SCROLL | |
+-----------+---------------------+------------+ |
| | v | | v | | |
| | +------+--------+ | | +------+-------+ | | |
| | | | | | | | | | |
| | | DataNode | | | | DataNode +<-----------+
| | | | | | | | | | |
| | | +<--------------------------------+
| | +---------------+ | | |--------------| | | |
| +-------------------+ +------------------+ | |
| Same Physical Node | |
| | |
| +-----------------------+ | |
| | | | |
| | MasterNode +<-----------------+
| ES | | |
| +-----------------------+ |
+----------------------------------------------+
创建ES外表后,FE会请求建表指定的主机,获取所有节点的HTTP端口信息以及index的shard分布信息等,如果请求失败会顺序遍历host列表直至成功或完全失败
查询时,会根据FE得到的一些节点信息和index的元数据信息,生成查询计划并发给对应的BE节点
BE节点会根据
就近原则
即优先请求本地部署的ES节点,BE通过HTTP Scroll
方式流式的从ES index的每个分片中并发的获取数据计算完结果后,返回给client端
一个重要的功能就是过滤条件的下推: 过滤条件下推给ES,这样只有真正满足条件的数据才会被返回,能够显著的提高查询性能和降低Doris和Elasticsearch的CPU、memory、IO利用率
SQL syntax | ES 5.x+ syntax |
---|---|
= | term query |
in | terms query |
> , < , >= , ⇐ | range |
and | bool.filter |
or | bool.should |
not | bool.must_not |
not in | bool.must_not + terms |
esquery | ES Query DSL |
ES的版本要求
ES主版本大于5,ES在2.x之前和5.x之后数据的扫描方式不同,目前支持5.x之后的
是否支持X-Pack认证的ES集群
支持所有使用HTTP Basic认证方式的ES集群
一些查询比请求ES慢很多