本文為轉載,感覺寫的很好,正好解決了本人的疑問,故轉。原文位址: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)。
進行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)
是以,一般建議不要設定多個列族。