TSZ 压缩算法是 TDengine 提供的一种可选压缩算法,专门用于浮点数据类型。它具有出色的压缩性能,能够在有损和无损状态下都提供更高的压缩率,甚至比默认压缩算法高出一倍,满足更高的数据存储需求。利用数据预测技术,TSZ 压缩算法更适合处理有规律变化的数据,如时序数据。但需要注意的是,由于其高效的压缩方法,TSZ 压缩可能需要更多的时间来执行,因此在 CPU 资源充裕且存储空间有限的情况下使用效果更佳。

最近,我们就有一条关于“TSZ 压缩算法”的“新闻”要和大家分享。

::: hljs-center

1.PNG

:::

不久前,我们收到了这样一条消息,消息发送者是来自华中科技大学,武汉光电国家研究中心的硕士研究生钟宇。在该消息中,他表示在他们近期的一篇名为《ADT-FSE:A New Encoder for SZ》的学术论文中,针对 TDengine TSZ 压缩算法进行了相关改进。随后钟宇将这部分开源代码分享在了 TDengine 的 Github 社区上,成为了 TDengine 开源社区的又一名贡献者。

为了让更多富有开源精神、关注 TDengine 的小伙伴们了解到这段故事更为详细的一面,我们对钟宇进行了一次深入采访,他将从为何选择 TDengine 作为研究对象之一、TSZ 压缩算法的具体优化工作以及参与开源的感受等诸多方面展开分享。

采访实录

1、请介绍一下你自己。

感谢邀请,我来自华中科技大学,现在是武汉光电国家研究中心的一名研三硕士。我目前在吴非教授带领的“磐石新型非易失存储系统实验室”(NNSS)课题组。我个人的研究方向主要包括 NVMe 固态盘、压缩算法等。22 年 7~9 月份,我在深圳大普微实习期间,与公司的吕涛博士合作完成了优化浮点压缩器 SZ 的论文《ADT-FSE: A New Encoder for SZ》,这篇论文已被收录在今年的 SC 会议中,SC 是 CCF 认证的超算和存储领域的顶会。文章中 TDengine 作为时序数据库Time Series Database)领域的代表,成为 SZ 算法应用的一个重要场景。

2、什么契机让你接触到 TDengine,成为 TDengine 的贡献者?

首次接触到 TDengine 是在 SZ 研究开始时,当时听闻另一位学长准备在毕业设计做有关 TDengine 的研究,在讨论时了解到 TDengine 中引入了 SZ(即 TSZ)模块,并且集成在开源代码中。时序数据库作为一个有前景的、快速发展的领域,一直是我们团队想要开拓的方向,而 TDengine 在开源社区中的影响不小,并且一个开源且成熟的项目对于我们搞学术研究来说非常友好,因此我们也认为这是一个非常良好的契机。

3、为什么决定进行 TSZ 压缩算法的优化工作,优化结果如何?详细描述下原因

因为 SZ 作为一个业界领先的有损浮点压缩器,其实一直有一个缺点,这一点在 SZ 的开源代码库的 README 中也有说明——“SZ 不适合压缩非常小的文件”,而在数据库中,数据通常被切分为小块进行存储,例如 TDengine 中默认 4096 行数据为最小存储单元,如果使用单精度浮点类型(float)存储,则存储单元为 16KB。这个大小对于 SZ 动辄压缩数百 MB 甚至数 GB 的数据来说,已经非常小了,而我们在测试中也发现 SZ 在压缩该大小的文件时,出现了压缩比大幅下降、压缩解压缓慢等问题。

我们在大量的测试和量化分析后发现,SZ 压缩中使用的传统 Huffman 算法成为了导致该问题的主要瓶颈,传统 Huffman 算法在压缩结果中存储一颗 Huffman 树,以便解码时能还原出原数据。通常在压缩大文件时 Huffman 树的大小可以忽略不计,但我们的测试表明这颗树所占用的空间在小文件下显得不可忽略,这是问题的关键。

最终我们提出了 ADT-FSE 算法来替换传统 Huffman 算法,这是一种转码+压缩的方式,对原数据进行了一步转码,而后使用更先进的熵编码 FSE 算法来进行压缩,完全摒弃了 Huffman 树的消耗,不仅可以提升小文件压缩下的压缩比,还能提升压缩解压速度。在我们的测试中,ADT-FSE 使得 SZ 的解压速度快了 2x~8x,在 TDengine 中的压缩比提升了最高 5x。

::: hljs-center

2.JPEG

:::

::: hljs-center

钟宇贡献在 TDengine GitHub 社区上的代码(部分)

:::

4、在整个优化过程中有没有遇到一些棘手的问题?如何解决的?

起初对于采用何种算法替代传统 Huffman 算法是难以确定的,我们尝试了直接使用通用压缩器 Zstd,或者熵编码 FSE 替代,但其效果都不是最佳,在一些情况下会比原始算法更差。最后我们是在另一个项目的开发中,发现 Zstd 内部有一种压缩大范围整数的思路,即先转码后压缩。受其启发,我们通过对 SZ 的数据进行分析,并对该思路进行学习、改进,最终才提出了最优的 ADT-FSE 算法。

在 TDengine 场景下的评估中,使用何种数据进行测试也是一个难题,因为我们并没有接触过真实场景的时序数据,另外 SZ 更适合压缩连续性较强的数据。最终我们选择了同样开源发表的 UK-DALE 数据集,其记录了真实家庭用电的电压数据。

5、你是什么时候开始关注开源参与开源项目的?你认为开源带给了你哪些帮助?

从本科期间开始,开源项目一直是我以及身边的同学们关注的重点。作为学生,开源是我们重要的学习平台,包括在 Linux 开源库中学习操作系统底层原理,在 fio、liburing 库中学习 I/O 相关知识,以及在 Zstd 开源库中学习压缩原理,等等。这些优秀的开源代码让每个人能接触到真实的场景和算法,同时也能学习良好的编程习惯。

另一方面,在读研之后,开源代码也是开展科研工作必不可少的条件。如若没有开源,对于较简单的项目而言,可能花几周、几个月复现,然后才可以开展研究工作。而复杂的系统则基本没有条件进行研究。因此我们在选择课题时,通常会优先考虑已开源的项目。

6、数据库很少有将集群版也进行开源的,你如何看待 TDengine 集群版开源这件事?

TDengine 的开源很成功,我在 GitHub 上看到其有 2 万多颗星,这在社区中的影响力非常大。我认为开源可以吸引全球范围内开发者的广泛参与,集思广益,对于项目本身的长远发展来说是有益的。TDengine 集群版开源,有助于吸收更多先进的、新鲜的血液,同时也使得用户对 TDengine 的了解更透明,增加其信任度。

7、作为 TDengine 的贡献者,你如何看待 TDengine 目前的发展?对 TDengine 还有哪些建议?

在开发过程中,我与开源社区的管理人员取得了联系,并获得了他们的很多帮助,合作过程非常愉快且充实。我感受到 TDengine 社区是非常健康且活跃的,涛思对于其开源社区的发展非常重视,我个人认为开源的 TDengine 是很有前景的。建议的话,如果有适合开发者的开发文档,比如说介绍模块所在文件,开发/调试的高效指令,对于新的开发者来说效率会更高一些吧。

8、你觉得 TDengine 在时序数据库领域里的优势是什么?

优势的话除了开源这一点外,在开发过程中感受到的一点是 TDengine 的生态比较丰富,与很多其他的开源项目和工具集成,能够给用户提供广泛的选择和灵活性。

9、对于自身的发展,未来是如何考虑的?

现在准备硕士毕业后直接工作吧,因为对我来说读博的时间成本比较大哈哈哈。毕业后可能继续在存储领域工作,此前在大普微和阿里云分别实习了一段时间,期间做的方向都相对比较底层,涉及到存储介质和软件层的交互,之后可能也会往存储基座的方向发展吧。现在正是在应届生秋招的时候,今年秋招也比较激烈,大家一起加油吧。

写在最后

近些年来,随着 TDengine 的产品功能不断精进、开源影响力逐渐扩大,越来越多的高校研究生和学者选择将 TDengine 作为研究课题输出论文,其中有像钟宇这样致力于功能改进的,也有很多着重于分析 TDengine 在工业物联网、智慧园区、自动驾驶、烟草工业等诸多行业的大数据场景下的应用及性能表现。此前为了帮助社区开发者更直接地进行参考和查阅,我们还针对此类论文进行过一次汇总——《关于 TDengine 的论文资料都在这里了,等你来取!》

除了这些外部资料之外,TDengine 也在帮助企业用户改造数据架构过程中,积累了很多实战经验,这些经验大多由企业开发者执笔创作生成了用户案例,集中发表在 TDengine 的官网博客(https://www.taosdata.com/tdengine-user-cases)上,大家也可作参考。