Apache Druid 0.21.0版本发布说明

druid.org.cn注:Druid大约以3个月为周期发布一次版本。0.21.0按计划应该在1月份发布,但是中途遇到一些问题阻塞,包括一些安全性问题,延迟到日前才发布。

以下发布说明由druid.org.cn依据英文版发行说明整理。


Apache Druid社区于2021-04-28正式发布0.21.0版本,该版本包含来自 36 个贡献者的提交,涉及大约 120 个新功能、错误修复、性能增强、文档优化以及测试覆盖率提升。

新功能

运维

基于K8S的服务发现和Leader选举

新提供的基于K8S扩展支持基于K8S的服务发现和Leader选举。此扩展与基于 HTTP 的服务器视图 (设置druid.serverview.type=http) 和任务管理 (设置druid.indexer.runner.type=httpRemote) 配合使用,以便Druid集群可以在无需Zookeeper环境下运行。

该扩展在本版本被标记为实验性质(experimental)。请参阅该扩展的文档了解详细信息

与此特性相关的PR:

Coordinator新增动态配置项以改善Segment平衡性能

当发生Segment平衡时,Druid需要遍历所有可用的Segment以找到需要迁移的Segment文件。在一个大规模Druid集群中,Segment文件数通常非常多,这会导致性能问题。在本版本通过设置percentOfSegmentsToConsiderPerMove 以限制Segment平衡时待迁移的Segment数量,同时待迁移的Segment最多会搜索maxSegmentsToMove * 2次。这两个新增的配置可有效加快Segment平衡的速度。有关配置详情,详细参考Coodinator动态配置

相关PR: #10284

Indexer节点支持新增HTTP API接口

Indexer新增了statusselfDiscovered API接口。有关此接口详细信息,请参阅API文档。

相关PR: #10679

查询

新增grouping聚合功能

在当前版本可以与GROUPING SET或CUBE一同使用grouping聚合函数以指示当前分组集中包含哪些分组维度。详细参考Aggregation functions章节。

相关PR: #10518

改进查询表达式或函数参数缺失时处理逻辑

在此版本中,即时表达式缺失参数仍然可以实现矢量化处理。比如,不存在的列,表达式中缺失参数时,Druid可以根据表达式的非空参数推断出正确的结果类型。举例:对于longColumn + nonExistentColumn这样一个表达式,nonExistentColumn将会被推断成(long)0而不是(double)0。在默认的空处理模式(Default Null Handling,Druid默认模式,即查询结果为NULL的指标列会转换成0)模式下,数学函数通过将缺失的参数视为0以便计算得到正确的结果。

相关PR: #10499

TIMESTAMPADD函数支持输入为0

某些BI工具(比如Tableau)生成的SQL语句存在参数值为0的情况,在版本实现了此场景的支持。

相关PR:

数据摄入

Druid原生摄入(Native parallel ingestion)不再需要指定的间隔

从版本开始,原生摄入任务不再需要在任务配置中的granularitySpec 部分设置明确的起始时间间隔。当未指定时间间隔时,任务会针对输入的数据计算需要索引的数据时间间隔。

相关PR:

旧Kafka版本支持

此版本之前Kafka要求Kafka最低版本为0.11以实现精确一次消费语义。但目前0.10.x的Kafka集群仍然广泛使用。从本版本开始,Druid允许用户将Kafka的消费者配置参数isolation.level设置成read_uncommitted 以便从这些较低版本的Kafka摄入数据。需要说明的是,目前只测试验证过0.10.2.1的Kafka+Druid。详细信息请参考Kafka配置

相关PR: #10551

druid.org.cn注:从Kafka和Druid原理上来讲,设置isolation.levelread_uncommitted 后,Druid应该都能从0.10.x的Kafka旧版摄入数据。

批摄入Segment合并

本版本新增了maxColumnsToMerge 以便控制任务中可以同时合并多少个Segment文件。通过该配置项,可避免Segment合并期间的较高内内存开销。详细信息参考批摄入的tuningConfig章节说明。

相关PR: #10689

降低Druid原生摄入任务内存开销

原生摄入任务在分解子任务前会根据Segment的ID进行排序,这样会减少每个子任务需要处理的时间块个数,进而即降低每个子任务的内存开下。当原生摄入任务需要处理较长时间间隔的数据时,优化效果较明显。

相关PR: #10646

Web Console控制台

改进了控制台UI样式

Web Console控制台样式与Druid品牌的视觉颜色更协调,同时对全局的UI元素的填充、留白进行了统一。

相关PR: #10515

支持显示数据(datasource)和segment的分区信息

Web 控制台新增了Segment granularityPartitioning列以便帮助用户快速掌握相关数据源的分区信息。

Datasource中的Segment分区

Segment中的分区

相关PR:

优化Load data过程中Scehma表中的列的显示顺序

Configure schema步骤中列字段显示顺序已调整以保持和dimensionSpec中配置的字段顺序保持一致。

相关PR: #10588

Druid中的性能指标

Coordinator后台任务性能指标

Druid中的coordinator会执行一些后台任务,比如Segment平衡、加载新的Segment。从本版本开始,新增了两个指标以便帮助分析Druid执行这类任务的性能。

  • coordinator/time: 单次任务执行时间
  • coordinator/global/time:任务累计执行时间

相关PR: #10603

查询超时性能指标

在此之前的版本中,查询超时被归类为interrupted中,并计数到query/interrupted/count指标中。本版本将此类错误单独归类统计到query/interrupted/count指标中。

  • query/timeout/count:排放期间超时查询的数量

相关PR: #10567

批摄入的相关指标

本版本为middleManager和Indexer节点提供了两个新的指标。这些指标中,supervisorTaskId为维度。

  • ingest/shuffle/bytes
  • ingest/shuffle/requests

如果要启用这两个指标,需要将org.apache.druid.indexing.worker.shuffle.ShuffleMonitor添加到druid.monitoring.monitors配置项中。参考此文档了解更多

相关PR: #10359

抗时钟漂移指标监控调度器

默认指标监控调度器基于ScheduledThreadPoolExecutor 实现,而此线程池调度器容易出现时钟漂移问题。本版本实现了新的监控指标调度器(ClockDriftSafeMonitorScheduler )以解决此问题。

如要使用该调度器,需要在配置文件中将druid.monitoring.schedulerClassName设置为org.apache.druid.java.util.metrics.ClockDriftSafeMonitorScheduler
相关PR:

其他

基于 AWS RDS Token的密码提供器的扩展

本版本新增PasswordProvider类型以允许通过临时的AWS Token访问 AWS RDS 数据库实例。如果将AWS RDS作为Druid的元数据存储时,此扩展可能会派上用场。有关详细信息,请参阅AWS RDS扩展文档。

相关PR: #9518

sys.servers支持显示节点的leader信息

sys.servers表中增加了is_leadersys字段,以便可以快速查询到Druid集群中哪些节点正在扮演Leader角色。

druid.org.cn注:此字段在Druid运维或问题定位时较为有用,能够帮助快速集群中的leader节点(包括coordinator和overlord)。在Druid的下一个版本中,leader节点会直接显示到Web Console上

相关PR: #10680

druid-influxdb-emitter扩展支持 HTTPS 协议

参考该扩展文档了解配置详情。

相关PR: #9938

Docker

精简Docker镜像的体积

本版本发行的Docker镜像通过优化Dockerfile命令的顺序消除不必要的layer,使得镜像大小缩减了50%左右。

相关PR: #10506

druid.org.cn注:0.21.0版本docker发行镜像仍然存在问题,该问题在0.21.0-rc1版本报告,但由于rc1版本投票中,该问题未在所有参与版本验证的PMC中暴露,因此0.21.1仍然按计划发布

Druid开发

支持通过DynamicConfigProvider扩展Kafka消费者的配置信息

本版本新增了DynamicConfigProvider类,支持在Kafka摄入任务的运行期动态的获取Kafka消费者的配置参数。举例,可以通过该类从本地环境变量获取bootstrap.servers配置。参考此文档了解如何实现一个自定义的配置提供器。

相关PR: #10309

Bug修复

0.21.0版本包含30个错误修复,完整列表在此

Post-aggregator computation with subtotals

在 0.21.0 之前,当使用带有subtotal的后置聚合查询时会出现错误。

相关链接:#10653

Indexer节点注册声明为Segment查询服务

在 0.19.0 和 0.20.0 中,Indexers节点由于没有将自己声明成为Segment服务查询节点,导致无法查询实时流数据。

相关链接:#10631

Historical节点针对Segment文件有效性检查

Historical节点从本版本开始会在下载完成Segment文件之后执行有效性检查,如果这些Segment文件有损坏,节点将自动重新下载。

相关链接:#10650

修复StorageLocationSelectorStrategy 配置无法生效问题

当为Historical节点配置了多个本地Segment文件磁盘路径时,StorageLocationSelectorStrategy提供了多种策略已选择其中的一个路径存储Segment文件,在此版本之前,由于实现错误,导致该配置无法生效,现已修复。

相关链接:#10363

升级至 0.21.0

从Druid 0.20.0 升级到 0.21.0 时,请注意以下更改。如果从低于0.20.0进行更新,请参阅相关中间版本的发布说明文档。

数据查询错误HTTP状态码优化

在此版本发布之前,大多数查询错误都以HTTP 500错误码返回。此版本对这些错误进行了整理和重新归类。下表列出了已更改的错误及其相应的代码:

异常 说明 原Status Code 新Status Code
SqlParseException and ValidationException from Calcite 查询规划失败 500 400
QueryTimeoutException 查询执行未在超时完成 500 504
ResourceLimitExceededException 查询要求的资源多于配置阈值 500 400
InsufficientResourceException 由于提交时缺少合并缓冲区,查询未能安排 500 429, 合并为QueryCapacityExceededException
QueryUnsupportedException 不支持功能 400 501

此外针对查询超时错误还提供了一个新的应用指标。有关更多详细信息,请参阅此文档

相关链接:

查询应用指标变更

query/interrupted/count不再统计超时的查询。超时查询统计到query/timeout/count中。

应用指标查询中的context维度

所有的性能查询指标都新增了context维度。context是一个 JSON 格式的字符串,其中包含指标所指查询的上下文。在你的指标处理流程中,需要考虑处理该新增的维度。由于该维度是 JSON 格式的字符串,常见的解决方案是将该JSON结构展平,或者从中提取出需要的字段然后丢弃该字段。

相关链接:#10578

Apache ZooKeper 3.4版本支持被标记为废弃

ZooKeper 3.4生命周期结束已经有一段时间了,因此该版本在Druid 0.21.0中被标记为废弃(deprecated),并将在Druid后续版本删除对其支持。

相关链接:#10780

sys.segments表字段序列化格式和列命名风格变化

该表中的所有列现在都以 JSON 格式序列化,以保持与其他系统表一致。同时字段名统一采用snake case命名风格(druid.org.cn注:snake case命名风格即使用下划线代替空格的命令风格,比如file_name)。

相关链接:#10481

已知问题

Thrift库中的已知安全漏洞

Druid中的thrift扩展可用于将thrift格式的数据导入Druid。但是,Druid目前使用的thrift版本中存在已知的安全漏洞。此漏洞可能会被通过摄入恶意制作的thrift数据利用。建议仅授予受信任的用户权限。

关于BUG的完整列表,请参阅github上的issue列表

致谢

感谢为本版本贡献代码的所有人,他们是:

@a2l007
@abhishekagarwal87
@asdf2014
@AshishKapoor
@awelsh93
@ayushkul2910
@bananaaggle
@capistrant
@ccaominh
@clintropolis
@cloventt
@FrankChen021
@gianm
@harinirajendran
@himanshug
@jihoonson
@jon-wei
@kroeders
@liran-funaro
@martin-g
@maytasm
@mghosh4
@michaelschiff
@nishantmonu51
@pcarrier
@QingdongZeng3
@sthetland
@suneet-s
@tdt17
@techdocsmith
@valdemar-giosg
@viatcheslavmogilevsky
@viongpanzi
@vogievetsky
@xvrl
@zhangyue19921010