1. 程式人生 > >HBASE列族不能太多的真相 (一個table有幾個列族就有幾個 Store)

HBASE列族不能太多的真相 (一個table有幾個列族就有幾個 Store)

gii 大小 mil 更多 觸發 flush adc 同事 就是

今天和同事聊到這個問題,發現者自己理解上有點錯誤。借此機會記錄下

HRegionServer內部管理了一系列HRegion對象,每個HRegion對 應了table中的一個region,HRegion中由多 個HStore組成。每個HStore對應了Table中的一個column family的存儲,可以看出每個columnfamily其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個column family中,這樣最高效。

HStore存儲是HBase存儲的核心,由兩部分組成,一部分是MemStore,一 部分是StoreFile。MemStore是 Sorted Memory Buffer,用戶寫入的數據首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實現是HFile)。


進行split的條件:該regiion下所有的storeFile中最大的storeFile大小超過閥值即進行spliet
在文件層次上,不同的列族,存儲在不同的文件中。但是不同的列族,可能會共享一個region。



/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/a

/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/a/9210131397650425238
/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/b
/hbase/zz/3917ebd872c0adcb9d6c5a9cfd30b87f/b/7083844554431109536

如上所示:兩個不同的列族,共享了同一個region(3917ebd872c0adcb9d6c5a9cfd30b87f)。

由於不同的列族會共享region,所以有可能出現,一個列族已經有1000萬行,而另外一個才100行。當一個要求region分割的時候,會導致100行的列會同樣分布到多個region中。
這樣就出現了基數問題。(如果表存在多個列族,列族A有100萬行,列族B有10億行,那麽列族A可能會被分散到很多個Region上,這會導致掃描列族A的性能低下)


(某個column family在flush的時候,它鄰近的column family也會因關聯效應被觸發flush,最終導致系統產生更多的I/O)
所以,一般建議不要設置多個列族。

HBASE列族不能太多的真相 (一個table有幾個列族就有幾個 Store)