经过了近6个月的研发,Apache Doris(Incubating) 0.12.0版本在Apache社区正式发布了。这是Doris进入Apache孵化器后第四个正式版本。
在0.12版本中,有共计40位同学贡献了627个commit。Contributor的数量也增长到了87名。在此,感谢每一位为Doris做出贡献的同学,也希望越来越多的人能够加入到社区当中,为Doris添砖加瓦。
0.12版本发布了诸多重磅功能。
全新的存储格式SegmentV2
这个版本中,我们对底层的数据文件格式进行了完全的重构。原有的存储格式是类似orcfile的列存格式,存在诸多的设计问题,如按字节流的读取方式效率低下、大量随机读问题、不支持字典压缩、不支持数据块的缓存、结构不清晰难以扩展等。
在新的SegmentV2存储格式中,我们参考了Parquet的设计思路,引入了基于Page的最小数据存储单元,并将数据文件划分为数据区、索引区和元数据区三个部分。针对不同的列类型、索引格式实现了不同的Page编码方式,显著提升了数据的读写效率,并增强了数据格式的可扩展性。更多SegmentV2的细节,可以参阅之前的公众号文章:
【遇见Doris】Apache Doris (incubating) 0.12.0版本预览
在SegmentV2的基础上,0.12版本实现了如下重要功能:
· 字典压缩编码
原有的存储格式中,字符串类型都是采用Plain Text的格式进行存储的,这种朴素的方式在某些低基数字符串列的场景下,会极大地浪费存储空间。
SegmentV2通过Dictionary Page,实现了字典压缩编码,在不同基数的情况下可以节省数倍的存储空间。
· 基于Bitmap的二级索引
之前版本的Doris只支持基于BloomFilter的二级索引,只能过滤block级别的数据,并且在某些低基数列上的效果欠佳。在0.12版本中,我们支持了基于Bitmap的倒排索引,可以在任意Key列上创建。通过倒排索引,可以更精准地进行数据查询和检索。在我们的测试中,通过倒排索引,可以提升数倍的查询性能。
· Page Cache和内存表
Page是SegmentV2格式中,最小的数据单元,一个Page会被完整的解压并读取到内存中。Page一旦生成,是不可变更的,根据这个特性,我们增加了Page Cache功能,通过在内存中缓存解压后的Page数据,可以避免大量的重复IO,降低磁盘IO。
同时基于Page Cache功能,我们也提供了一种内存表的实现方式。用户可以在建表时指定表的属性“in_memory”=“ true”,则系统会尽可能的保证该表的数据Page保留在Page Cache中,从而提升数据的访问效率。
· 延迟物化
全新的存储格式提供了更清晰的数据读取逻辑,使得Doris能够支持延迟物化这种更高效的数据读取能力。延迟物化的含义,举例来说,当用户需要读取A、B、C三列的数据,并且在A列上有过滤条件时,系统会先读取A列并进行过滤,根据过滤后的行号再去读取B、C两列,这样可以显著减少B、C两列的读取数据量。根据我们的测试,在某些场景下,延迟物化功能可以带来几十倍的性能提升。
Spark on Doris
在新版本中,我们实现了Spark Doris Connector,从而用户可以直接通过Spark对Doris中存储的数据进行查询。从Doris的角度看,将其数据引入Spark,可以使用Spark一系列丰富的生态产品,扩宽了Doris的想象力,也使得Doris和其他数据源的联合查询成为可能。
更多详情可以参阅公众号文章:
【遇见Doris】Spark Doris Connector的最佳实践
明细模型上的物化视图功能
在之前的版本中,Doris仅支持在聚合模型(Aggregate Key)上创建上卷表(Rollup),而如果用户创建的是明细模型(Duplicate Key)表,则无法使用该功能。在新版本中,Doris支持了在明细模型上创建物化视图的功能。该功能使得用户可以更加灵活地进行数据建模。
当前该功能仅支持SUM、MIN、MAX三种上卷聚合方式,更多的聚合方式如HLL、BITMAP_UNION、AVG、COUNT等将在后续的3位版本迭代中陆续推出。
更多详情,请访问 Doris 官网并搜索 "CREATE MATERIALIZED VIEW"
支持ORC格式数据的导入
在0.11版本中我们支持了Parquet文件格式。而在0.12版本中,我们进一步支持了ORC格式的数据文件的导入,进一步降低了用户的使用门槛,可以更加方便地从不同数据源中导入数据。
动态分区
在之前的版本中,数据表的分区(Partition)需要手动创建。对于一些例行任务场景,用户需要维护额外的脚本或服务来定期地增加新的分区或删除旧的分区。在新版本中,我们支持了动态分区的定义和创建,分区可以按照定义定期地进行创建和删除,用户无需再担心因分区未及时创建而导致数据无法导入的问题了。
更多详情,请访问 Doris 官网并搜索 "动态分区"。
差集、交集、Grouping Set
0.12版本中,我们支持了更丰富的SQL语法和算子。其中差集(Expect)和交集(Intersect)算子避免了用户通过改写Join来获取想要的结果,同时也带来了查询性能的提升。
Grouping Set功能能够让用户更便捷地通过简单的SQL语法获取不同纬度的聚合查询结果,进一步降低了SQL的复杂度。
更多详情,请访问 Doris 官网并搜索 "GROUP BY"。
更多增强特性
除了以上主要功能更新外,0.12版本也做了诸多性能和功能方面的改进。
· 插件框架和审计日志插件
0.12版本分别实现了FE端和BE端的插件框架。该框架支持用户对一些功能组件进行定制化的开发和安装。目前该功能还处于实验阶段。我们提供了一个FE端的审计日志插件供使用,通过该插件,用户可以直接通过Doris的查询能力来分析Doris系统内的查询请求情况。
更多详情,请访问 Doris 官网并搜索 "插件开发手册" 和 "审计日志插件"。
· 显著提升了Doris On Elasticsearch的性能
通过更精细的谓词下推、以及API接口的改进、Doris On ES可能是目前最好用的SQL on ES系统。Doris On ES也在更多的公司落地并解决问题:https://my.oschina.net/u/4022229/blog/3561066
· Bitmap聚合方式支持64位整型
Bitmap聚合方式从支持32位整型扩展到了64位。使得可以在更多场景实现快速精确去重能力。
· 更多的列类型转换
支持Float转Double,Date和Datetime的互转、Integer转Date/Datetime,以及Varchar转换为整型、浮点和日期类型等。通过更丰富的列类型转换,使得用户能够更灵活地应对业务场景的变更。
更多详情,请访问 Doris 官网并搜索 "ALTER TABLE"。
· 基于NIO模型的MySQL协议连接层
通过XNIO框架(https://xnio.jboss.org/),Doris的连接层现在可以支持百万量级的连接请求。新的连接层框架可以在高并发场景降低Doris在连接协议上的开销和负载。
该功能可以通过添加FE的配置项:mysql_service_nio_enabled=true开启。、
下载地址
可以通过点击原文、或从Doris官网下载0.12.0版本。同时,因为Doris项目处于快速迭代中,很多迭代功能和bug修复无法及时地体现在Apache官方版本中,因此百度在github上维护了一个镜像库用于发布3位快速迭代版本。
3位快速迭代版本主要用于bug修复,建议生产环境使用。
https://github.com/baidu-doris/incubator-doris/releases
下一版本预告
在接下来的0.13版本中,我们将支持更好的物化视图功能、Spark导入功能,并且对查询引擎性能做进一步地优化,敬请期待。
升级注意事项
0.12版本仅支持从0.11版本升级,不支持从0.10及之前的版本升级。
关于SegmentV2的升级方式,请访问 Doris 官网并搜索 "Segment V2 升级手册"。
欢迎扫码关注:
Apache Doris(incubating)官方公众号
相关链接:
Apache Doris官方网站:
http://doris.incubator.apache.org
Apache Doris Github:
https://github.com/apache/incubator-doris
Apache Doris 开发者邮件组:
dev@doris.apache.org