pos機(jī)全套源碼,IoTDB 源碼解析之文件索引塊

 新聞資訊2  |   2023-06-19 09:47  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)全套源碼,IoTDB 源碼解析之文件索引塊的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)全套源碼的問(wèn)題,今天pos機(jī)之家(www.tjfsxbj.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!

本文目錄一覽:

1、pos機(jī)全套源碼

pos機(jī)全套源碼

上一章聊到 TsFile 的文件組成,以及數(shù)據(jù)塊的詳細(xì)介紹。詳情請(qǐng)見:

時(shí)序數(shù)據(jù)庫(kù) Apache-IoTDB 源碼解析之文件數(shù)據(jù)塊(四)

打一波廣告,歡迎大家訪問(wèn) IoTDB 倉(cāng)庫(kù)(https://github.com/apache/incubator-iotdb),求一波 Star 。歡迎關(guān)注頭條號(hào):列炮緩開局

這一章主要想聊聊:

TsFile索引塊的組成索引塊的查詢過(guò)程索引塊目前在做的改進(jìn)項(xiàng)索引塊

索引塊由兩大部分組成,其寫入的方式是從左到右寫入,也就是從文件頭向文件尾寫入。但讀出的方式是先讀出 TsFileMetaData 再讀出 TsDeviceMetaDataList 中的具體一部分。我們按照讀取數(shù)據(jù)的順序介紹:

TsFileMetaData

TsFileMetaData屬于文件的 1 級(jí)索引,用來(lái)索引 Device 是否存在、在哪里等信息,其中主要保存了:

DeviceMetaDataIndexMap:Map結(jié)構(gòu),Key 是設(shè)備名,Value 是 TsDeviceMetaDataIndex ,保存了包含哪些 Device(邏輯概念上的一個(gè)集合一段時(shí)間內(nèi)的數(shù)據(jù),例如前幾章我們講到的:張三、李四、王五)以及他們的開始時(shí)間及結(jié)束時(shí)間、在左側(cè) TsDeviceMetaDataList 文件塊中的偏移量等。MeasurementSchemaMap:Map結(jié)構(gòu),Key 是測(cè)點(diǎn)的一個(gè)全路徑,Value 是 measurementSchema ,保存了包含的測(cè)點(diǎn)數(shù)據(jù)(邏輯概念上的某一類數(shù)據(jù)的集合,如體溫?cái)?shù)據(jù))的原信息,如:壓縮方式,數(shù)據(jù)類型,編碼方式等。最后是一個(gè)布隆過(guò)濾器,快速檢測(cè)某一個(gè) 時(shí)間序列 是不是存在于文件內(nèi)(這里等聊到 server 模塊寫文件的策略時(shí)候再聊)。我們知道這個(gè)過(guò)濾器的特點(diǎn)就是:沒有的一定沒有,但有的不一定有。為了保證準(zhǔn)確性和過(guò)濾器序列化后的大小均衡,這里提供了一個(gè) 1% - 10% 錯(cuò)誤率的可配置,當(dāng)為 1% 錯(cuò)誤率時(shí),保存 1 萬(wàn)個(gè)測(cè)點(diǎn)信息,大概是 11.7 K。

我們?cè)倩叵?SQL :SELECT 體溫 FROM 王五 WHERE time = 1 。讀文件的過(guò)程就應(yīng)該是:

先用布隆過(guò)濾器判斷文件內(nèi)是否有王五的體溫列,如果沒有,查找下一個(gè)文件。從 DeviceMetaDataIndexMap 中找到王五的 TsDeviceMetaDataIndex ,從而得到了王五的 TsDeviceMetadata 的 offset,接下來(lái)就尋道至這個(gè) offset 把王五的 TsDeviceMetadata 讀出來(lái)。MeasurementSchemaMap 不用關(guān)注,主要是給 Spark 使用的,ChunkHeader 中也保存了這些信息。TsDeviceMetaDataList

TsDeviceMetaDataList 屬于文件的 2 級(jí)索引,用來(lái)索引具體的測(cè)點(diǎn)數(shù)據(jù)是不是存在、在哪里等信息。其中主要保存了:

ChunkGroupMetaData:ChunkGroup 的索引信息,主要包含了每個(gè) ChunkGroup 數(shù)據(jù)塊的起止位置以及包含的所有的測(cè)點(diǎn)元信息(ChunkMetaData)。ChunkMetaData :Chunk 的索引信息,主要包含了每個(gè)設(shè)備的測(cè)點(diǎn)在文件中的起止位置、開始結(jié)束時(shí)間、數(shù)據(jù)類型和預(yù)聚合信息。

上面的例子中,從 TsFileMetadata 已經(jīng)拿到了王五的 TsDeviceMetadataIndex,這里就可以直接讀出王五的 TsDeviceMetadata,并且遍歷里邊的 ChunkGroupMetadata 中的 ChunkMetadata,找到體溫對(duì)應(yīng)的所有的 ChunkMetadata。通過(guò)預(yù)聚合信息對(duì)時(shí)間過(guò)濾,判斷能否使用當(dāng)前的 Chunk 或者能否直接使用預(yù)聚合信息直接返回?cái)?shù)據(jù)(等介紹到 server 的查詢引擎時(shí)候細(xì)聊)。

如果不能直接返回,因?yàn)?ChunkMetaData 包含了這個(gè) Chunk 對(duì)應(yīng)的文件的偏移量,只需要使用 seek(offSet) 就會(huì)跳轉(zhuǎn)到數(shù)據(jù)塊,使用上一章介紹的讀取方法進(jìn)行遍歷就完成了整個(gè)讀取。

預(yù)聚合信息(Statistics)

文中多次提到了預(yù)聚合在這里詳細(xì)介紹一下它的數(shù)據(jù)結(jié)構(gòu)。

// 所屬文件塊的開始時(shí)間private long startTime; // 所屬文件塊的結(jié)束時(shí)間private long endTime;// 所屬文件塊的數(shù)據(jù)類型private TSDataType tsDataType;// 所屬文件塊的最小值private int minValue; // 所屬文件塊的最大值private int maxValue; // 所屬文件塊的第一個(gè)值private int firstValue; // 所屬文件塊的最后一個(gè)值private int lastValue; // 所屬文件塊的所有值的和private double sumValue;

這個(gè)結(jié)構(gòu)主要保存在 ChunkMetaData 和 PageHeader 中,這樣做的好處就是,你不必從硬盤中讀取具體的Page 或者 Chunk 的文件內(nèi)容就可以獲得最終的結(jié)果,例如:SELECT SUM(體溫) FROM 王五 ,當(dāng)定位到 ChunkMetaData 時(shí),判斷能否直接使用這個(gè) Statistics 信息(具體怎么判斷,之后會(huì)在介紹 server 時(shí)具體介紹),如果能使用,那么直接返回 sumValue。這樣返回的速度,無(wú)論存了多少數(shù)據(jù),它的聚合結(jié)果響應(yīng)時(shí)間簡(jiǎn)直就是 1 毫秒以內(nèi)。

樣例數(shù)據(jù)

我們繼續(xù)使用上一章聊到的示例數(shù)據(jù)來(lái)展示, 用電腦端打開更漂亮易懂。

完整的文件信息如下:

POSITION|CONTENT -------- ------- 0|[magic head] TsFile 6|[version number] 000002 // 數(shù)據(jù)塊開始|||||||||||||||||||||[Chunk Group] of wangwu begins at pos 12, ends at pos 253, version:0, num of Chunks:2 12|[Chunk] of xinlv, numOfPoints:1, time range:[1580950800,1580950800], tsDataType:INT32, [minValue:100,maxValue:100,firstValue:100,lastValue:100,sumValue:100.0] |[marker] 1 |[ChunkHeader] |1 pages 121|[Chunk] of tiwen, numOfPoints:1, time range:[1580950800,1580950800], tsDataType:FLOAT, [minValue:36.7,maxValue:36.7,firstValue:36.7,lastValue:36.7,sumValue:36.70000076293945] |[marker] 1 |[ChunkHeader] |1 pages 230|[Chunk Group Footer] |[marker] 0 |[deviceID] wangwu |[dataSize] 218 |[num of chunks] 2|||||||||||||||||||||[Chunk Group] of wangwu ends // 索引塊開始 253|[marker] 2 254|[TsDeviceMetadata] of wangwu, startTime:1580950800, endTime:1580950800 |[startTime] 1580950800 |[endTime] 1580950800 |[ChunkGroupMetaData] of wangwu, startOffset12, endOffset253, version:0, numberOfChunks:2 |[ChunkMetaData] of xinlv, startTime:1580950800, endTime:1580950800, offsetOfChunkHeader:12, dataType:INT32, statistics:[minValue:100,maxValue:100,firstValue:100,lastValue:100,sumValue:100.0] |[ChunkMetaData] of tiwen, startTime:1580950800, endTime:1580950800, offsetOfChunkHeader:121, dataType:FLOAT, statistics:[minValue:36.7,maxValue:36.7,firstValue:36.7,lastValue:36.7,sumValue:36.70000076293945] 446|[TsFileMetaData] |[num of devices] 1 |[TsDeviceMetadataIndex] of wangwu, startTime:1580950800, endTime:1580950800, offSet:254, len:192 |[num of measurements] 2 |2 key&measurementSchema |[createBy isNotNull] false |[totalChunkNum] 2 |[invalidChunkNum] 0 //布隆過(guò)濾器 |[bloom filter bit vector byte array length] 30 |[bloom filter bit vector byte array] |[bloom filter number of bits] 256 |[bloom filter number of hash functions] 5 599|[TsFileMetaDataSize] 153 603|[magic tail] TsFile 609|END of TsFile

當(dāng)執(zhí)行: SELECT 體溫 FROM 王五 時(shí):

從 599 開始讀,1 級(jí)索引長(zhǎng)度為 153.599 - 153 = 446 就是 1 級(jí)索引讀開始位置,并讀出 TsDeviceMetadataIndex of 王五,其中記錄了,王五設(shè)備的 2 級(jí)索引的 offset 為 254.跳到 254 開始讀 2 級(jí)索引,找到 ChunkMetaData of 體溫, 其中記錄了體溫?cái)?shù)據(jù)的 Chunk 的offset 為 121跳到 121 ,這里進(jìn)入了數(shù)據(jù)塊,從 121 讀取到 230 ,讀出的數(shù)據(jù)就全部是體溫?cái)?shù)據(jù)。改進(jìn)項(xiàng)1. 只讀投影列

前面第 3 步中,讀取 2 級(jí)索引時(shí)候,會(huì)將這個(gè)設(shè)備下的所有測(cè)點(diǎn)數(shù)據(jù)全部讀出來(lái),這依然不太符合只讀投影列的設(shè)計(jì),所以在新的 TsFile 中,修改了 1級(jí)索引和 2 級(jí)索引的部分結(jié)構(gòu),使得讀出的數(shù)據(jù)更少,更高效。有興趣的同學(xué)可以關(guān)注 PR: Refactor TsFile #736

2. 文件級(jí) Statistics

在物聯(lián)網(wǎng)場(chǎng)景中經(jīng)常會(huì)涉及到查詢某個(gè)設(shè)備的最后狀態(tài),比如:車聯(lián)網(wǎng)中,查詢車輛的末次位置( SELECT LAST(lat,lon) FROM VechicleID ),或者當(dāng)前的點(diǎn)火、熄火狀態(tài)等 SELECT LAST(accStatus) FROM VechicleID 。

或者當(dāng)某些分頁(yè)查詢等情況時(shí)候,經(jīng)常會(huì)使用到 COUNT(*) 等操作,這些都非常符合 Statistics 結(jié)構(gòu),這些場(chǎng)景涉及到的索引設(shè)計(jì)也都會(huì)體現(xiàn)到新的 TsFile 索引改動(dòng)中。

到此已經(jīng)介紹完了文件的整體結(jié)構(gòu),了解了大體的寫入和讀取過(guò)程,但是 TsFile 的 API 是如何設(shè)計(jì)的,怎樣在代碼里做一些特殊的功課,來(lái)繞過(guò) Java 裝箱、GC 等問(wèn)題呢?歡迎持續(xù)關(guān)注。。。。

以上就是關(guān)于pos機(jī)全套源碼,IoTDB 源碼解析之文件索引塊的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)全套源碼的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://www.tjfsxbj.com/newsone/70480.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。