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表达式现在支持用于创建数组的类型化构造函数。可以使用显式类型定义数组。例如,<LONG>[1, 2, null]
创建的阵列LONG
型含1
,2
,和null
。请注意,您仍然可以创建没有显式类型的数组。例如,[1, 2, null]
仍然是创建等效数组的有效语法。在这种情况下,Druid将根据其元素推断数组的类型。此新语法也适用于空数组。<STRING>[]
,<DOUBLE>[]
以及<LONG>[]
将创建的空数组STRING
,DOUBLE
和LONG
类型。
自定义Transform
为开发人员公开了transform的扩展接口 详情:https://druid.apache.org/docs/0.18.0/development/modules.html#writing-your-own-extensions
chunkPeriod
已删除
chunkPeriod
从0.14.0开始不推荐使用,因为它的用法有限,现在,此查询已从0.18.0中删除。
支持Java 11
Druid现在支持Java11。您可以使用Java 11运行与Java 8相同的Druid二进制包。我们在Travis上进行的测试包括:
- 使用Java 11编译和运行单元测试
- 使用Java 8进行编译并使用Java 11运行集成测试
从Java 9开始,当发现某些库使用反射非法访问JDK的内部API时,它将发出警告。这些警告将通过在以后的版本中修改Druid代码或升级库版本来解决。目前,可以通过添加JVM选项(例如--add-opens
或)来抑制这些警告--add-exports
。
2020-01-22T21:30:08,893 WARN [main] org.apache.druid.java.util.metrics.AllocationMetricCollectors - Cannot initialize org.apache.druid.java.util.metrics.AllocationMetricCollector
java.lang.reflect.InaccessibleObjectException: Unable to make public long[] com.sun.management.internal.HotSpotThreadImpl.getThreadAllocatedBytes(long[]) accessible: module jdk.management does not "exports com.sun.management.internal" to unnamed module @6955cb39
可以通过添加禁止显示此警告--add-exports java.base/jdk.internal.perf=ALL-UNNAMED
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
可以通过添加禁止显示此警告--add-opens java.base/java.lang=ALL-UNNAMED
2020-01-22T21:30:08,902 WARN [main] org.apache.druid.java.util.metrics.JvmMonitor - Cannot initialize GC counters. If running JDK11 and above, add --add-exports java.base/jdk.internal.perf=ALL-UNNAMED to the JVM arguments to enable GC counters.
可以通过添加禁止显示此警告--add-exports java.base/jdk.internal.perf=ALL-UNNAMED
将Kafka客户端更新到2.2.2
Kafka客户端库已更新至2.2.2
Bug修复
德鲁伊0.18.0包括40个错误修复。有关错误修复的完整列表,请参见https://github.com/apache/druid/pulls?page=1&q=is%3Apr+milestone%3A0.18.0+is%3Aclosed+label%3ABug