揭秘:RCFile高效存儲(chǔ)結(jié)構(gòu)
圖3顯示了在HDFS上按照列組存儲(chǔ)表格的例子。在這個(gè)例子中,列A和列B存儲(chǔ)在同一列組,而列C和列D分別存儲(chǔ)在單獨(dú)的列組。查詢(xún)時(shí)列存儲(chǔ)能夠避免讀不必要的列,并且壓縮一個(gè)列中的相似數(shù)據(jù)能夠達(dá)到較高的壓縮比。然而,由于元組重構(gòu)的較高開(kāi)銷(xiāo),它并不能提供基于Hadoop系統(tǒng)的快速查詢(xún)處理。列存儲(chǔ)不能保證同一記錄的所有域都存儲(chǔ)在同一集群節(jié)點(diǎn),例如圖2的例子中,記錄的4個(gè)域存儲(chǔ)在位于不同節(jié)點(diǎn)的3個(gè)HDFS塊中。因此,記錄的重構(gòu)將導(dǎo)致通過(guò)集群節(jié)點(diǎn)網(wǎng)絡(luò)的大量數(shù)據(jù)傳輸。盡管預(yù)先分組后,多個(gè)列在一起能夠減少開(kāi)銷(xiāo),但是對(duì)于高度動(dòng)態(tài)的負(fù)載模式,它并不具備很好的適應(yīng)性。除非所有列組根據(jù)可能的查詢(xún)預(yù)先創(chuàng)建,否則對(duì)于一個(gè)查詢(xún)需要一個(gè)不可預(yù)知的列組合,一個(gè)記錄的重構(gòu)或許需要2個(gè)或多個(gè)列組。再者由于多個(gè)組之間的列交疊,列組可能會(huì)創(chuàng)建多余的列數(shù)據(jù)存儲(chǔ),這導(dǎo)致存儲(chǔ)利用率的降低。

圖3 HDFS塊內(nèi)列存儲(chǔ)的例子
PAX混合存儲(chǔ)
PAX存儲(chǔ)模型(用于Data Morphing存儲(chǔ)技術(shù))使用混合存儲(chǔ)方式,目的在于提升CPU Cache性能。對(duì)于記錄中來(lái)自不同列的多個(gè)域,PAX將它們放在一個(gè)磁盤(pán)頁(yè)中。在每個(gè)磁盤(pán)頁(yè)中,PAX使用一個(gè)迷你頁(yè)來(lái)存儲(chǔ)屬于每個(gè)列的所有域,并使用一個(gè)頁(yè)頭來(lái)存儲(chǔ)迷你頁(yè)的指針。類(lèi)似于行存儲(chǔ),PAX對(duì)多種動(dòng)態(tài)查詢(xún)有很強(qiáng)的適應(yīng)能力。然而,它并不能滿(mǎn)足大型分布式系統(tǒng)對(duì)于高存儲(chǔ)空間利用率和快速查詢(xún)處理的需求,原因在于:首先,PAX沒(méi)有數(shù)據(jù)壓縮的相關(guān)工作,這部分與Cache優(yōu)化關(guān)系不大,但對(duì)于大規(guī)模數(shù)據(jù)處理系統(tǒng)是非常關(guān)鍵的,它提供了列維度數(shù)據(jù)壓縮的可能性;其次,PAX不能提升I/O性能,因?yàn)樗荒芨淖儗?shí)際的頁(yè)內(nèi)容,該限制使得大規(guī)模數(shù)據(jù)掃描時(shí)不易實(shí)現(xiàn)快速查詢(xún)處理;再次,PAX用固定的頁(yè)作為數(shù)據(jù)組織的基本單位,按照這個(gè)大小,在海量數(shù)據(jù)處理系統(tǒng)中,PAX將不會(huì)有效存儲(chǔ)不同大小類(lèi)型的數(shù)據(jù)域。本文介紹的是RCF i l e 數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)在Hadoop系統(tǒng)上的實(shí)現(xiàn)。該結(jié)構(gòu)強(qiáng)調(diào):第一,RCFile存儲(chǔ)的表是水平劃分的,分為多個(gè)行組, 每個(gè)行組再被垂直劃分, 以便每列單獨(dú)存儲(chǔ);第二,RCFile在每個(gè)行組中利用一個(gè)列維度的數(shù)據(jù)壓縮,并提供一種Lazy解壓(decompression)技術(shù)來(lái)在查詢(xún)執(zhí)行時(shí)避免不必要的列解壓;第三,RCFile支持彈性的行組大小,行組大小需要權(quán)衡數(shù)據(jù)壓縮性能和查詢(xún)性能兩方面。
RCFile的設(shè)計(jì)與實(shí)現(xiàn)
RCFile(Record Columnar File)存儲(chǔ)結(jié)構(gòu)遵循的是“先水平劃分,再垂直劃分”的設(shè)計(jì)理念,這個(gè)想法來(lái)源于PAX。它結(jié)合了行存儲(chǔ)和列存儲(chǔ)的優(yōu)點(diǎn):首先,RCFile保證同一行的數(shù)據(jù)位于同一節(jié)點(diǎn),因此元組重構(gòu)的開(kāi)銷(xiāo)很低;其次,像列存儲(chǔ)一樣,RCFile能夠利用列維度的數(shù)據(jù)壓縮,并且能跳過(guò)不必要的列讀取。圖4是一個(gè)HDFS塊內(nèi)RCFile方式存儲(chǔ)的例子。

圖4 HDFS塊內(nèi)RCFile方式存儲(chǔ)的例子
評(píng)論