機(jī)械設(shè)計(jì)網(wǎng)站推薦重大新聞事件2023
Hbase的Rowkey設(shè)計(jì)
rowkey設(shè)計(jì)
# 1)長(zhǎng)度原則# 最大64KB,推薦長(zhǎng)度10~100 byte# 最好設(shè)為8的倍數(shù),能短則短,rowkey如果太長(zhǎng)會(huì)影響性能。# 2)唯一原則:rowkey應(yīng)該具備唯一性# 3)散列原則# 3-1)鹽值散列,不能使用時(shí)間戳直接作為rowkey# 在rowkey加隨機(jī)數(shù)# 3-2)字符串反轉(zhuǎn)# 時(shí)間戳,電話號(hào)碼(前面位數(shù)相同容易分到一個(gè)分區(qū))# 3-3)計(jì)算分區(qū)號(hào),HashMap# ASCII有序,常用列設(shè)計(jì)Rowkey放在前面
分區(qū)設(shè)計(jì)+Rowkey設(shè)計(jì),以手機(jī)號(hào)碼+日期為例
生成分區(qū)鍵,以6個(gè)分區(qū)
分區(qū)號(hào):0,1,2,3,4,5
分區(qū)范圍:(-∞,0),[0,1),[1,2),[2,3),[3,4),[4,5),[5,+∞)
RowKey前綴:0|,1|,2|,3|,4|,5|
Rowkey范圍:(-∞,0|),[0|,1|),[1|,2|),[2|,3|),[2|,3|),[4|,5|),[5|,+∞)
/*** 生成分區(qū) 鍵(優(yōu)化)** @param regionCount 分區(qū)數(shù)* @return*/private byte[][] getSplitKeys(int regionCount) {int splitKeyCount = regionCount - 1;int length = Integer.toString(regionCount - 2).length();byte[][] bs = new byte[splitKeyCount][];List<byte[]> bsList = new ArrayList<>();for (int i = 0; i < splitKeyCount; i++) {String key = NumberUtils.format(i, length) + "|";
// System.out.println(key);bsList.add(Bytes.toBytes(key));}bsList.toArray(bs);return bs;}
生成分區(qū)號(hào)
通過(guò)手機(jī)號(hào)+日期生成分區(qū)號(hào),得到Rowkey的前綴。
/*** TODO:計(jì)算分區(qū)號(hào)** @param tel* @param date* @return*/protected String getRagionNum(String tel, String date) {//手機(jī)號(hào)碼的后4位String usercode = tel.substring(tel.length() - 4);//年月日時(shí)分秒(年月)String yearMonth = date.substring(0, 6);int userCodeHash = usercode.hashCode();int yearMonthHash = yearMonth.hashCode();//crc檢驗(yàn)采用異或算法int crc = Math.abs(userCodeHash ^ yearMonthHash);int regionNum = crc % ValueConstant.REGION_COUNT;int length = Integer.toString(ValueConstant.REGION_COUNT - 2).length();return NumberUtils.format(regionNum, length);}
Rowkey
String rowkey = getRagionNum(call1, calltime) + "_" + call1 + "_" + calltime;
補(bǔ)零工具類
/*** 將數(shù)字格式化為字符串* @param num* @param length* @return*/public static String format(int num,int length){StringBuffer stringBuffer = new StringBuffer();for (int i = 0; i < length; i++) {stringBuffer.append("0");}DecimalFormat df =new DecimalFormat(stringBuffer.toString());return df.format(num);}