簡單來講,rowkey就是 KeyValue 中的key
rowkey設計之
盡量散列設計 RowKey
如第三部分第六中講到,如果數據都是有序的存儲到一個特定的范圍內,將會存儲在一個有特定起始鍵和停止鍵的 region 中。 由於一個 region 只能由一個服務器管理, 所以所有的更新都會幾種在一台服務器上。 這會導致系統產生讀寫熱點, 並由於寫入數據過分幾種而導致整個系統性能下降。
1 方式采用
SHA1(
MD5落后了,SHA1是MD5改良版) 加密, 取前6位作為前綴加入到userid前面。
2 給入UUID合理加入
缺點:用戶要掃描一個連續數據的范圍時,可能需要對每個 region 服務都發起請求(因為之前的連續數據已經分散到不同的服務器中)。
好處:用戶可以多線程並行的讀取數據。這有些類似於一個小規模的 MapReduce 作業, 這樣查詢的吞吐量會有所提高。
rowkey設計之 RowKey 長度盡量短
缺點:如果 rowkey 太長,第一存儲開銷會增加,影響存儲
效率 ,第二 內存中RowKey字段過長,會導致內存的利用率降低,進而降低索引命中率。
解決方法:
1 時間用 Long 來表示
2 盡量使用編碼壓縮
rowkey設計之 優先選擇 行鍵設計》列族設計》列限定符》時間戳》值
Query 單元格按照時間戳降序排列。將所以在 HFile 的 Reader 讀取數據時,最新的值先被讀到(圖右下),這也是 HBase 設計模式中典型的讀取數據的方式。
KeyValue 存儲時先按行鍵排序,當一行有多個單元格時內部再按列鍵升序排序。
用戶可以按行鍵檢索一行數據沒這樣可以有效的減少查詢特定行和航范圍的時間。設定列族可以有效的減少查詢的存儲文件。 雖然時間戳或者版本在整個鍵的最右邊,但是他是很重要的篩選內容。 存儲文件中為每個單元格(cell)都保存了時間錯,所以當用戶查詢一個兩小時前修改過的單元格時,就可以跳過之包含如4小時前數據的存儲文件。
另一個層次的查詢力度是 列限定符(column qualifier)。 用戶可以在查詢數據時制定特定的列,或定義過濾器時包含或排除用戶需要訪問的列。 不過在這一粒度上篩選數據時,系統不得不檢查每個送到過濾器的 KeyValue, 所以通過限定符篩選數據只會有小幅度的性能提升。
總結
列族,
rowkey, 時間戳, 列限定符, 值
God has given me a gift. Only one. I am the most complete fighter in the world. My whole life, I have trained. I must prove I am worthy of someting.
rocky_24
