天天看點

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

本文為轉載,感覺寫的很好,正好解決了本人的疑問,故轉。原文位址:https://www.cnblogs.com/1130136248wlxk/articles/5503634.html。

希望大家尊重原創,如需轉載,請注明原文出處(上面的位址),謝謝!!!

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)。

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

進行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)

是以,一般建議不要設定多個列族。

繼續閱讀