Apache Druid本质就是一个分布式支持实时数据分析的数据存储系统。
能够快速的实现查询与数据分析,高可用,高扩展能力。
距离上一次更新刚过了二十多天,距离0.17版本刚过了三个多月,Druid再次迎来重大更新,Druid也越来越强大了。
Apache Druid 0.18.0 本次更新了 42位贡献者的200多个新功能,性能增强,BUG修复以及文档改进。
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
如果适合需求,请考虑使用该功能。druid.d JOIN lookup.l ON d.field = l.field
如果d.field
为字符串,则性能最好。未来的工作:
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内存中实现的最大行数
现在支持GROUPING SETS,允许您将多个GROUP BY子句组合为一个GROUP BY子句。
Druid现在支持SQL的动态参数。要使用动态参数,请用问号(?
)字符替换查询中的所有文字。
applyLimitPushDownToSegments
默认禁用applyLimitPushDownToSegments
已在0.17.0中添加,但是如果查询处理涉及许多段,则可能导致性能下降。这是因为“限制下推到分段扫描”会为每个分段初始化一个聚合缓冲区,其开销不可忽略。仅以后当查询涉及每个历史或实时任务的段数相对较少时,才启用此配置。
Kinesis索引服务现在提供下面列出的新滞后指标:
ingest/{supervisor type}/lag/time
:流中最新偏移量的总时间(以毫秒为单位)
ingest/{supervisor type}/maxLag/time
:流的最新偏移量之后的最长时间(以毫秒为单位)
ingest/{supervisor type}/avgLag/time
:流的最新偏移量之后的平均时间(以毫秒为单位)
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中删除。
Druid现在支持Java11。您可以使用Java 11运行与Java 8相同的Druid二进制包。我们在Travis上进行的测试包括:
从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
德鲁伊0.18.0包括40个错误修复。有关错误修复的完整列表,请参见https://github.com/apache/druid/pulls?page=1&q=is%3Apr+milestone%3A0.18.0+is%3Aclosed+label%3ABug