1. 程式人生 > >HBase學習之五:HBase的RowKey設計原則

HBase學習之五:HBase的RowKey設計原則

Hbase是三維有序儲存的,通過rowkey(行鍵),column key(column family和qualifier)和TimeStamp(時間戳)這個三個維度可以對hbase中的資料進行快速定位。

HBase中rowkey可以唯一標識一行記錄,在HBase查詢的時候,有以下幾種方式:

  1. 通過get方式,指定rowkey獲取唯一一條記錄
  2. 通過scan方式,設定startRow和stopRow引數進行範圍匹配
  3. 全表掃描,即直接掃描整張表中所有行記錄

rowkey長度原則

rowkey是一個二進位制碼流,可以是任意字串,最大長度 64kb ,實際應用中一般為10-100bytes,以byte[] 形式儲存,一般設計成定長。

建議越短越好,不要超過16個位元組,原因如下:

  1. 資料的持久化檔案HFile中是按照KeyValue儲存的,如果rowkey過長,比如超過100位元組,1000w行資料,光rowkey就要佔用100*1000w=10億個位元組,將近1G資料,這樣會極大影響HFile的儲存效率;
  2. MemStore將快取部分資料到記憶體,如果rowkey欄位過長,記憶體的有效利用率就會降低,系統不能快取更多的資料,這樣會降低檢索效率。
  3. 目前作業系統都是64位系統,記憶體8位元組對齊,控制在16個位元組,8位元組的整數倍利用了作業系統的最佳特性。

rowkey雜湊原則

如果rowkey按照時間戳的方式遞增,不要將時間放在二進位制碼的前面,建議將rowkey的高位作為雜湊欄位,由程式隨機生成,低位放時間欄位,這樣將提高資料均衡分佈在每個RegionServer,以實現負載均衡的機率。如果沒有雜湊欄位,首欄位直接是時間資訊,所有的資料都會集中在一個RegionServer上,這樣在資料檢索的時候負載會集中在個別的RegionServer上,造成熱點問題,會降低查詢效率。

rowkey唯一原則

必須在設計上保證其唯一性,rowkey是按照字典順序排序儲存的,因此,設計rowkey的時候,要充分利用這個排序的特點,將經常讀取的資料儲存到一塊,將最近可能會被訪問的資料放到一塊。

什麼是熱點

HBase中的行是按照rowkey的字典順序排序的,這種設計優化了scan操作,可以將相關的行以及會被一起讀取的行存取在臨近位置,便於scan。然而糟糕的rowkey設計是熱點的源頭。 熱點發生在大量的client直接訪問叢集的一個或極少數個節點(訪問可能是讀,寫或者其他操作)。大量訪問會使熱點region所在的單個機器超出自身承受能力,引起效能下降甚至region不可用,這也會影響同一個RegionServer上的其他region,由於主機無法服務其他region的請求。 設計良好的資料訪問模式以使叢集被充分,均衡的利用。

為了避免寫熱點,設計rowkey使得不同行在同一個region,但是在更多資料情況下,資料應該被寫入叢集的多個region,而不是一個。

下面是一些常見的避免熱點的方法以及它們的優缺點:

加鹽

這裡所說的加鹽不是密碼學中的加鹽,而是在rowkey的前面增加隨機數,具體就是給rowkey分配一個隨機字首以使得它和之前的rowkey的開頭不同。分配的字首種類數量應該和你想使用資料分散到不同的region的數量一致。加鹽之後的rowkey就會根據隨機生成的字首分散到各個region上,以避免熱點。

雜湊

雜湊會使同一行永遠用一個字首加鹽。雜湊也可以使負載分散到整個叢集,但是讀卻是可以預測的。使用確定的雜湊可以讓客戶端重構完整的rowkey,可以使用get操作準確獲取某一個行資料

反轉

第三種防止熱點的方法時反轉固定長度或者數字格式的rowkey。這樣可以使得rowkey中經常改變的部分(最沒有意義的部分)放在前面。這樣可以有效的隨機rowkey,但是犧牲了rowkey的有序性。

反轉rowkey的例子以手機號為rowkey,可以將手機號反轉後的字串作為rowkey,這樣的就避免了以手機號那樣比較固定開頭導致熱點問題

時間戳反轉

一個常見的資料處理問題是快速獲取資料的最近版本,使用反轉的時間戳作為rowkey的一部分對這個問題十分有用,可以用Long.Max_Value - timestamp 追加到key的末尾,例如[key][reverse_timestamp] ,[key] 的最新值可以通過scan [key]獲得[key]的第一條記錄,因為HBase中rowkey是有序的,第一條記錄是最後錄入的資料。

比如需要儲存一個使用者的操作記錄,按照操作時間倒序排序,在設計rowkey的時候,可以這樣設計

[userId反轉][Long.Max_Value - timestamp],在查詢使用者的所有操作記錄資料的時候,直接指定反轉後的userId,startRow是[userId反轉][000000000000],stopRow是[userId反轉][Long.Max_Value - timestamp]

如果需要查詢某段時間的操作記錄,startRow是[user反轉][Long.Max_Value - 起始時間],stopRow是[userId反轉][Long.Max_Value - 結束時間]

其他一些建議

  • 儘量減少行和列的大小在HBase中,value永遠和它的key一起傳輸的。當具體的值在系統間傳輸時,它的rowkey,列名,時間戳也會一起傳輸。如果你的rowkey和列名很大,甚至可以和具體的值相比較,那麼你將會遇到一些有趣的問題。HBase storefiles中的索引(有助於隨機訪問)最終佔據了HBase分配的大量記憶體,因為具體的值和它的key很大。可以增加block大小使得storefiles索引再更大的時間間隔增加,或者修改表的模式以減小rowkey和列名的大小。壓縮也有助於更大的索引。

  • 列族儘可能越短越好,最好是一個字元

  • 冗長的屬性名雖然可讀性好,但是更短的屬性名儲存在HBase中會更好

相關推薦

HBase學習:HBase的RowKey設計原則

Hbase是三維有序儲存的,通過rowkey(行鍵),column key(column family和qualifier)和TimeStamp(時間戳)這個三個維度可以對hbase中的資料進行快速定位。 HBase中rowkey可以唯一標識一行記錄,在HBase查詢的時候,有以下幾種方式: 通過get方式

HBase學習路 (十)HBase表的設計原則

建議 ima 是否 屬性 循環 列族 將在 serve sch 建表高級屬性   下面幾個 shell 命令在 hbase 操作中可以起到很大的作用,且主要體現在建表的過程中,看 下面幾個 create 屬性 1、 BLOOMFILTER   默認是 NONE 是否使

大資料hbase(四) --- rowkey設計原則模擬通話日誌,BloomFilter,phonix環境部署,hive-hbase整合

一、rowkey設計 -- 模擬通話日誌 -------------------------------------------------- 1.建表 $hbase> create 'ns1:calllogs' , 'f1' 2.編寫

Html學習(嵌套簡單購物界面設計

type http ctype char alt 淘寶 嵌套 ima mar <!DOCTYPE html> <html> <head> <meta charset="UTF-8">

面向對象的三個基本特征 和 設計原則

對象相等 存在 正是 提高 都是 並不是 ram 無法 pro 面向對象的三個基本特征 和 五種設計原則 來源: http://blog.csdn.net/cancan8538/article/details/8057095 一、三個基本特征 面向對象的三個基本

大數據學習——HDFS常用命令

dfs 放置 shell. 下載 文件 參數 linux系統 文件的 com HDFS文件操作常用命令: (1)列出HDFS下的文件 hadoop dfs -ls <目錄> (2)上傳文件 將Linux系統本地文件上傳到HDFS中 hadoop d

HBase學習路 (二)HBase集群安裝

star java_home 服務 blog usr mirrors logs 技術 ron 前提 1、HBase 依賴於 HDFS 做底層的數據存儲 2、HBase 依賴於 MapReduce 做數據計算 3、HBase 依賴於 ZooKeeper 做服務協調 4

C函數設計原則(四十二)

C語言 設計原則 我們今天來講下函數的設計原則。函數從意義上應該是一個獨立的功能模塊,函數名要在一定程度上反映函數的功能;函數參數名要能夠體現參數的意義,盡量避免在函數中使用全局變量。 A、當函數參數不應該在函數體內部被修改時,應加上 const 聲明;如果參數是指針,且

tensorflow源碼學習 -- 同步訓練和異步訓練

stack location warning 可能 oss implicit mov -i ner 同步和異步訓練是由optimizer來決定的。 1. 同步訓練 同步訓練需要使用SyncReplicasOptimizer,參考http

設計模式6大設計原則

單一職責原則 單一職責原則(Single Responsibility Principle, SRP)的定義是: 應該有且僅有一個原因引起類或介面的變更。即一個類或介面只負責一個功能領域中的相應職責。 單一職責原則提出了一個編寫程式的標準, 它使類的複雜性降低、提高了程式碼的可讀性、可維護性和可擴充套件性

python學習(map,filter,reduce函式的使用)

map函式 我們首先使用原始的方法定義幾個功能函式來實現數字的加,減,平方運算。程式碼如下所示: def add(x): return x+1 def reduce(x): return x-1 def pf(x): return x**2 num_1=[1,2

tensorflow原始碼學習 -- 同步訓練和非同步訓練

 同步和非同步訓練是由optimizer來決定的。         1. 同步訓練         同步訓練需要使用SyncReplicasOptimizer,參考https://www.tensorflow.org

SOLID面向物件的設計原則

單一職責原則(Single Resposibility Principle) 開放封閉原則(Open Closed principle) 里氏替換原則(Liskov Substitution Principle) 介面分離原則(Interface Segregation Prin

oracle 18c 18.3 學習 unplug drop plug pdb

os: centos 7.4 db: oracle 18c(18.3) pdb 的優勢之一就是 unplug、plug,本篇blog介紹下 pdb 的 unplug。 以 pdbdongg 為例,進行 unplug 操作。 unplug pdb 必須先 close,然後再

Hbase優化預分割槽設計

1. 背景 HBase建表時預設只有一個region,這個region的rowkey是沒有邊界的,即沒有startkey和endkey。在資料寫入時,所有資料都會寫入這個預設的region。隨著資料量的不斷增加,這個預設的region會越來越大,當達到某個閾值會自動split成為2個

六天搞懂“深度學習:深度學習

簡單地說,深度學習就是一種採用深度神經網路的機器學習技術,深度神經網路就是一種包含2個或者2個以上隱藏層的多層神經網路。 這裡再次簡單回顧一下“深度學習”的發展歷史: l 第一代神經網路——單層神經網路,在解決機器學習面臨的實際問題時,很快就暴露出它的基本侷限性,單層神經網路只

python入門學習Django框架設計思想

談到在web應用領域,除了Python的語法,Django是Python後臺一個最重要的框架,那麼,什麼是軟體框架呢? 舉個簡單的例子,對於一個公司來說,公司中有各個職能部門,每個部門各司其職,通過部門之間的配合來完成工作,這些部門就形成了一個公司的組織架構。從某種意義上來說,公司就是一種框架。

Python技術學習Django框架設計思想

Python是目前比較流行的計算機程式語言,據用豐富和強大的庫,被稱為膠水語言,能夠把用其他語言製作的各種模組很輕鬆地聯結在一起。 Python功能強大,用途廣泛,可廣泛應用於雲端計算、web開發、科學運算、人工智慧、系統運維、金融以及影象GUI等領域,Django框架是P

分散式學習:redis分步式鎖

前言 分散式鎖一般有三種實現方式:1. 資料庫樂觀鎖;2. 基於Redis的分散式鎖;3. 基於ZooKeeper的分散式鎖。本篇部落格將介紹第二種方式,基於Redis實現分散式鎖。雖然網上已經有各種介紹Redis分散式鎖實現的部落格,然而他們的實現卻有著各種各樣的問題,本

面向物件的三個基本特徵和設計原則

面向物件的三個基本特徵 抽象與封裝: 抽象是把系統中需要處理的資料和在這些資料上的操作結合在一起,根據功能、性質和用途等因素抽象成不同的抽象資料型別。每個抽象資料型別既包含了資料,又包含了針對這些資料的授權操作。在面向物件的程式設計中,抽象資料型別是用“類”