TSZ 壓(ya)(ya)縮算(suan)法是 TDengine 提供的(de)一種可選壓(ya)(ya)縮算(suan)法,專門用于浮點數(shu)據(ju)(ju)類(lei)型。它具有出色的(de)壓(ya)(ya)縮性能(neng),能(neng)夠(gou)在(zai)(zai)有損和(he)無損狀態(tai)下(xia)都提供更(geng)高(gao)的(de)壓(ya)(ya)縮率,甚至比默認壓(ya)(ya)縮算(suan)法高(gao)出一倍,滿足更(geng)高(gao)的(de)數(shu)據(ju)(ju)存(cun)儲需(xu)求。利用數(shu)據(ju)(ju)預測技(ji)術(shu),TSZ 壓(ya)(ya)縮算(suan)法更(geng)適合處理有規律(lv)變化的(de)數(shu)據(ju)(ju),如時序數(shu)據(ju)(ju)。但需(xu)要注意的(de)是,由于其(qi)高(gao)效(xiao)的(de)壓(ya)(ya)縮方法,TSZ 壓(ya)(ya)縮可能(neng)需(xu)要更(geng)多(duo)的(de)時間(jian)來執行,因此在(zai)(zai) CPU 資源(yuan)充裕且存(cun)儲空間(jian)有限的(de)情況下(xia)使(shi)用效(xiao)果(guo)更(geng)佳。
最近,我們就有一條關于“TSZ 壓縮算法(fa)”的“新聞”要和大家(jia)分享。

不久前,我們收到(dao)了這樣(yang)一(yi)條消息(xi),消息(xi)發送者(zhe)是(shi)來自華中科技大學,武漢光電國(guo)家研究中心的(de)碩士研究生鐘宇。在該(gai)消息(xi)中,他表示在他們近(jin)期(qi)的(de)一(yi)篇(pian)名(ming)為(wei)《ADT-FSE:A New Encoder for SZ》的(de)學術論文中,針對(dui) TDengine TSZ 壓(ya)縮算法進(jin)行了相關改進(jin)。隨后鐘宇將這部分開(kai)源代碼(ma)分享在了 TDengine 的(de) Github 社(she)區上,成為(wei)了 TDengine 開(kai)源社(she)區的(de)又一(yi)名(ming)貢獻者(zhe)。
為(wei)(wei)了(le)讓更多富有開源精神(shen)、關注 TDengine 的(de)小伙伴們(men)了(le)解到這段故事更為(wei)(wei)詳細(xi)的(de)一(yi)(yi)(yi)面,我們(men)對鐘(zhong)宇(yu)進行了(le)一(yi)(yi)(yi)次深入采訪(fang),他將從為(wei)(wei)何選擇 TDengine 作為(wei)(wei)研(yan)究對象之一(yi)(yi)(yi)、TSZ 壓縮算(suan)法的(de)具體(ti)優(you)化工作以及參與開源的(de)感(gan)受等諸多方面展開分享。
采訪實錄
1、請介紹一下你自己。
感謝邀請,我來自華中科技大學,現在是武漢光電國家研究中心的一名研三碩士。我目前在吳非教授帶領的“磐石新型非易失存儲系統實驗室”(NNSS)課題組。我個人的研究方向主要包括 NVMe 固態盤、壓縮算法等。22 年 7~9 月份,我在深圳大普微實習期間,與公司的呂濤博士合作完成了優化浮點壓縮器 SZ 的論文《ADT-FSE: A New Encoder for SZ》,這篇論文已被收錄在今年的 SC 會議中,SC 是 CCF 認證的超算和存儲領域的頂會。文章中 TDengine 作為時序數據庫(Time Series Database)領域的代表,成(cheng)為 SZ 算法應(ying)用(yong)的一(yi)個重要場景(jing)。
2、什么契機讓你接觸到 TDengine,成為 TDengine 的貢獻者?
首次(ci)接觸(chu)到 TDengine 是在 SZ 研究(jiu)開(kai)(kai)(kai)始時,當時聽聞另一位(wei)學長準(zhun)備在畢業設計做有關 TDengine 的研究(jiu),在討(tao)論時了解到 TDengine 中(zhong)引入(ru)了 SZ(即 TSZ)模塊(kuai),并且集成(cheng)在開(kai)(kai)(kai)源代(dai)碼中(zhong)。時序(xu)數據庫作為一個(ge)有前景的、快(kuai)速發展的領(ling)域,一直是我們(men)團(tuan)隊想要(yao)開(kai)(kai)(kai)拓的方向,而 TDengine 在開(kai)(kai)(kai)源社區(qu)中(zhong)的影響不小,并且一個(ge)開(kai)(kai)(kai)源且成(cheng)熟(shu)的項目對于我們(men)搞學術(shu)研究(jiu)來說非常(chang)友好,因此我們(men)也認為這是一個(ge)非常(chang)良好的契機。
3、為什么決定進行 TSZ 壓縮算法的優化工作,優化結果如何?詳細描述下原因
因為(wei) SZ 作為(wei)一(yi)(yi)個(ge)(ge)業界(jie)領先的有(you)(you)損浮點壓(ya)縮(suo)器,其實一(yi)(yi)直有(you)(you)一(yi)(yi)個(ge)(ge)缺點,這(zhe)一(yi)(yi)點在(zai) SZ 的開(kai)源代碼庫(ku)的 README 中(zhong)也有(you)(you)說明——“SZ 不適合壓(ya)縮(suo)非常(chang)(chang)(chang)小(xiao)的文件”,而(er)在(zai)數(shu)(shu)(shu)據庫(ku)中(zhong),數(shu)(shu)(shu)據通常(chang)(chang)(chang)被切(qie)分(fen)為(wei)小(xiao)塊進行存(cun)儲,例如 TDengine 中(zhong)默(mo)認 4096 行數(shu)(shu)(shu)據為(wei)最小(xiao)存(cun)儲單(dan)(dan)元(yuan),如果使用單(dan)(dan)精度(du)浮點類(lei)型(xing)(float)存(cun)儲,則存(cun)儲單(dan)(dan)元(yuan)為(wei) 16KB。這(zhe)個(ge)(ge)大小(xiao)對于(yu) SZ 動(dong)輒壓(ya)縮(suo)數(shu)(shu)(shu)百 MB 甚(shen)至數(shu)(shu)(shu) GB 的數(shu)(shu)(shu)據來說,已經非常(chang)(chang)(chang)小(xiao)了,而(er)我們在(zai)測試(shi)中(zhong)也發現(xian)(xian) SZ 在(zai)壓(ya)縮(suo)該大小(xiao)的文件時,出現(xian)(xian)了壓(ya)縮(suo)比(bi)大幅下降、壓(ya)縮(suo)解(jie)壓(ya)緩慢等問(wen)題。
我(wo)們(men)在(zai)大(da)量的(de)測(ce)試(shi)(shi)和量化分析后發現,SZ 壓縮中使(shi)用的(de)傳統 Huffman 算法(fa)成為了導致該問題的(de)主要瓶頸,傳統 Huffman 算法(fa)在(zai)壓縮結果中存儲(chu)一(yi)顆(ke) Huffman 樹,以便(bian)解碼時能還原出原數據。通常(chang)在(zai)壓縮大(da)文(wen)(wen)件(jian)時 Huffman 樹的(de)大(da)小可以忽(hu)略(lve)不計,但我(wo)們(men)的(de)測(ce)試(shi)(shi)表明這(zhe)顆(ke)樹所占用的(de)空(kong)間在(zai)小文(wen)(wen)件(jian)下(xia)顯得不可忽(hu)略(lve),這(zhe)是(shi)問題的(de)關鍵。
最(zui)終(zhong)我(wo)們提出了(le) ADT-FSE 算法來(lai)替換傳統 Huffman 算法,這(zhe)是一種轉碼(ma)+壓縮(suo)的(de)(de)方式,對原數(shu)據進行了(le)一步(bu)轉碼(ma),而后使(shi)用更先(xian)進的(de)(de)熵編碼(ma) FSE 算法來(lai)進行壓縮(suo),完全摒棄了(le) Huffman 樹(shu)的(de)(de)消(xiao)耗,不僅可以提升小文件(jian)壓縮(suo)下(xia)的(de)(de)壓縮(suo)比,還能提升壓縮(suo)解壓速度(du)。在我(wo)們的(de)(de)測試中,ADT-FSE 使(shi)得 SZ 的(de)(de)解壓速度(du)快了(le) 2x~8x,在 TDengine 中的(de)(de)壓縮(suo)比提升了(le)最(zui)高 5x。

4、在整個優化過程中有沒有遇到一些棘手的問題?如何破解的?
起初(chu)對于采用(yong)何種算(suan)法替代傳(chuan)統 Huffman 算(suan)法是(shi)難(nan)以(yi)確(que)定的,我們嘗試了直接使(shi)用(yong)通用(yong)壓(ya)縮器(qi) Zstd,或(huo)者(zhe)熵編碼(ma) FSE 替代,但其(qi)效果(guo)都不是(shi)最(zui)佳(jia),在(zai)一些情況下會比原始算(suan)法更差。最(zui)后我們是(shi)在(zai)另一個項目(mu)的開發中,發現 Zstd 內部有一種壓(ya)縮大范圍整數的思(si)路(lu),即先轉碼(ma)后壓(ya)縮。受其(qi)啟發,我們通過對 SZ 的數據(ju)進行分析,并對該(gai)思(si)路(lu)進行學習、改進,最(zui)終才提出了最(zui)優的 ADT-FSE 算(suan)法。
在 TDengine 場景下(xia)的(de)(de)評估(gu)中,使用(yong)何種數(shu)據(ju)(ju)進(jin)行測(ce)試也是一個難題,因為我(wo)們并沒有接觸過真(zhen)實場景的(de)(de)時(shi)序數(shu)據(ju)(ju),另(ling)外(wai) SZ 更適合(he)壓縮連續(xu)性較強(qiang)的(de)(de)數(shu)據(ju)(ju)。最終我(wo)們選擇了同樣(yang)開源(yuan)發表的(de)(de) UK-DALE 數(shu)據(ju)(ju)集,其(qi)記錄了真(zhen)實家庭用(yong)電的(de)(de)電壓數(shu)據(ju)(ju)。
5、你是什么時候開始關注開源參與開源項目的?你認為開源帶給了你哪些幫助?
從本科期間(jian)開始,開源項目一直是我以及身邊的(de)(de)同學(xue)(xue)們(men)關(guan)注的(de)(de)重(zhong)點(dian)。作(zuo)為(wei)學(xue)(xue)生(sheng),開源是我們(men)重(zhong)要(yao)的(de)(de)學(xue)(xue)習(xi)(xi)平臺,包括在 Linux 開源庫中學(xue)(xue)習(xi)(xi)操作(zuo)系(xi)統底(di)層原(yuan)理,在 fio、liburing 庫中學(xue)(xue)習(xi)(xi) I/O 相關(guan)知識(shi),以及在 Zstd 開源庫中學(xue)(xue)習(xi)(xi)壓(ya)縮原(yuan)理,等(deng)等(deng)。這(zhe)些(xie)優(you)秀的(de)(de)開源代碼讓每個(ge)人能接觸到真實的(de)(de)場景和算法,同時也能學(xue)(xue)習(xi)(xi)良好(hao)的(de)(de)編程習(xi)(xi)慣。
另一方面(mian),在讀(du)研之后,開(kai)源代(dai)碼(ma)也是開(kai)展(zhan)科研工作必不(bu)可(ke)(ke)少(shao)的條件。如若(ruo)沒有開(kai)源,對于較簡(jian)單的項目(mu)而(er)言(yan),可(ke)(ke)能(neng)花幾(ji)周、幾(ji)個(ge)月復(fu)現,然(ran)后才可(ke)(ke)以開(kai)展(zhan)研究(jiu)工作。而(er)復(fu)雜的系統則基本沒有條件進(jin)行(xing)研究(jiu)。因此我們在選擇課題時,通常會優先考慮已開(kai)源的項目(mu)。
6、數據庫很少有將集群版也進行開源的,你如何看待 TDengine 集群版開源這件事?
TDengine 的(de)開(kai)(kai)源(yuan)(yuan)(yuan)很成功(gong),我在(zai) GitHub 上看到其(qi)(qi)有 2 萬多顆星(xing),這在(zai)社區中的(de)影響力非(fei)常大(da)。我認為開(kai)(kai)源(yuan)(yuan)(yuan)可以吸(xi)引全球(qiu)范圍內開(kai)(kai)發者的(de)廣泛參與,集(ji)思(si)廣益,對于項目本身的(de)長遠發展來說是有益的(de)。TDengine 集(ji)群版開(kai)(kai)源(yuan)(yuan)(yuan),有助于吸(xi)收更多先進的(de)、新鮮的(de)血液,同時也使得用(yong)戶對 TDengine 的(de)了解更透明(ming),增加其(qi)(qi)信任度。
7、作為 TDengine 的貢獻者,你如何看待 TDengine 目前的發展?對 TDengine 還有哪些建議?
在開發(fa)過(guo)程(cheng)中,我(wo)與開源(yuan)社(she)區(qu)的(de)管理(li)人(ren)員取得了聯系,并獲得了他們的(de)很(hen)多(duo)幫助,合作過(guo)程(cheng)非(fei)常愉快且(qie)充實。我(wo)感受到 TDengine 社(she)區(qu)是非(fei)常健康且(qie)活躍的(de),濤思對于其開源(yuan)社(she)區(qu)的(de)發(fa)展非(fei)常重(zhong)視,我(wo)個(ge)人(ren)認(ren)為開源(yuan)的(de) TDengine 是很(hen)有前景的(de)。建議的(de)話,如果有適合開發(fa)者(zhe)的(de)開發(fa)文檔,比如說介紹模塊所在文件(jian),開發(fa)/調(diao)試的(de)高效指令,對于新的(de)開發(fa)者(zhe)來說效率會更高一些(xie)吧。
8、你覺得 TDengine 在時序數據庫領域里的優勢是什么?
優勢的(de)(de)話除了開(kai)源這一(yi)點外,在開(kai)發過(guo)程中感受到的(de)(de)一(yi)點是 TDengine 的(de)(de)生(sheng)態比較豐富,與很多其(qi)他(ta)的(de)(de)開(kai)源項目和工具集(ji)成,能夠給用戶提供(gong)廣泛的(de)(de)選擇和靈活性。
9、對于自身的發展,未來是如何考慮的?
現在準備碩士(shi)畢業后直接工作吧,因為對我來說讀博的(de)時(shi)間成本比(bi)較大(da)哈(ha)哈(ha)哈(ha)。畢業后可(ke)能繼續在存儲(chu)領域工作,此前在大(da)普微(wei)和(he)阿里云(yun)分別實習了一段(duan)時(shi)間,期間做的(de)方向都相對比(bi)較底層(ceng),涉及到存儲(chu)介質和(he)軟件層(ceng)的(de)交互,之后可(ke)能也(ye)會往存儲(chu)基座的(de)方向發展(zhan)吧。現在正是在應屆(jie)生秋招的(de)時(shi)候,今年秋招也(ye)比(bi)較激烈,大(da)家一起加(jia)油吧。
寫在最后
近些年來,隨著 TDengine 的產品功能不斷精進、開源影響力逐漸擴大,越來越多的高校研究生和學者選擇將 TDengine 作為研究課題輸出論文,其中有像鐘宇這樣致力于功能改進的,也有很多著重于分析 TDengine 在工業物聯網、智慧園區、自動駕駛、煙草工業等諸多行業的大數據場景下的應用及性能表現。此前為了幫助社區開發者更直接地進行參考和查閱,我們還針對此類論文進行過一次匯總——《關于 TDengine 的論文資料都在這里了,等你來取!》。
除了這些外部資料之外,TDengine 也在幫助企業用戶改造數據架構過程中,積累了很多實戰經驗,這些經驗大多由企業開發者執筆創作生成了用戶案例,集中發表在 TDengine 的官網博客(//www.yakult-sh.com.cn/tdengine-user-cases)上(shang),大家也可作參考。
如果你針對本次采訪還有更深入的問題想要了解,或者想就數據問題咨詢 TDengine 解決方案架構師,可以添加小T vx:tdengine,詳細說(shuo)明你的訴求(qiu),我(wo)們會給與你及時的幫助。



























