重大更新!Druid 0.18.0 发布—Join登场,支持Java11
独孤风 人气:2
![file](https://graph.baidu.com/resource/22268c03588bb54d4825b01587972667.png)
Apache Druid本质就是一个分布式支持实时数据分析的数据存储系统。
能够快速的实现查询与数据分析,高可用,高扩展能力。
距离上一次更新刚过了二十多天,距离0.17版本刚过了三个多月,Druid再次迎来重大更新,Druid也越来越强大了。
Apache Druid 0.18.0 本次更新了 42位贡献者的200多个新功能,性能增强,BUG修复以及文档改进。
# 新功能
### Join支持
Join是数据分析中的关键操作。在0.18.0之前,Druid支持一些与Join有关的功能,例如SQL中的Lookups或半联接。但是,这些功能的用例非常有限,对于其他联接用例,用户在摄取数据时必须对数据源进行规范化,而不是在查询时将其加入,这可能导致数据量激增和摄取时间延长。
Druid 0.18.0有史以来第一次支持真正的Join,Druid 目前支持INNER,LEFT和CROSS的join。对于原生查询,`join`作为新的数据源被引入,以表示两个数据源的Join。
当前,仅允许 *left-deep* join。这意味着左侧数据源仅允许一个`table`或另一个`join`数据源。对于右侧的数据源,`lookup`,`inline`,或者`query`数据源是允许的。
Druid SQL也支持Join了!其实本质上是SQL JOIN查询被转换为一个或几个包含原生查询。
Join会影响查询的性能,我们需要注意:
- LOOKUP函数性能更好,`LOOKUP`如果适合需求,请考虑使用该功能。
- 在Druid SQL中使用Join时,请记住,它会生成未明确包含在查询中的子查询。
- 式子查询生成的一个常见原因是相等的两半的类型是否不匹配。例如,由于查找键始终是字符串,因此`druid.d JOIN lookup.l ON d.field = l.field`如果`d.field`为字符串,则性能最好。
- 从Druid 0.18.0开始,join运算符必须评估每一行的条件。将来,我们希望同时进行早期条件评估和延迟条件评估,并希望在常规情况下可以大大提高性能。
未来的工作:
RIGHT OUTER 和 FULL OUTER JOIN
改善性能
### 内联查询
Druid现在可以通过内联子查询来执行嵌套查询。任何类型的子查询都可以位于另一个类型的子查询之上,例如以下示例:
```
topN
|
(join datasource)
/ \
(table datasource) groupBy
```
为了执行此查询,Broker首先评估groupBy子查询;它将子查询发送到数据节点并收集结果。收集的结果将在Broker存储中实现。Broker收集了groupBy查询的所有结果后,它将通过使用具有groupBy查询结果的内联数据源替换groupBy来重写topN查询。最后,将重写的查询发送到数据节点以执行topN查询。
### 查询通道和优先级
当一次运行多个查询时,有时您可能希望根据查询的优先级来控制查询的资源分配。例如,可能希望限制分配给不太重要的查询的资源,以便重要的查询可以及时执行,而不会因为不太重要的查询而中断。
使用查询通道,就可以控制查询工作负载的利用率。具体设置如下:
| Property | Description | Default |
| ----------------------------------------------- | ------------------------------------------------------------ | --------- |
| `druid.query.scheduler.numThreads` | Maximum number of HTTP threads to dedicate to query processing. To save HTTP thread capacity, this should be lower than `druid.server.http.numThreads`, but it is worth noting that like `druid.server.http.enableRequestLimit` is set that query requests over this limit will be denied instead of waiting in the Jetty HTTP request queue. | Unbounded |
| `druid.query.scheduler.laning.strategy` | 通道策略 | `none` |
| `druid.query.scheduler.prioritization.strategy` | 优先级策略 | `manual` |
#### 查询指标的新维度
subQueryId 每个子查询具有不同`subQueryId`的,但有相同的 `queryId`
#### 新配置
druid.server.http.maxSubqueryRows Broker内存中实现的最大行数
### SQL分组
现在支持GROUPING SETS,允许您将多个GROUP BY子句组合为一个GROUP BY子句。
### SQL动态参数
Druid现在支持SQL的动态参数。要使用动态参数,请用问号(`?`)字符替换查询中的所有文字。
# 重要变化
### `applyLimitPushDownToSegments` 默认禁用
`applyLimitPushDownToSegments`已在0.17.0中添加,但是如果查询处理涉及许多段,则可能导致性能下降。这是因为“限制下推到分段扫描”会为每个分段初始化一个聚合缓冲区,其开销不可忽略。仅以后当查询涉及每个历史或实时任务的段数相对较少时,才启用此配置。
### Kinesis的新滞后指标
Kinesis索引服务现在提供下面列出的新滞后指标:
- `ingest/{supervisor type}/lag/time`:流中最新偏移量的总时间(以毫秒为单位)
- `ingest/{supervisor type}/maxLag/time`:流的最新偏移量之后的最长时间(以毫秒为单位)
- `ingest/{supervisor type}/avgLag/time`:流的最新偏移量之后的平均时间(以毫秒为单位)
### 默认Roaring bitmaps
Druid 支持两种 bitmap, Roaring 和 CONCISE,由于性能原因,默认切换为 Roaring
### 数组表达式语法更改
Druid表达式现在支持用于创建数组的类型化构造函数。可以使用显式类型定义数组。例如,`
加载全部内容