Apache 本质上,Druid是一个支持实时数据分析的分布式数据存储系统。
查询和数据分析能够快速实现,可用性高,扩展能力高。
距离上次更新刚刚过了20多天,距离0.17版刚过了三个多月,Druid再次迎来重大更新,Druid也越来越强大。
Apache Druid 0.18.0 本次更新了 200多个新功能,42位贡献者,性能提升,BUG修复和文档改进。
Join支持新功能Join是数据分析的关键操作。在0.18.0之前,Druid支持一些与Join相关的功能,如SQL中的Lookups或半连接。然而,这些功能的用例非常有限。对于其他连接用例,用户在访问数据时必须标准化数据源,而不是在查询时添加数据源,这可能会导致数据量的激增和摄入时间的延长。
Druid 有史以来,0.18.0第一次支持真正的Join,Druid 目前支持INNER、LEFT和CROSSjoin。对于原生查询,join
Join作为一个新的数据源被引入,以表示两个数据源。
现在,只允许left-deepjoin。这意味着左边的数据源只允许一个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存储中将实现收集结果。在收集了groupby查询的所有结果后,Broker将用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 thandruid.server.http.numThreads
, but it is worth noting that likedruid.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现在支持GROUPI SETS,允许您使用多个GROUP BY句组合GROUP BY子句。
SQL动态参数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 与Java一起运行 同样的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.AllocationMetricCollectorjava.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 occurredWARNING: 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$1WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operationsWARNING: 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
Bug修复德鲁伊0.18.0包括40个错误修复。有关错误修复的完整列表,请参见https://github.com/apache/druid/pulls?page=1&q=is%3Apr+milestone%3A0.18.0+is%3Aclosed+label%3ABug
- 修复Superbatch合并最后一个分区边界(#9448)
- 转换器在流索引中重用(#9625)
- 保留压缩后数值类型尺寸的空值(#9622)
- Druidinputsource可以在重新摄取过程中添加新尺寸(#9590)
- 价值计数器溢出错误,而不是写错段(#9559)
- 用空值修复数字列上过滤器的一些问题(#9251)
- 修复Timestamp_format expr(#9282)
- 有时区的segmentGranularity设置(#8690)KIS任务失败时
- 分组问题通过提取Fn、表达式、连接等的限制来解决(#9662)