2012-03-05 35 views
9

Hbase文檔說,避免創建2-3個以上的列族,因爲Hbase不能很好地處理2-3列以上的族。其原因是壓實和沖洗,因此IO。然而,如果我所有的列都被填充(對於每一行),那麼我認爲這個推理並不重要,所以考慮到我對列的訪問完全是隨機的(我想訪問列的任意組合) - 我可以有一個列列家族 - 一個列配置(有效地嘗試使其成爲純粹的列)。Hbase列族

有很多博客/維基解釋這個,但他們似乎都相互矛盾,並添加更多的困惑。我似乎無法消化Hbase喜歡一個列家族的事實,那麼調用的是什麼是一個列存儲?

回答

21

目前(雖然預計會改變),但是一個區域的所有列族都會被刷新。這就是爲什麼人們說「HBase不適合超過2或3個專欄家庭」的主要原因。考慮兩個CF,每個都有一列。 A欄:存儲整個網頁文本。 B列:B存儲頁面中的字數。因此,每次我們刷新A:A(由於A:A的數據更大,會更頻繁地發生),我們還需要通過一個單獨的文件I/O對B列的I/O雜耍路由:即使沒有需要 - 與B:B只持有號碼,我可以去幾個月沒有沖洗它。

如果您將A和B存儲在相同的列系列(A:A和A:B)中,您可能會看到非常好的I/O性能,並且由於大多數HBase讀取完全來自memstore,所以可能會發現讀取速度是相同的。

此外,也許更重要的是,如果列的基數是非常不同的,那麼您的regionservers將需要爲較不密集的列族維護無用的大多數空文件。這永遠不會改變。

所有這些都在HBase Book中可用。

因此,正如在所有這些表現情況下,測量在決定「正確」路徑是什麼之前。

+0

感謝您的解釋! – PrakashT 2012-03-05 15:27:54

+0

所以就我而言,據我所知,我有兩種選擇:a)我有一列家族中的所有列。這將對性能產生影響,因爲大部分時間我只需要訪問1-2列,但通過這種設計,我將閱讀整行內容。儘管這些讀取將分佈在許多區域服務器上。 2)我把我的專欄分成幾個大小相同的家庭。 – PrakashT 2012-03-05 15:32:53

+2

您應該不必擔心閱讀整行。 HBase非常適合只讀實際需要的內容。如果您需要讀取的單元在內存中,HBase根本不會執行額外的磁盤IO。 – 2012-03-05 17:07:48