Druid-0.10.0新特性
1. 内置SQL查询
Druid在该版本提供了一个由Apache Calcite支持的内置SQL查询。它提供了两种查询类型:HTTP POST和JDBC。这为开发人员提供了一种新的JSON查询方式的替代方案,并且可以更容易的集成已有原生SQL的应用程序。该版本的SQL尚无法支持全部的JSON功能。在未来的版本中会陆续支持。
启用Druid的SQL查询的方式为在配置文件中设置:druid.sql.enable = true
该特性的详细信息请参考:http://druid.io/docs/0.10.0/querying/sql.html
2. 数字维度
Druid现在在ingest和query时支持数字维度。用户可以使用LONG或FLOAT的列作为维度。也就是说,如果启用rollup,数字维度会作为注入时间的部分分组键而不是用做聚合器的分组键。
数字列和字符串列之间存在性能折衷。数字列在运算时通常比字符串列更快。但由于数据列没有索引,所以在过滤方面,即在查询时用作Filter的时候,字符串列会更胜一筹。
该部分的注入的详细信息:http://druid.io/docs/0.10.0/ingestion/schema-design.html#numeric-dimensions
该部分的查询的详细信息:http://druid.io/docs/0.10.0/querying/dimensionspecs.html
3. Kerberos验证支持
该版本增加了一个新的“druid-kerberos”扩展。它使用Kerberos增加了对使用Druid节点用户身份的验证支持。它使用简单且受保护的GSSAPI协商机制SPNEGO(https://en.wikipedia.org/wiki/SPNEGO)通过HTTP进行身份验证。
详细信息:http://druid.io/docs/0.10.0/development/extensions-core/druid-kerberos.html
4. 索引任务的改进
为了提升性能,索引任务(indexing-service )进行了重写。特别是对于跨多个时间段产生很多分片的job。现在segmentGranularity间隔能够自动确定,不再需要特殊指定。但如果用户指定了numShards和intervals,注入时间有可能会缩短。
此外,索引任务现在支持appendToExisting标志,该标志使数据被索引为当前版本的附加分片,而不是新版本遮盖了以前的版本。
详细信息:http://druid.io/docs/0.10.0/ingestion/tasks.html#index-task
5. Like过滤器
Druid现在支持like filter。跟SQL中的like用法一样。like filter比regex filter速度更快。请尽可能的使用like filter代替regex filter。特别是:like filter中的前缀过滤(bar%)速度远高于regex filter(^bar.*)。
详细信息:http://druid.io/docs/0.10.0/querying/filters.html#like-filter
6. Large Columns
Druid现在支持单列大于2GB。这个功能必是必须的,因为指导手册一般引导大家把单列的大小控制在500M-1GB中间。但这个功能在其中一列比其他列大得多的情况下(比如large sketches)很有用。
此功能不需要特殊配置。但是如果重写了定制Metrics列的Druid扩展的用户,如果你们想支持大列,请重写你们的ComplexMetricsSerde实现类的getSerializer()方法。
7. Coordinator/Overlord合并选项
现在Druid支持将Coordinator和Overlord合并到Coordinator流程中以简化部署。设置方法:
在Coordinator中正确的设置 druid.coordinator.asOverlord.enabled 和 druid.coordinator.asOverlord.overlordService 。
然后停掉你的Overlords。Overlord Console可以在这里看:http://coordinator-host:port/console.html
PS:这只是一个体验feature。默认是关闭的。未来版本可能会默认打开。
详细信息:http://druid.io/docs/0.10.0/configuration/coordinator.html
8. 以下参考值变为默认值:
1)Druid 0.9.0中引入的buildV9Directly现在默认启用。此选项将直接创建V9数据格式的segment。如有必要,请将buildV9Directly设置为false以回滚为以前的索引生成方式。
2)在Druid 0.9.2中引入的v2 groupBy引擎现在默认启用。 新的groupBy引擎重新改写,以获得更好的性能和内存管理。 如有必要,您可以通过将runtime.properties中的“druid.groupBy.query.defaultStrategy”或查询上下文中的“groupByStrategy”设置为“v1”来回滚到旧引擎。 有关groupBy v1和v2之间区别的详细信息,请参阅http://druid.io/docs/0.10.0/querying/groupbyquery.html。
9. 其他性能提升
1)Concise bitmap的并,交,迭代优化。(#3883)
2)基于DimensionSelector的值匹配优化。(#3858)
3)选择index-based 还是cursor-based执行的查询策略。 (#3792)
4)Bitset迭代优化。 (#3753)
5)“all”粒度的groupBy查询优化。 (#3740)
6)DefaultObjectMapper写入后禁用flush。(#3748)
7)Short-circuiting AND filter 。(#3676)
8)IndexMergerV9性能提升。(#3440)
10. 新扩展
- ambari-metrics-emitter (#3767) by @nishantmonu51
- druid-kerberos (#3853) by @nishantmonu51
- google-extensions (#2458) by @erikdubbelboer
- scan-query (#3307) by @kaijianding
- sqlserver-metadata-storage (#3421) by @mark1900
- thrift-extensions (#3418) by @du00cs
- time-min-max (#3299) by @sirpkt
- virtual-columns (#2511) by @navis
Druid 0.10.1新特性:
1. TopN查询性能改进
在历史节点上使用1-2个聚合器处理TopN查询的速度现在提高了2-4倍。 这通过新的运行时检查逻辑完成,该逻辑生成查询处理类的单形实现(monomorphic implementations),从而减少TopN查询执行路径中的多态性。
这里有个关于该功能的PR:https://github.com/druid-io/druid/issues/3798
2. 优化GroupBy查询中的limit
Druid现在可以通过将limit在查询时发送到实时/历史节点。在把查询结果送回到Broker之前,先进行部分的limit操作。
详细信息: http://druid.io/docs/0.10.1/querying/groupbyquery.html#query-context
PR:#3873
3. Hadoop索引支持Amazon S3A
Amazon S3A现在支持作为批量的Deep Storage。
4. ProtoBuf 3.0支持以及其他改进
Druid添加了对摄入Protobuf 3.0数据的支持,以及其他增强功能,例如从URL读取Protobuf描述符。 支持Protobuf的代码也被移植到自己的核心扩展中。
有关文档,请参阅http://druid.io/docs/0.10.1/development/extensions-core/protobuf.html
5. HTTP Firehose
增加了一个新的Firehose实时摄取,通过HTTP从URL列表中读取数据。
请参阅http://druid.io/docs/latest/ingestion/firehose.html#httpfirehose
6. 改进了从云存储实时索引的磁盘空间管理
针对Microsoft Azure,Rackspace云文件,Google云存储和Amazon S3的Firehose实施现在支持缓存和预取数据。 这些Firehose现在可以对输入数据的一部分进行操作,并根据需要提取新数据,而不必完全读取Firehose写磁盘。
有关文档,请参阅以下链接:
http://druid.io/docs/0.10.1/development/extensions-contrib/azure.html
http://druid.io/docs/0.10.1/development/extensions-contrib/cloudfiles.html
http://druid.io/docs/0.10.1/development/extensions-contrib/google.html
http://druid.io/docs/0.10.1/development/extensions-core/s3.html
7. Coordinator lookups管理改进
针对查询时间查询的状态管理/同步逻辑进行了一些增强,包括查找规格的版本化。请参阅: http://druid.io/docs/0.10.1/querying/lookups.html
8. Kafka metrics emitter
已经添加了一个新的metrics emitter,可以将指标数据以JSON格式发送到Kafka。
参见 http://druid.io/docs/0.10.1/development/extensions-contrib/kafka-emitter.html9. 列比较过滤器
新增了列比较过滤器。此过滤器允许用户比较行内各列的值,如SQL中的“WHERE columnA = columnB”子句。
有关文档,请参阅 http://druid.io/docs/0.10.1/querying/filters.html#column-comparison-filter10. Druid SQL改进
Druid 0.10.1对Druid SQL有一些增强,例如对查找的支持(由@gianm提供PR):
#4368 - 更宽容的Avatica服务器#4109 - 支持另一种形式的过滤聚合器
#4085 - 压缩排序链的规则
#4055 - 添加SQL REGEXP_EXTRACT函数
#3991 - 使行提取可扩展并为查找添加一个
#4028 - 支持强制转为DECIMAL
#3999 - 能够生成完全不同的计数查询
11. 其他性能改进
Druid 0.10.1有许多其他性能改进,包括:
#4364 - 解压流不必首先下载到tmp#4315 - 服务器选择器改进
#4110 - 从IngestSegmentFirehose中删除“guanularity”
#4038 - 把DateTime序列化为long以提高json serde的性能
Druid 0.11.0 新特性
1. TLS支持
Druid现在支持TLS,支持加密客户端和节点间通信。
有关配置和相关扩展的详细信息,请参阅http://druid.io/docs/0.11.0/operations/tls-support.html。2. 认证/授权扩展点
用于验证和授权请求的扩展点已添加到Druid。
有关配置和扩展实现的信息,请参阅http://druid.io/docs/0.11.0/configuration/auth.html。现有的Kerberos身份验证扩展已更新为实现新的身份验证器接口。
3. 双列支持
Druid现在支持双类型聚合器列。
有关新Double聚合器的文档,请参阅http://druid.io/docs/0.11.0/querying/aggregations.html。4. 缓存成本均衡策略
鼓励升级到0.11.0的用户在他们的协调员上尝试新的cachingCost段平衡策略。该策略在现有成本平衡策略方面提供了巨大的性能改进,并且计划在0.11.0之后的版本中成为默认策略。
可以通过在协调器上设置以下属性来选择此策略:
druid.coordinator.balancer.strategy = cachingCost5. JSON解析器支持jq表达式
Druid的JSON输入解析器现在支持使用jackson-jq的jq表达式,在摄入之前启用更多输入转换。
有关更多详细信息,请参阅http://druid.io/docs/0.11.0/ingestion/flatten-json.html6. Redis缓存扩展
使用Redis的新缓存实现已添加到扩展中,并在#4615中由@QiuMM添加。
7. GroupBy性能改进
@jihoonson在以下PR中为GroupBy查询添加了几项新的性能优化:
#4660 为ConcurrentGrouper并行排序#4576 针对groupBy查询的基于数组的聚合
#4668 添加IntGrouper以避免在基于阵列的聚合中进行不必要的装箱/取消装箱
PR#4660 通过并行部分结果排序提供了一般性改进,而PR#4576和#4668在单个字符串列上进行分组时提供了显着改进。
8. SQL改进
各种改进和功能已被添加到Druid SQL:
#4750 - TRIM支持#4720 - 四舍五入数
#4561 - SQL查询的度量标准
#4360 - 支持SQL表达式
Druid 0.12.0新特性:
1. Kafka索引增量handoff和partition 解耦
Kafka索引服务现在支持增量handoff,以及将由Kafka索引任务创建的segment数与Kafka partition数数解耦。
请参阅#4815(评论)了解更多信息。2. 优先任务锁定
Druid现在支持索引任务锁的优先级。当索引任务需要获取数据源+时间间隔的锁定时,较高优先级的任务现在可以抢占较低优先级的任务。
有关更多信息,请参阅http://druid.io/docs/0.12.0-rc1/ingestion/tasks.html#task-priority。3. 改进了自动细分管理
1)自动Pending Segment清理
索引任务在元数据存储的“pendingSegments”表中创建记录。在0.12.0之前,这些临时条目并未自动清理,导致随着时间的推移集群性能可能下降。Druid 0.12.0允许协调器自动清除暂挂段表中未使用的条目。通过在协调器属性中设置druid.coordinator.kill.pendingSegments.on = true来启用此功能。
2)压缩任务
压缩segment(在一个给定的时间段内将一批小的segment合并成几个大的segment)是一个常见的Druid batch case。
Druid 0.12.0现在支持一个压缩任务,它将给定时间间隔内的所有segment合并到一个segment中。有关更多详细信息,请参阅http://druid.io/docs/0.12.0-rc1/ingestion/tasks.html#compaction-task。
3)测试统计后聚合器
新的z-score和p-value测试统计后聚合器已被添加到druid-stats扩展中。
有关更多详细信息,请参阅http://druid.io/docs/0.12.0-rc1/development/extensions-core/test-stats.html。4)Numeric quantiles sketch aggregator
Numeric quantiles sketch aggregator已经被增加到druid-datasketches扩展中。
5)基本身份验证扩展
Druid 0.12.0包含一个新的身份验证/授权扩展,提供基本的HTTP身份验证和简单的基于角色的访问控制。
有关更多信息,请参阅http://druid.io/docs/0.12.0-rc1/development/extensions-core/druid-basic-security.html。6)查询请求排队改进
目前,客户端可能无意中通过发送太多的请求而无意中堵死了broker,这些请求在无限制的Jetty工作池队列中排队。客户端通常会在某个客户端超时后关闭连接,但jetty将继续处理这些请求,从而导致无法响应。同时,客户将继续重试,继续向已经过载的broker添加请求。
在代理配置和历史配置中新引入的属性druid.server.http.queueSize和druid.server.http.enableRequestLimit允许用户配置请求拒绝,以防止客户使用查询压倒broker和historical node。7)分析批量支持
对于定制摄取解析扩展的开发人员,现在可以使InputRowParsers从单个输入行中返回多个InputRows。这可以通过减少对Druid之外的输入转换的需求来简化ingest pipeline。
4. 性能改进
1)SegmentWriteOutMedium
创建新segment时,Druid会将一些预处理数据存储在临时缓冲区中。在0.12.0之前,这些缓冲区总是保存在磁盘上的临时文件中。在0.12.0中,允许将这些临时缓冲区存储在堆外内存储器中,从而减少摄入期间磁盘I / O操作的数量。要为这些缓冲区启用堆外存储器,需要相应地配置druid.peon.defaultSegmentWriteOutMediumFactory属性。如果为临时缓冲区使用堆外存储器,请确保-XX:MaxDirectMemorySize增加以适应更高的直接内存使用量。详细信息请参阅http://druid.io/docs/0.12.0-rc1/configuration/indexing-service.html#SegmentWriteOutMediumFactory。
2)中间GroupBy结果的并行合并
允许用户配置多个处理线程,用于并行合并已写到到磁盘的中间GroupBy结果。在0.12.0之前,此合并步骤将始终在单个线程内进行。
有关配置详细信息,请参阅http://druid.io/docs/0.12.0-rc1/configuration/querying/groupbyquery.html#parallel-combine。3)其他性能改进
- DataSegment内存优化
- 删除IndexedInts.iterator()
- ExpressionSelectors:添加优化的选择器
5. SQL改进
各种改进和功能已被添加到Druid SQL:
- 改进时间表达式的翻译:#5107
- 添加TIMESTAMPADD:#5079
- 添加规则以修剪未使用的聚合:#5049
- 支持CASE风格的过滤排重计数:#5047
- 添加“数组”结果格式和文档结果格式:#5032
- 修复关于复杂聚合器的havingSpec:#5024
- 在将字符串隐式转换为日期/时间文字时改进了行为:#5023
- 为Avatica查询添加路由器连接均衡器:#4983
- 修复错误的的过滤器简化规则:#4945
- 修复SQL查询的路由器处理:#4851