案例篇-HBase RowKey 設計指南

1.為什么 Rowkey 這么重要

1.1 RowKey 到底是什么

_2019_01_10_10_19_07

我們常說看一張 HBase 表設計的好不好,就看它的 RowKey 設計的好不好。可見 RowKey 在 HBase 中的地位。那么 RowKey 到底是什么?RowKey 的特點 如下:

  1. 類似于 MySQL、Oracle 中的主鍵,用于標示唯一的行;
  2. 完全是由用戶指定的一串不重復的字符串;
  3. HBase 中的數據永遠是根據 Rowkey 的字典排序來排序的。

1.2 RowKey 的作用

  1. 讀寫數據時通過 RowKey 找到對應的 Region;
  2. MemStore 中的數據按 RowKey 字典順序排序;
  3. HFile 中的數據按 RowKey 字典順序排序。

1.3 Rowkey 對查詢的影響

如果我們的 RowKey 設計為 uid+phone+name,那么這種設計可以很好的支持
以下的場景:
uid = 111 AND phone = 123 AND name = iteblog uid = 111 AND phone = 123
uid = 111 AND phone = 12?
uid = 111
難以支持的場景:
phone = 123 AND name = iteblog phone = 123
name = iteblog

1.4 Rowkey 對 Region 劃分影響

HBase表的數據是按照 Rowkey 來分散到不同 Region,不合理的 Rowkey 設計會導致熱點問題。熱點問題是大量的 Client 直接訪問集群的一個或極少數個節點,而集群中的其他節點卻處于相對空閑狀態。

_2019_01_10_10_30_58

如上圖,Region1 上的數據是 Region 2 的 5 倍,這樣會導致 Region1 的訪問 頻率比較高,進而影響這個 Region 所在機器的其他 Region。

2.RowKey 設計技巧

我們如何避免上面說到的熱點問題呢?這就是這章節談到的三種方法。

2.1 避免熱點的方法 – Salting

這里的加鹽不是密碼學中的加鹽,而是在 rowkey 的前面增加隨機數。具體就是給 rowkey 分配一個隨機前綴以使得它和之前排序不同。分配的前綴種類數量應該和你想使數據分散到不同的 region 的數量一致。 如果你有一些 熱點 rowkey 反復出現在其他分布均勻的 rwokey 中,加鹽是很有用的。考慮下面的例子:它將寫請求分散到多個RegionServers,但是對讀造成了一些負面影響。
假如你有下列 rowkey,你表中每一個 region 對應字母表中每一個字母。以 'a' 開頭是同一個 region, 'b'開頭的是同一個 region。在表中,所有以 'f'開頭的都在 同一個 region, 它們的 rowkey 像下面這樣:

_2019_01_10_10_34_36

現在,假如你需要將上面這個 region 分散到 4 個 region。你可以用 4 個不同 的鹽:'a', 'b', 'c', 'd'.在這個方案下,每一個字母前綴都會在不同的 region 中。 加鹽之后,你有了下面的 rowkey:

_2019_01_10_10_35_12

所以,你可以向 4 個不同的 region 寫,理論上說,如果所有人都向同一個 region 寫的話,你將擁有之前 4 倍的吞吐量。
現在,如果再增加一行,它將隨機分配 a,b,c,d 中的一個作為前綴,并以一個現有行作為尾部結束:

_2019_01_10_10_36_02

因為分配是隨機的,所以如果你想要以字典序取回數據,你需要做更多工作。加鹽這種方式增加了寫時的吞吐量,但是當讀時有了額外代價。

2.2 避免熱點的方法 - Hashing

Hashing 的原理是計算 RowKey 的 hash 值,然后取 hash 的部分字符串和原來的 RowKey 進行拼接。這里說的 hash 包含 MD5、sha1、sha256 或 sha512 等算法。比如我們有如下的 RowKey:

_2019_01_10_10_37_09

我們使用 md5 計算這些 RowKey 的 hash 值,然后取前 6 位和原來的 RowKey 拼接得到新的 RowKey:

_2019_01_10_10_37_57

優缺點:可以一定程度打散整個數據集,但是不利于 Scan;比如我們使用 md5 算法,來計算 Rowkey 的 md5 值,然后截取前幾位的字符串。subString(MD5(設備ID),0,x)+ 設備ID,其中x一般取5或6。

2.3 避免熱點的方法 - Reversing

Reversing 的原理是反轉一段固定長度或者全部的鍵。比如我們有以下 URL , 并作為 RowKey:

_2019_01_10_10_39_20

這些 URL 其實屬于同一個域名,但是由于前面不一樣,導致數據不在一起存放。 我們可以對其進行反轉,如下:

_2019_01_10_10_39_54

經過這個之后,這些 URL 的數據就可以放一起了。

2.4 RowKey 的長度

RowKey 可以是任意的字符串,最大長度 64KB(因為 Rowlength 占 2 字節)。 建議越短越好,原因如下:

  1. 數據的持久化文件 HFile 中是按照 KeyValue 存儲的,如果 rowkey 過長,比 如超過 100 字節,1000w 行數據,光 rowkey 就要占用 100*1000w=10 億個字 節,將近 1G 數據,這樣會極大影響 HFile 的存儲效率;
  2. MemStore 將緩存部分數據到內存,如果 rowkey 字段過長,內存的有效利用率就會降低,系統不能緩存更多的數據,這樣會降低檢索效率;
  3. 目前操作系統都是 64 位系統,內存 8 字節對齊,控制在 16 個字節,8 字節的整數倍利用了操作系統的最佳特性。

3.RowKey 設計案例剖析

3.1 交易類表 Rowkey 設計

查詢某個賣家某段時間內的交易記錄
sellerId + timestamp + orderId

查詢某個買家某段時間內的交易記錄
buyerId + timestamp +orderId

根據訂單號查詢 orderNo
如果某個商家賣了很多商品,可以如下設計 Rowkey 實現快速搜索salt+sellerId + timestamp 其中,salt 是隨機數。
可以支持的場景:

  1. 全表 Scan
  2. 按照 sellerId 查詢
  3. 按照 sellerId + timestamp 查詢

3.2 金融風控 Rowkey 設計

查詢某個用戶的用戶畫像數據

  1. prefix + uid
  2. prefix + idcard
  3. prefix + tele
    其中 prefix = substr(md5(uid),0 ,x), x 取 5-6。uid、idcard 以及 tele 分別表示 用戶唯一標識符、身份證、手機號碼。

3.3 車聯網 Rowkey 設計 查詢某輛車在某個時間范圍的交易記錄
carId + timestamp
某批次的車太多,造成熱點
prefix + carId + timestamp 其中 prefix = substr(md5(uid),0 ,x)

3.4 查詢最近的數據
查詢用戶最新的操作記錄或者查詢用戶某段時間的操作記錄,RowKey 設計如下: uid + Long.Max_Value - timestamp
支持的場景

查詢用戶最新的操作記錄
Scan [uid] startRow uid stopRow uid

查詢用戶某段時間的操作記錄
Scan [uid] startRow uid stopRow uid

如果 RowKey 無法滿足我們的需求,可以嘗試二級索引。Phoenix、Solr 以及 ElasticSearch 都可以用于構建二級索引。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252586.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252586.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCIe簡介及引腳定義

隨著現代處理器技術的發展,在互連領域中,使用高速差分總線替代并行總線是大勢所趨。與單端并行信號相比,高速差分信號可以使用更高的時鐘頻率,從而使用更少的信號線,完成之前需要許多單端并行數據信號才能達到的總線帶…

IDEA下搜狗輸入法輸入中文時卡著不動的參考解決方法

【問題描述】 在IntelliJ IDEA工具的java編輯窗口,給代碼增加注釋時發現,輸入中文時,搜狗輸入法界面不動,只顯示第一個字母。如圖: 我想輸入“根據”兩個字,但搜狗輸入法界面一直卡著不刷新,導…

6U VPX板卡資料:6U VPX 高性能計算存儲板卡

6U VPX板卡資料:6U VPX 高性能計算存儲板卡_hexiaoyan827的博客-CSDN博客_vpx板卡

Android: Custom View和include標簽的區別

Custom View&#xff0c; 使用的時候是這樣的&#xff1a; <com.example.home.alltest.view.MyCustomViewandroid:id"id/customView"android:layout_width"match_parent"android:layout_height"wrap_content"></com.example.home.allte…

七 web爬蟲講解2—urllib庫爬蟲—狀態嗎—異常處理—瀏覽器偽裝技術、設置用戶代理...

如果爬蟲沒有異常處理&#xff0c;那么爬行中一旦出現錯誤&#xff0c;程序將崩潰停止工作&#xff0c;有異常處理即使出現錯誤也能繼續執行下去 1.常見狀態嗎 301&#xff1a;重定向到新的URL&#xff0c;永久性302&#xff1a;重定向到臨時URL&#xff0c;非永久性304&#x…

DVI和HDMI中的TMDS接口協議

TMDS&#xff08;Transition Minimized Differential signal&#xff09;&#xff0c;即過渡調制差分信號&#xff0c;也被稱為最小化傳輸差分信號&#xff0c;是指通過異或及異或非等邏輯算法將原始信號數據轉換成10位&#xff0c;前8為數據由原始信號經運算后獲得&#xff0c…

君子眼中皆好人

從前有個國王&#xff0c;在晚年時思量 著&#xff1a;“我有兩個兒子&#xff0c;我應該把王位傳給哪個兒子來統治這個國家呢&#xff1f;”國王決定考驗一下他的兩位王子&#xff0c;哪位最是忠義仁厚&#xff0c;愛護老百姓的明君。國王叫來長子&#xff0c; 對他說&#xf…

GS使用HTTPS登錄的設置過程

1. Windows 增加角色服務 服務器配置管理器&#xff0c; 添加角色服務 增加角色功能里面有&#xff1a; 證書頒發機構 證書頒發機構 web注冊 2. AD CS配置 主要是next操作 獨立ca 根證書 等 3. inetmgr申請證書 在機器名的一層及上面申請證書 保存證書信息 用來使用CA機構進行簽…

TMDS的信號通道

1 TMDS的信號通道&#xff1a; 1個HDMI包括3個TMDS數據通道和1個TMDS時鐘通道。 . 每一個TMDS時鐘周期內&#xff0c;TMDS數據通道上會發送一個10位的字符信息&#xff1b; . 每個TMDS時鐘周期內&#xff0c;編碼器將2位的控制數據、4位的報數據或者8位的視頻數據采取不同 …

[luoguP2774] 方格取數問題(最大點權獨立集)

傳送門 引入兩個概念&#xff1a; 最小點權覆蓋集&#xff1a;滿足每一條邊的兩個端點至少選一個的最小權點集。 最大點權獨立集&#xff1a;滿足每一條邊的兩個端點最多選一個的最大權點集。 現在對網格染色&#xff0c;使得相鄰兩點顏色不同&#xff0c;之后把兩個顏色的點分…

docker入門之容器網絡

docker入門之容器網絡首發&#xff1a;arppinging.com一、網絡命名空間1&#xff09;IP命令2&#xff09;實例二、網絡模型三、容器中常見的網絡操作1&#xff09;指定網絡模式2&#xff09;指定容器的dns地址和hosts解析四、網橋配置一、網絡命名空間1&#xff09;IP命令查看i…

光譜分布、光譜輻射通量密度與不同時間段分布光譜(圖示)

1、光譜分布圖 2 太陽輻射能量圖 3、不同時間段的太陽分布光譜圖 4、不同波長的光的能量分布主要區域 5、不同波段的使用場景

$.ajax()方法詳解

相關鏈接&#xff1a;http://blog.csdn.net/denghejing/article/details/41087581轉載于:https://www.cnblogs.com/Steven5007/p/8191275.html

【從零開始】Python字符串的操作方法

1. 字符串長度 #strlen(str)       # 字符串長度函數名str apples    # 把字符串 "apples" 賦值給變量 strprint (len(str))      # 打印字符串的長度 2. 查找字符 #strchr(str1,str2)      # 查找字符函數名str1 apples      …

SQL工廠法

表結構&#xff1a; exeno caption params sqlcommand tablename 201 登錄 loginname ftsring(20) select * from user where loginname:loginname user //autho…

基于深度學習和傳統算法的人體姿態估計,技術細節都講清楚了

計算機視覺的一大研究熱點是人體姿態估計&#xff0c;還有很多問題急需解決&#xff0c;比如遮擋&#xff0c;交互等等。在最近的CVPR2020里邊也有很多這方面的工作。本文站長主要是想談談基于深度學習的實時多人姿態估計。 人體姿態估計要干嘛&#xff1f; 關于人類活動規律的…

一些linux知識和http知識

一些linux知識和http知識 1 yum安裝比源碼編譯安裝 有的模塊不能自定義安裝 只能安裝默認的模塊進行安裝 2 關于php的fastcgi 如果使用fastcgi 那么需要啟動服務 如果不使用fastcgi 那么不需要啟動這個服務 3 一個完整的HTTP解析路徑 用戶瀏覽器比如訪問www.123.com/index.…

楊浦區阜盛農民工子弟小學見聞

天氣有些陰沉&#xff0c;起了個大早&#xff0c;一個小時奔波后來到了這里…… 大門口&#xff1a; 校領導&#xff1a; 有些破舊的校舍和陰沉的天空下祖國的希望&#xff1a; 同上&#xff0c;希望…… 期待的目光&#xff1a; 頑皮的笑臉&#xff0c;排著隊也要調皮&#xf…

《構建之法》7

十五章講的是穩定和發布階段。軟件生命周期的最后階段往往是最考驗團隊的。從代碼完成到最終發布軟件&#xff0c;需要經歷&#xff1a;完成代碼、集成測試、Bug修復、Alpha發布、DCR Bug修復、Beta發布、外部測試、RTO等。軟件團隊的各個角色代表&#xff0c;組成會診小組。對…

人體姿態估計算法之open pose

一&#xff0c;openpose是一種自底向上的算法&#xff1a; OpenPose人體姿態識別項目是美國卡耐基梅隆大學&#xff08;CMU&#xff09;基于卷積神經網絡和監督學習并以Caffe為框架開發的開源庫。可以實現人體動作、面部表情、手指運動等姿態估計。適用于單人和多人&am…