百度智能云天工物聯(lián)網(wǎng)平臺(tái)TSDB又添利器,SQL挖掘更多數(shù)據(jù)價(jià)值
經(jīng)過(guò)二十多年的發(fā)展,伴隨著AI、大數(shù)據(jù)、云計(jì)算等技術(shù)的突飛猛進(jìn),物聯(lián)網(wǎng)的價(jià)值逐漸凸顯,成為了互聯(lián)網(wǎng)和傳統(tǒng)公司爭(zhēng)相布局之地。而作為物聯(lián)網(wǎng)領(lǐng)域數(shù)據(jù)存儲(chǔ)的首選,時(shí)序數(shù)據(jù)庫(kù)也進(jìn)入人們的視野。
百度智能云在時(shí)序數(shù)據(jù)庫(kù)領(lǐng)域布局較早。早在2016年7月,百度智能云就在其天工物聯(lián)網(wǎng)平臺(tái)上發(fā)布了TSDB,這是國(guó)內(nèi)首個(gè)多租戶的分布式時(shí)序數(shù)據(jù)庫(kù)產(chǎn)品,能夠支持制造、交通、能源、智慧城市等多個(gè)產(chǎn)業(yè)領(lǐng)域。2018年5月,百度智能云天工平臺(tái)在TSDB上加持了SQL引擎,成為首個(gè)支持SQL的云上時(shí)序數(shù)據(jù)庫(kù)服務(wù),至此用戶可以更加熟悉方便地對(duì)數(shù)據(jù)進(jìn)行操作,同時(shí)充分利用SQL函數(shù)的計(jì)算能力,挖掘數(shù)據(jù)價(jià)值。
本月,百度智能云天工TSDB的SQL引擎正式對(duì)外開放,所有套餐用戶均可使用SQL查詢功能。接下來(lái),本文會(huì)從以下幾個(gè)方面帶你全方位的了解百度智能云天工TSDB上的SQL生態(tài)。
為什么TSDB需要SQL支持?
百度智能云天工TSDB一直有完整的API接口查詢支持,在此基礎(chǔ)上,現(xiàn)在又正式開放了SQL引擎,其中的原因有以下幾個(gè)方面:
首先,SQL的學(xué)習(xí)成本較低,對(duì)于技術(shù)人員而言,更符合日常使用習(xí)慣;即使是非技術(shù)人員,學(xué)習(xí)起來(lái)也很容易上手,可以省去熟悉API的學(xué)習(xí)成本。
其次,從可支持查詢的場(chǎng)景而言,因?yàn)锳PI接口的格式相對(duì)固定,雖然可以支持絕大部分的查詢場(chǎng)景,但是相對(duì)來(lái)說(shuō),不如SQL可表達(dá)的語(yǔ)義豐富,一個(gè)典型的場(chǎng)景是TSDB中多個(gè)metric的聯(lián)合查詢,使用SQL中的join即可很方便的實(shí)現(xiàn)。
再者,SQL生態(tài)可以更方便的對(duì)接BI系統(tǒng),通過(guò)SQL查詢功能,TSDB數(shù)據(jù)庫(kù)可以和現(xiàn)有的BI平臺(tái)實(shí)現(xiàn)無(wú)縫對(duì)接。
最后,無(wú)論是傳統(tǒng)的數(shù)據(jù)存儲(chǔ)服務(wù)或者計(jì)算框架,都有自己對(duì)應(yīng)的SQL生態(tài),例如HiveSql,SparkSql。百度智能云天工TSDB作為專注于時(shí)序數(shù)據(jù)的存儲(chǔ)服務(wù),也應(yīng)該有對(duì)應(yīng)的SQL生態(tài)。
TSDB SQL引擎能做什么?
TSDB支持標(biāo)準(zhǔn)ANSI SQL語(yǔ)義,查詢數(shù)據(jù)的體驗(yàn)與傳統(tǒng)的SQL體驗(yàn)一樣簡(jiǎn)潔明了。用戶使用TSDB的SQL引擎,可以像API接口一樣訪問(wèn)TSDB的時(shí)序數(shù)據(jù),同時(shí)還可以利用SQL強(qiáng)大的計(jì)算函數(shù)能力。
讓我們先通過(guò)一個(gè)簡(jiǎn)單的示例,來(lái)了解下如何在TSDB上使用SQL:
假設(shè)有一個(gè)智能電表監(jiān)控的物聯(lián)網(wǎng)集成方案,采集了智能電表的各個(gè)監(jiān)控點(diǎn)的數(shù)據(jù)。在TSDB中這樣組織(如下圖),metric為SmartMeter,表示TSDB存的是智能電表的數(shù)據(jù),每個(gè)電表有power和current兩個(gè)域(field),用兩個(gè)tag,即meterID和city,來(lái)代表每個(gè)數(shù)據(jù)點(diǎn)來(lái)自哪個(gè)電表ID和城市。電表每5s上傳一次功率值和電流值。
可以將上表看成一個(gè)二維表,針對(duì)二維表來(lái)寫SQL語(yǔ)句。
做完這些基礎(chǔ)工作后,我們來(lái)看具體場(chǎng)景下如何應(yīng)用SQL語(yǔ)句來(lái)解決問(wèn)題。
- 應(yīng)用場(chǎng)景一:要過(guò)濾功率值大于400、電流值小于5,電表ID為2345HDYE的數(shù)據(jù):
select timestamp, power, current,MeterID, City from SmartMeter where power > 400 and current<5 and MeterID= ' 2345HDYE'。
得到數(shù)據(jù)如下:
- 應(yīng)用場(chǎng)景二:電表ID為2345HDYE的電表中,返回每10秒的功率平均值:
- select time_bucket(timestamp, '10seconds') as TIME, avg(power) as AVG_POWER, current, City from SmartMeter groupby time_bucket(timestamp, '10 seconds') order by TIME;
得到數(shù)據(jù)如下:
從上面的示例可以看到,用戶可以像訪問(wèn)RDS一樣使用SQL訪問(wèn)TSDB,支持字段過(guò)濾,排序,分組,聚合等常用操作。同時(shí)因?yàn)闀r(shí)序數(shù)據(jù)的特性,還可以使用time_bucket來(lái)計(jì)算帶時(shí)間窗口的聚合函數(shù)。
除了以上示例中所提到的,TSDB SQL的查詢功能盡可能的和API查詢接口對(duì)齊,這樣用戶就可以在兩種查詢方式上靈活切換,具體包括:
- 所有類型的域的查詢:TSDB現(xiàn)在支持整型、浮點(diǎn)型、字符串類型和Bytes類型。
- 對(duì)于原始數(shù)據(jù)的掃描、支持filter、orderBy、limit等常用語(yǔ)義。
- 對(duì)于函數(shù)計(jì)算場(chǎng)景,支持SUM、AVG、COUNT等常用聚合函數(shù),并支持按照tag、時(shí)間窗口等分組;同時(shí)支持包括floor、abs等常用的計(jì)算函數(shù)。
除了以上和API接口保持一致的功能之外,TSDB SQL還支持:多metric的join操作,可用于不同metric之間的聯(lián)合查詢。
TSDB SQL引擎性能優(yōu)化
數(shù)據(jù)查詢引擎的架構(gòu)一般分為存儲(chǔ)層和計(jì)算層,前者負(fù)責(zé)對(duì)接數(shù)據(jù)源和原始數(shù)據(jù)的讀取;后者負(fù)責(zé)生成查詢計(jì)劃并做優(yōu)化,以便更高效地從存儲(chǔ)層獲取數(shù)據(jù)。在這一部分,我們將介紹TSDB SQL引擎在計(jì)算層進(jìn)行的查詢優(yōu)化方面的工作。
計(jì)算層對(duì)查詢計(jì)劃的優(yōu)化主要分為:基于成本的優(yōu)化(Cost-Based Optimization)和基于規(guī)則的優(yōu)化(Rule-Based Optimization)。使用CBO時(shí),計(jì)算層會(huì)在多個(gè)查詢計(jì)劃間挑選一個(gè)成本最低的查詢計(jì)劃執(zhí)行,在評(píng)估成本時(shí)可能需要用到存儲(chǔ)層提供的一些數(shù)據(jù)相關(guān)信息。而使用RBO更多的是使用一些規(guī)則,在對(duì)原始查詢計(jì)劃做等價(jià)變換的基礎(chǔ)上,不斷優(yōu)化出性能更優(yōu)的查詢計(jì)劃,其中比較常見的規(guī)則有謂詞下推,列裁剪等等,這里以謂詞下推為例作下簡(jiǎn)要介紹。
謂詞下推(Predicate Pushdown)的思路是通過(guò)將SQL語(yǔ)句中WHERE 子句中的謂詞移到盡可能離數(shù)據(jù)源靠近的位置,從而能夠提早進(jìn)行數(shù)據(jù)過(guò)濾并有可能更好地利用索引。下面通過(guò)一個(gè)例子來(lái)說(shuō)明:
繼續(xù)利用上一章節(jié)中的場(chǎng)景,假設(shè)我們除了SmartMeter這個(gè)metric之外,還有另外一個(gè)metric來(lái)記錄電表的溫度:
現(xiàn)在需要join這兩個(gè)metric來(lái)對(duì)特定的電表進(jìn)行聯(lián)合查詢,SQL語(yǔ)句如下:
- select * from martMeter joinSmartTemperature on SmartMeter.MeterID = SmartTemperature.MeterID where MeterID= ' 2345HDYE';
針對(duì)上述的SQL語(yǔ)句,會(huì)生成如下左圖的原始查詢計(jì)劃:虛線以上可以認(rèn)為是計(jì)算層生成的查詢計(jì)劃,虛線以下對(duì)應(yīng)存儲(chǔ)層的數(shù)據(jù)源。這個(gè)查詢計(jì)劃使用TableScan算子將兩個(gè)metric的數(shù)據(jù)掃描出來(lái),然后完成join操作,并在join之后的結(jié)果上做“MeterID= ' 2345HDYE”的條件過(guò)濾,最后輸出結(jié)果。
而右圖是經(jīng)過(guò)"謂詞下推"優(yōu)化之后的查詢計(jì)劃,可以看到,filter算子也就是“MeterID = ' 2345HDYE”的過(guò)濾,被下推到了TableScan算子下面,這樣的調(diào)整有什么好處呢?
首先,TableScan算子不再需要對(duì)原始數(shù)據(jù)進(jìn)行全表掃描,只需要獲取經(jīng)過(guò)“MeterID = ' 2345HDYE”過(guò)濾之后的數(shù)據(jù),從數(shù)據(jù)量來(lái)說(shuō)得到了縮減。
其次,如果SmartMeter和SmartTempreture作為數(shù)據(jù)源,本身就對(duì)MeterID這個(gè)字段的過(guò)濾有優(yōu)化的話,查詢性能就能得到進(jìn)一步的提升,這也就是上面提到的更好的利用數(shù)據(jù)源的索引。
最后,由于TableScan輸出的數(shù)據(jù)量減少了,需要join的數(shù)據(jù)量也就減少了。
可以看到,謂詞下推是通過(guò)盡可能移動(dòng)過(guò)濾表達(dá)式至靠近數(shù)據(jù)源的位置,來(lái)減少算子之間需要傳遞的數(shù)據(jù)量,進(jìn)而優(yōu)化查詢計(jì)劃。TSDBSQL現(xiàn)已支持timestamp,field以及tag上絕大部分的謂詞下推,并且實(shí)現(xiàn)了OrderBy,Limit下推等一系列優(yōu)化規(guī)則;同時(shí)在一些聚合函數(shù)場(chǎng)景下,SQL支持通過(guò)分布式計(jì)算來(lái)優(yōu)化查詢計(jì)劃的執(zhí)行,這里暫不一一展開。
相信通過(guò)本文的介紹,大家已經(jīng)對(duì)使用SQL引擎訪問(wèn)百度智能云天工TSDB有了一定的了解。目前,百度智能云團(tuán)隊(duì)仍在不斷完善TSDB上的SQL生態(tài),比如通過(guò)JDBC/ODBC來(lái)連接TSDB等。未來(lái),SQL生態(tài)將延伸到天工的其他產(chǎn)品上,比如物管理服務(wù)等,從而實(shí)現(xiàn)天工產(chǎn)品的多數(shù)據(jù)源一站式SQL查詢。