從頭學習大數據培訓課程 NOSQL 資料庫 hbase(六)根據自定義方法預分 region

1. hbase的預分region

hbase創建的表,默認情況下region split的方法是根據數據的增長量按字典排序對rowkey進行區間劃分的,如果你的rowkey的分布在某個字典區間內有大量的數據,就會造成數據分布的不均衡形成單region熱點。所以要根據你的rowkey分布情況進行數據區間的劃分。

默認情況下的rowkey劃分情況

預分region實際上就是制定每個region的rowkey的區間,讓rowkey更加均勻的分布到每個region上,所以最主要的就是對rowkey的數據分布進行分析,以user_install_status的aid為例

因為hbase的rowkey是按字典順序進行排列的,所以要把rowkey從左到右的增加位數形成的字母組合進行分析,使用hive編寫SQL進行簡單的數據分析

用到的函數

首先分析第一位字母的數據量佔比

select sub,count(1) n from (select substring(aid,1,1) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

分析前兩位字母組合的數據量佔比

select sub,count(1) n from (select substring(aid,1,2) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

分析前三位字母組合的數據量佔比

select sub,count(1) n from (select substring(aid,1,3) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

分析前四位字母組合的數據量佔比

select sub,count(1) n from (select substring(aid,1,4) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

從結果中看第四種組合能使rowkey的分布更加均衡,所以採用第四種結果,設置好每個region的超始key和終止key。這樣以後插入該表中以aid為rowkey的所有數據就會均衡分布到指定的region中,並且對以後大量數據的寫入讀取也能輕鬆應對。

所以採用前4位字母的組合對rowkey的區間進行劃分

用hive進行分析前4位每位數據量的佔比情況

select sub,count(1) n from (select substring(aid,1,1) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

select sub,count(1) n from (select substring(aid,2,1) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

select sub,count(1) n from (select substring(aid,3,1) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

select sub,count(1) n from (select substring(aid,4,1) as sub from user_install_status where dt=20141228) a group by sub order by n desc;

每位使用的字母如下:

2. 生成rowkey的start和end組合的配置文件

考慮到如果按這種情況進行組合就會形成151616*16=61440個region。所以可以把最後一位劃分成兩個區間即0到7,8到f

根據以上情況生成region的key劃分配置文件。

每相鄰的2行就是一個region的超始key和終止key。4df~4df8就包含了以4df(包含)開頭以4df8(不包含)結束的所有字典排序數據

4df8~4e0就包含了以4df8(包含)開頭以4e0(不包含)結束的所有字典排序數據,包括4df8、4df9、4dfa、4dfb、4dfc、4dfd、4dfe、4dff開頭的所有數據

配置中增加對局部偏移數據的再次劃分

把生成的配置文件放下工程的resource目錄下

3. 自定義split方法,並讀取這個配置文件

生成jar包

4. 群集運行

注意只需要包含配置文件和split類即可

上傳到伺服器的指定目錄

並把這個目錄配置到操作機的hbase-env.sh的HBASE_CLASSPATH里

然後使用以下命令創建表並根據你的自定義split類進行region的預分

hbase org.apache.hadoop.hbase.util.RegionSplitter hainiu_user_install_status_aid_split1 com.hainiu.hadoop.hbase.HainiuAidSplit -c 2 -f f

-c是指定分多少個region但是在我的自定義的split中並沒有使用,不過這是命令的必填項所以要必須寫上。只要大於1就可以

-f是指定列簇的名稱。

由於要生成7000多個region所以比較耗時,要耐心等待。可以通過master log查看是否執行

完成之後可以通過master的web界面查看分的region信息

每個region的rowkey範圍

5. 進行插入數據的測試

hadoop jar ./mapreducer-1.0-hainiu.jar hainiuhbasehfile -Dhainiu.task.input=/data/hainiu/user_install_status/20141228 -Dhainiu.task.id=hbase

由於有7695個region所以這個MR任務會生成7695成reducer用於生成hfile文件

hadoop fs -du -s -h /hbase/data/default/hainiu_user_install_status_aid_split1/*

可以看到每個hfile文件大小是比較均衡的

由於使用了壓縮所以文件大小有差異,但裡面的rowkey相差不大

6. 遇到的問題

導入的時候hbase的regionserver掛了,因為當前系統每個用戶打開的文件數最多為1024

而導入的hfile文件為7000多個平均分配到4台機器上,每個機器上超過了1024的上限所以regionserver報了下面的異常

修改limits.conf文件

將所有用戶的打開文件數量修改為102400

vim /etc/security/limits.conf

在文件最下面加上

nproc 102400

nofile 102400

這樣新建的表還需要修改一下列簇的壓縮演算法:

修改HBase壓縮演算法很簡單,只需要如下幾步:

hbase shell命令下,disable相關表:

(1).disable hainiu_user_install_status_aid_split1

如果表的數據量很大,region很多,disable過程會比較緩慢,需要等待較長時間。過程可以通過查看hbase master log日誌監控。

(2). alter hainiu_user_install_status_aid_split1, NAME => f, COMPRESSION => snappy

NAME即column family,列族。HBase修改壓縮格式,需要一個列族一個列族的修改。名字一定要與你自己列簇的名字一致,否則就會創建一個新的列簇並且壓縮格式是snappy的。如果寫錯了那就要通過下面這個命令刪除。

alter hainiu_user_install_status_aid_split1, {NAME=>寫錯的那個列簇, METHOD=>delete}

用此方法需謹慎刪錯了就可以跳槽了

(3). enable hainiu_user_install_status_aid_split1

重新enable表

(4). major_compact hainiu_user_install_status_aid_split1

enable表後,HBase表的壓縮格式並沒有生效,還需要執行一個命令,major_compact

該動作耗時較長,會對hbase的服務造成很大的影響,可以選擇在一個服務不忙的時間來做。或者是在往表裡插入數據之前就指定好每個列簇的壓縮演算法

查看regionserver日誌


本文由海牛學院青牛原創,轉載請註明出處


推薦閱讀:

[引子]政務大數據的七大痛點
大數據的價值之路
Tesseract-OCR 字元識別---樣本訓練
Pyspark實例——Spark On YARN將HDFS的數據寫入Redis
為什麼說「大數據」可能被人們過度神化了

TAG:大數據 | 大數據處理 | HBase |