Rowkey 長度
Rowkey 是一個二進制碼流,建議越短越好,一般不超過 16 個字節(jié),主要是出于以下的考慮:
數(shù)據(jù)的持久化文件 HFile 中是按照 KeyValue 存儲的,即你寫入的數(shù)據(jù)可能是一個 RowKey 對應(yīng)多個列族,多個列,但是實際的存儲是每個列都會對應(yīng) Rowkey 寫一遍,即這一條數(shù)據(jù)有多少個列,就會存儲多少遍 Rowkey,這會極大影響 HFile 的存儲效率
MemStore 和 BlockCache 都會將緩存部分數(shù)據(jù)到內(nèi)存,如果 Rowkey 字段過長內(nèi)存的有效利用率會降低,系統(tǒng)將無法緩存更多的數(shù)據(jù),這會降低檢索效率。
目前操作系統(tǒng)一般都是 64 位系統(tǒng),內(nèi)存 8 字節(jié)對齊。控制在 16 個字節(jié),8 字節(jié)的整數(shù)倍,利用操作系統(tǒng)的最佳特性。
Rowkey 散列設(shè)計
HBase 的 Rowkey 是按照字典序排列的,而數(shù)據(jù)分布在 RegionServer 上的方式是做高位哈希,所以如果我們的 Rowkey 首位存在大量重復(fù)的值那么很可能會出現(xiàn)數(shù)據(jù)傾斜問題,關(guān)于數(shù)據(jù)傾斜的問題下面會詳細說明,總之,原則上就是Rowkey 的首位盡量為散列。
常訪問的數(shù)據(jù)放到一起
對于需要批量獲取的數(shù)據(jù),比如某一天的數(shù)據(jù),可以把一整天的數(shù)據(jù)存儲在一起,即把 rowkey 的高位設(shè)計為時間戳,這樣在讀數(shù)據(jù)的時候就可以指定 Start RowKey 和 End RowKey 做一個 scan 操作,因為高位相同的 Rowkey 會存儲在一起,所以這樣讀是一個順序讀的過程,會比較高效。但是這樣有一個很明顯的問題,違背了上一條Rowkey 散列設(shè)計原則,很可能會出現(xiàn)數(shù)據(jù)傾斜問題。所以說沒有最好的設(shè)計,具體如何權(quán)衡就得看實際業(yè)務(wù)場景了
更多關(guān)于大數(shù)據(jù)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項目實操的話可以點擊咨詢課程顧問,獲取試聽資格來試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。