日期:2014-05-16  浏览次数:20388 次

HBase集群RegionServer节点扩容性能验证

RegionServer节点扩展后,需要将一部分原有Region迁移到新的RegionServer中,使各RegionServer负载均衡。

为了验证多了一个节点后的HBase的写性能提升,需要使每次put时List中的RowKey平均分配到现有的所有Region中,以达到使所有RegionServer并发处理的目的。

下面的代码是这种均匀RowKey构建的元代码:

import java.util.ArrayList;
import java.util.List;


public class externTest {

	public static long TOTAL_NUMS = 145;
	public static int REGION_NUMS = 24;
	public static long EACH_PUT_NUMS = 48;

	public static void buildString() {
		int addition = 0;
		String str = null;
		List<String> list = new ArrayList<String>();
		long curNum = 0;
		
		long putNums = TOTAL_NUMS/EACH_PUT_NUMS;	//通常等于总put数-1;
		long loopsInOnePut = EACH_PUT_NUMS/REGION_NUMS;	//一次put所需的内层循环数,也即是curNum自增数
		
		// 处理循环内的
		for (long k = 0; k < putNums; k++) {
			for (long i = 0; i < loopsInOnePut; i++) {
				for (int j = 0; j < REGION_NUMS; j++) {
					//A-Z使用同一个数值
					addition = j % REGION_NUMS;
					str = num2ABC(addition);
					//构建本条记录字符串
					System.out.println(str + curNum);
					list.add(str);
				}
				curNum++;	//一次循环后当前尾数+1
			}
			// TODO: 执行一次put
			System.out.println("put");
			list.clear();
		}
		
		// 处理循环外的,肯定小于EACH_PUT_NUMS,最后一次put操作
		long lastNums = TOTAL_NUMS % EACH_PUT_NUMS;	//还剩多少记录要put
		long lastloops = lastNums / REGION_NUMS;	//curNum还要自增多少
		long numPlus = lastNums % REGION_NUMS;		//最后额外补充多少条记录
		for (long i = 0; i < lastloops; i++) {
			for (int j = 0; j < REGION_NUMS; j++) {
				//A-Z使用同一个数值
				addition = j % REGION_NUMS;
				str = num2ABC(addition);
				//构建本条记录字符串
				System.out.println(str + curNum);
				list.add(str);
			}
			curNum++;	//一次循环后当前尾数+1
		}
		// 将循环外
		for (int j = 0; j < numPlus; j++) {
			//A-Z使用同一个数值
			addition = j % REGION_NUMS;
			str = num2ABC(addition);
			//构建本条记录字符串
			System.out.println(str + curNum);
			list.add(str);
		}
		// TODO: 执行一次put
		System.out.println("put");
		list.clear();
		
		return;
	}
	
	public static String num2ABC(int num) {
		String str = null;
		switch (num) {
			case 0:
				str = new String("A");
				break;
			case 1:
				str = new String("B");
				break;
			case 2:
				str = new String("C");
				break;
			case 3:
				str = new String("D");
				break;
			case 4:
				str = new String("E");
				break;
			case 5:
				str = new String("F");
				break;
			case 6:
				str = new String("G");
				break;
			case 7:
				str = new String("H");
				break;
			case 8:
				str = new String("I");
				break;
			case 9:
				str = new String("J");
				break;
			case 10:
				str = new String("K");
				break;
			case 11:
				str = new String("L");
				break;
			case 12:
				str = new String("M");
				break;
			case 13:
				str = new String("N");
				break;
			case 14:
				str = new String("O");
				break;
			case 15:
				str = new String("P");
				break;
			case 16:
				str = new String("Q");
				break;
			case 17:
				str = new String("R");
				break;
			case 18:
				str = new String("S");
				break;
			case 19:
				str = new String("T");
				break;
			case 20:
				str = new String("U");
				break;
			case 21:
				str = new String("V");
				break;
			case 22:
				str = new String("W");
				break;
			case 23:
				str = new String("X");
				break;
			default:
				str = new String("Z");
				break;
		}
		return str;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Test my Java!");
		
		buildString();
	}
}

Author:Pirate Leo