·ÖÏí

HBase RowkeyµÄÉ¢ÁÐÓëÔ¤·ÖÇøÉè¼Æ


ÎÊÌâµ¼¶Á£º
1.ÈçºÎ·ÀÖ¹Èȵ㣿
2.ÈçºÎÔ¤·ÖÇø£¿
À©Õ¹£º
Ϊʲô»á²úÉúÈȵã´æ´¢£¿






HBaseÖУ¬±í»á±»»®·ÖΪ1...n¸öRegion£¬±»ÍйÜÔÚRegionServerÖС£Region¶þ¸öÖØÒªµÄÊôÐÔ:StartKeyÓëEndKey±íʾÕâ¸öRegionά»¤µÄrowKey·¶Î§£¬µ±ÎÒÃÇÒª¶Á/дÊý¾Ýʱ£¬Èç¹ûrowKeyÂäÔÚij¸östart-end key·¶Î§ÄÚ£¬ÄÇô¾Í»á¶¨Î»µ½Ä¿±êregion²¢ÇÒ¶Á/дµ½Ïà¹ØµÄÊý¾Ý¡£¼òµ¥µØ˵£¬ÓÐÄÇôһµãµãÀàËÆÈËȺ»®·Ö£¬1-15ËêΪСÅóÓÑ,16-39ËêΪÄêÇáÈË£¬40-64ΪÖÐÄêÈË,65ËêÒÔÉÏΪÀÏÄêÈË¡£(ÕâЩÊýÖµ¶¼ÊÇÅÄÄÔ´ü³öÀ´µÄ£¬Ö»ÊǾÙÀý£¬·ÇÕæʵ),È»ºóijÈËÕÒ¶ÓÎ飬Ȼºó¸ù¾ÝÄêÁ䣬´¦ÓÚÄĸö·¶Î§£¬¾ÍÕÒµ½ËüËùÊôµÄ¶ÓÎé¡£ : ( Óеã·Ï»°ÁË¡£¡£¡£¡£
    È»ºó£¬Ä¬Èϵأ¬µ±ÎÒÃÇÖ»ÊÇͨ¹ýHBaseAdminÖ¸¶¨TableDescriptorÀ´´´½¨Ò»Õűíʱ£¬Ö»ÓÐÒ»¸öregion,Õý´¦ÓÚ»ìãçʱÆÚ£¬start-end keyÎޱ߽ç,¿Éνº£ÄÉ°Ù´¨¡£É¶ÑùµÄrowKey¶¼¿ÉÒÔ½ÓÊÜ£¬¶¼ÍùÕâ¸öregionÀï×°£¬È»¶ø£¬µ±Êý¾ÝÔ½À´Ô½¶à£¬regionµÄsizeÔ½À´Ô½´óʱ£¬´óµ½Ò»¶¨µÄ·§Öµ£¬hbaseÈÏΪÔÙÍùÕâ¸öregionÀïÈûÊý¾ÝÒѾ­²»ºÏÊÊÁË£¬¾Í»áÕÒµ½Ò»¸ömidKey½«regionÒ»·ÖΪ¶þ£¬³ÉΪ2¸öregion,Õâ¸ö¹ý³Ì³ÆΪ·ÖÁÑ(region-split).¶ømidKeyÔòΪÕâ¶þ¸öregionµÄÁٽ磬×óΪNÎÞϽ磬ÓÒΪMÎÞÉϽ硣< midKeyÔòΪÒõ±»Èûµ½NÇø£¬> midKeyÔò»á±»Èûµ½MÇø¡£
    ÈçºÎÕÒµ½midKey?Éæ¼°µÄÄÚÈݱȽ϶࣬ÔÝÇÒ²»È¥ÌÖÂÛ£¬×î¼òµ¥µÄ¿ÉÒÔÈÏΪÊÇregionµÄ×ÜÐÐÊý / 2 µÄÄÇÒ»ÐÐÊý¾ÝµÄrowKey.ËäȻʵ¼ÊÉϱÈËü»áÉÔ¸´Ôӵ㡣
    Èç¹ûÎÒÃǾÍÕâÑùĬÈϵأ¬½¨±í£¬±íÀï²»¶ÏµØPutÊý¾Ý£¬¸üÑÏÖصÄÊÇÎÒÃǵÄrowkey»¹ÊÇ˳ÐòÔö´óµÄ£¬ÊDZȽϿÉŵġ£´æÔÚµÄȱµã±È½ÏÃ÷ÏÔ¡£

    Ê×ÏÈÊÇÈȵãд£¬ÎÒÃÇ×ÜÊÇ»áÍù×î´óµÄstart-keyËùÔÚµÄregion䶫Î÷£¬ÒòΪÎÒÃǵÄrowkey×ÜÊÇ»á±È֮ǰµÄ´ó£¬²¢ÇÒhbaseµÄÊÇ°´ÉýÐò·½Ê½ÅÅÐòµÄ¡£ËùÒÔд²Ù×÷×ÜÊDZ»¶¨Î»µ½ÎÞÉϽçµÄÄǸöregionÖС£
    Æä´Î£¬ÓÉÓÚдÈȵ㣬ÎÒÃÇ×ÜÊÇÍù×î´óstart-keyµÄregionд¼Ç¼£¬Ö®Ç°·ÖÁѳöÀ´µÄregion²»»áÔÙ±»Ð´Êý¾Ý£¬Óе㱻´ò½øÀ乬µÄ¸Ï½Å£¬ËüÃǶ¼´¦ÓÚ°ëÂú״̬£¬ÕâÑùµÄ·Ö²¼Ò²ÊDz»ÀûµÄ¡£
    Èç¹ûÔÚд±È½ÏƵÂʵij¡¾°Ï£¬Êý¾ÝÔö³¤¿ì£¬splitµÄ´ÎÊýÒ²»áÔö¶à£¬ÓÉÓÚsplitÊDZȽϺÄʱºÄ×ÊÔ´µÄ£¬ËùÒÔÎÒÃDz¢²»Ï£ÍûÕâÖÖÊÂÇé¾­³£·¢Éú¡£
    ............

    ¿´µ½ÕâЩȱµã£¬ÎÒÃÇÖªµÀ£¬ÔÚ¼¯ÈºµÄ»·¾³ÖУ¬ÎªÁ˵õ½¸üºÃµÄ²¢ÐÐÐÔ£¬ÎÒÃÇÏ£ÍûÓкõÄload blance£¬ÈÃÿ¸ö½ÚµãÌṩµÄÇëÇó´¦Àí¶¼ÊǾùµÈµÄ¡£ÎÒÃÇҲϣÍû£¬region²»Òª¾­³£split£¬ÒòΪsplit»áʹserverÓÐÒ»¶Îʱ¼äµÄÍ£¶Ù£¬ÈçºÎÄÜ×öµ½ÄØ£¿
Ëæ»úÉ¢ÁÐÓëÔ¤·ÖÇø¡£¶þÕß½áºÏÆðÀ´£¬ÊDZȽÏÍêÃÀµÄ£¬Ô¤·ÖÇøÒ»¿ªÊ¼¾ÍÔ¤½¨ºÃÁËÒ»²¿·Öregion,ÕâЩregion¶¼Î¬»¤×Å×ÔÒѵÄstart-end keys£¬ÔÙÅäºÏÉÏËæ»úÉ¢ÁУ¬Ð´Êý¾ÝÄܾùµÈµØÃüÖÐÕâЩԤ½¨µÄregion£¬¾ÍÄܽâ¾öÉÏÃæµÄÄÇЩȱµã£¬´ó´óµØÌá¸ßÁËÐÔÄÜ¡£

Ìṩ2ÖÖ˼·: hash Óë partition.
    hash¾ÍÊÇrowkeyÇ°ÃæÓÉÒ»´®Ëæ»ú×Ö·û´®×é³É,Ëæ»ú×Ö·û´®Éú³É·½Ê½¿ÉÒÔÓÉSHA»òÕßMD5µÈ·½Ê½Éú³É£¬Ö»ÒªregionËù¹ÜÀíµÄstart-end keys·¶Î§±È½ÏËæ»ú£¬ÄÇô¾Í¿ÉÒÔ½â¾öдÈȵãÎÊÌâ¡£

  1. long currentId = 1L;
  2. byte [] rowkey = Bytes.add(MD5Hash.getMD5AsHex(Bytes.toBytes(currentId)).substring(0, 8).getBytes(),
  3.                     Bytes.toBytes(currentId));
¸´ÖÆ´úÂë


¼ÙÉèrowKeyÔ­±¾ÊÇ×ÔÔö³¤µÄlongÐÍ£¬¿ÉÒÔ½«rowkeyתΪhashÔÙתΪbytes£¬¼ÓÉϱ¾Éíid תΪbytes,×é³Érowkey£¬ÕâÑù¾ÍÉú³ÉËæ±ãµÄrowkey¡£ÄÇô¶ÔÓÚÕâÖÖ·½Ê½µÄrowkeyÉè¼Æ£¬ÈçºÎÈ¥½øÐÐÔ¤·ÖÇøÄØ£¿
    1.È¡Ñù£¬ÏÈËæ»úÉú³ÉÒ»¶¨ÊýÁ¿µÄrowkey,½«È¡ÑùÊý¾Ý°´ÉýÐòÅÅÐò·Åµ½Ò»¸ö¼¯ºÏÀï
    2.¸ù¾ÝÔ¤·ÖÇøµÄregion¸öÊý£¬¶ÔÕû¸ö¼¯ºÏƽ¾ù·Ö¸î£¬¼´ÊÇÏà¹ØµÄsplitKeys.
    3.HBaseAdmin.createTable(HTableDescriptor tableDescriptor,byte[][] splitkeys)¿ÉÒÔÖ¸¶¨Ô¤·ÖÇøµÄsplitKey£¬¼´ÊÇÖ¸¶¨region¼äµÄrowkeyÁÙ½çÖµ.

   1.´´½¨split¼ÆËãÆ÷£¬ÓÃÓÚ´Ó³éÑùÊý¾ÝÖÐÉú³ÉÒ»¸ö±È½ÏºÏÊʵÄsplitKeys

  1. public class HashChoreWoker implements SplitKeysCalculator{
  2.     //Ëæ»úÈ¡»úÊýÄ¿
  3.     private int baseRecord;
  4.     //rowkeyÉú³ÉÆ÷
  5.     private RowKeyGenerator rkGen;
  6.     //È¡Ñùʱ£¬ÓÉÈ¡ÑùÊýÄ¿¼°regionÊýÏà³ýËùµÃµÄÊýÁ¿.
  7.     private int splitKeysBase;
  8.     //splitkeys¸öÊý
  9.     private int splitKeysNumber;
  10.     //ÓɳéÑù¼ÆËã³öÀ´µÄsplitkeys½á¹û
  11.     private byte[][] splitKeys;
  12.     public HashChoreWoker(int baseRecord, int prepareRegions) {
  13.         this.baseRecord = baseRecord;
  14.         //ʵÀý»¯rowkeyÉú³ÉÆ÷
  15.         rkGen = new HashRowKeyGenerator();
  16.         splitKeysNumber = prepareRegions - 1;
  17.         splitKeysBase = baseRecord / prepareRegions;
  18.     }
  19.     public byte[][] calcSplitKeys() {
  20.         splitKeys = new byte[splitKeysNumber][];
  21.         //ʹÓÃtreeset±£´æ³éÑùÊý¾Ý£¬ÒÑÅÅÐò¹ý
  22.         TreeSet<byte[]> rows = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);
  23.         for (int i = 0; i < baseRecord; i++) {
  24.             rows.add(rkGen.nextId());
  25.         }
  26.         int pointer = 0;
  27.         Iterator<byte[]> rowKeyIter = rows.iterator();
  28.         int index = 0;
  29.         while (rowKeyIter.hasNext()) {
  30.             byte[] tempRow = rowKeyIter.next();
  31.             rowKeyIter.remove();
  32.             if ((pointer != 0) && (pointer % splitKeysBase == 0)) {
  33.                 if (index < splitKeysNumber) {
  34.                     splitKeys[index] = tempRow;
  35.                     index ++;
  36.                 }
  37.             }
  38.             pointer ++;
  39.         }
  40.         rows.clear();
  41.         rows = null;
  42.         return splitKeys;
  43.     }
  44. }
¸´ÖÆ´úÂë



  1. KeyGenerator¼°ÊµÏÖ
  2. //interface
  3. public interface RowKeyGenerator {
  4.     byte [] nextId();
  5. }
  6. //implements
  7. public class HashRowKeyGenerator implements RowKeyGenerator {
  8.     private long currentId = 1;
  9.     private long currentTime = System.currentTimeMillis();
  10.     private Random random = new Random();
  11.     public byte[] nextId() {
  12.         try {
  13.             currentTime += random.nextInt(1000);
  14.             byte[] lowT = Bytes.copy(Bytes.toBytes(currentTime), 4, 4);
  15.             byte[] lowU = Bytes.copy(Bytes.toBytes(currentId), 4, 4);
  16.             return Bytes.add(MD5Hash.getMD5AsHex(Bytes.add(lowU, lowT)).substring(0, 8).getBytes(),
  17.                     Bytes.toBytes(currentId));
  18.         } finally {
  19.             currentId++;
  20.         }
  21.     }
  22. }
¸´ÖÆ´úÂë


unit test case²âÊÔ

  1. @Test
  2. public void testHashAndCreateTable() throws Exception{
  3.         HashChoreWoker worker = new HashChoreWoker(1000000,10);
  4.         byte [][] splitKeys = worker.calcSplitKeys();
  5.         
  6.         HBaseAdmin admin = new HBaseAdmin(HBaseConfiguration.create());
  7.         TableName tableName = TableName.valueOf("hash_split_table");
  8.         
  9.         if (admin.tableExists(tableName)) {
  10.             try {
  11.                 admin.disableTable(tableName);
  12.             } catch (Exception e) {
  13.             }
  14.             admin.deleteTable(tableName);
  15.         }
  16.         HTableDescriptor tableDesc = new HTableDescriptor(tableName);
  17.         HColumnDescriptor columnDesc = new HColumnDescriptor(Bytes.toBytes("info"));
  18.         columnDesc.setMaxVersions(1);
  19.         tableDesc.addFamily(columnDesc);
  20.         admin.createTable(tableDesc ,splitKeys);
  21.         admin.close();
  22.     }
¸´ÖÆ´úÂë


²é¿´½¨±í½á¹û£ºÖ´ÐÐ scan 'hbase:meta'
1.jpg
      ÒÔÉÏÎÒÃÇÖ»ÊÇÏÔʾÁ˲¿·ÖregionµÄÐÅÏ¢£¬¿ÉÒÔ¿´µ½regionµÄstart-end key »¹ÊDZȽÏËæ»úÉ¢Áеġ£Í¬Ñù¿ÉÒԲ鿴hdfsµÄĿ¼½á¹¹,µÄÈ·ºÍÔ¤ÆÚµÄ38¸öÔ¤·ÖÇøÒ»Ö£º
2.jpg
     ÒÔÉÏ£¬¾ÍÒѾ­°´hash·½Ê½£¬Ô¤½¨ºÃÁË·ÖÇø£¬ÒÔºóÔÚ²åÈëÊý¾ÝµÄʱºò£¬Ò²Òª°´ÕÕ´ËrowkeyGeneratorµÄ·½Ê½Éú³Érowkey,ÓÐÐËȤµÄ»°£¬Ò²¿ÉÒÔ×öЩÊÔÑ飬²åÈëЩÊý¾Ý£¬¿´¿´Êý¾ÝµÄ·Ö²¼¡£
     partition¹ÊÃû˼Ò壬¾ÍÊÇ·ÖÇøʽ£¬ÕâÖÖ·ÖÇøÓеãÀàËÆÓÚmapreduceÖеÄpartitioner,½«ÇøÓòÓó¤ÕûÊý(Long)×÷Ϊ·ÖÇøºÅ£¬Ã¿¸öregion¹ÜÀí×ÅÏàÓ¦µÄÇøÓòÊý¾Ý£¬ÔÚrowKeyÉú³Éʱ£¬½«idÈ¡Ä£ºó£¬È»ºóÆ´ÉÏidÕûÌå×÷ΪrowKey.Õâ¸ö±È½Ï¼òµ¥£¬²»ÐèҪȡÑù£¬splitKeysÒ²·Ç³£¼òµ¥£¬Ö±½ÓÊÇ·ÖÇøºÅ¼´¿É¡£Ö±½ÓÉÏ´úÂë°É£º

  1. public class PartitionRowKeyManager implements RowKeyGenerator,
  2.         SplitKeysCalculator {
  3.     public static final int DEFAULT_PARTITION_AMOUNT = 20;
  4.     private long currentId = 1;
  5.     private int partition = DEFAULT_PARTITION_AMOUNT;
  6.     public void setPartition(int partition) {
  7.         this.partition = partition;
  8.     }
  9.     public byte[] nextId() {
  10.         try {
  11.             long partitionId = currentId % partition;
  12.             return Bytes.add(Bytes.toBytes(partitionId),
  13.                     Bytes.toBytes(currentId));
  14.         } finally {
  15.             currentId++;
  16.         }
  17.     }
  18.     public byte[][] calcSplitKeys() {
  19.         byte[][] splitKeys = new byte[partition - 1][];
  20.         for(int i = 1; i < partition ; i ++) {
  21.             splitKeys[i-1] = Bytes.toBytes((long)i);
  22.         }
  23.         return splitKeys;
  24.     }
  25. }
¸´ÖÆ´úÂë


calcSplitKeys·½·¨±È½Ïµ¥´¿£¬splitKey¾ÍÊÇpartitionµÄ±àºÅ,ÎÒÃÇ¿´¿´²âÊÔÀà:

  1. @Test
  2.     public void testPartitionAndCreateTable() throws Exception{
  3.         
  4.         PartitionRowKeyManager rkManager = new PartitionRowKeyManager();
  5.         //Ö»Ô¤½¨10¸ö·ÖÇø
  6.         rkManager.setPartition(10);
  7.         
  8.         byte [][] splitKeys = rkManager.calcSplitKeys();
  9.         
  10.         HBaseAdmin admin = new HBaseAdmin(HBaseConfiguration.create());
  11.         TableName tableName = TableName.valueOf("partition_split_table");
  12.         
  13.         if (admin.tableExists(tableName)) {
  14.             try {
  15.                 admin.disableTable(tableName);
  16.             } catch (Exception e) {
  17.             }
  18.             admin.deleteTable(tableName);
  19.         }
  20.         HTableDescriptor tableDesc = new HTableDescriptor(tableName);
  21.         HColumnDescriptor columnDesc = new HColumnDescriptor(Bytes.toBytes("info"));
  22.         columnDesc.setMaxVersions(1);
  23.         tableDesc.addFamily(columnDesc);
  24.         admin.createTable(tableDesc ,splitKeys);
  25.         admin.close();
  26.     }
¸´ÖÆ´úÂë


ͬÑùÎÒÃÇ¿ÉÒÔ¿´¿´meta±íºÍhdfsµÄĿ¼½á¹û£¬ÆäʵºÍhashÀàËÆ£¬region¶¼»á·ÖºÃÇø£¬ÔÚÕâÀï¾Í²»ÉÏͼÁË¡£
     Í¨¹ýpartitionʵÏÖµÄloadblanceдµÄ»°£¬µ±È»Éú³Érowkey·½Ê½Ò²Òª½áºÏµ±Ç°µÄregionÊýÄ¿È¡Ä£¶øÇóµÃ£¬´ó¼ÒͬÑùÒ²¿ÉÒÔ×öЩʵÑ飬¿´¿´Êý¾Ý²åÈëºóµÄ·Ö²¼¡£
ÔÚÕâÀïҲ˳Ìáһϣ¬Èç¹ûÊÇ˳ÐòµÄÔö³¤ÐÍÔ­id,¿ÉÒÔ½«id±£´æµ½Ò»¸öÊý¾Ý¿â£¬´«Í³µÄÒ²ºÃ,redisµÄÒ²ºÃ£¬Ã¿´ÎÈ¡µÄʱºò£¬½«ÊýÖµÉè´ó1000×óÓÒ£¬ÒÔºóid¿ÉÒÔÔÚÄÚ´æÄÚÔö³¤£¬µ±ÄÚ´æÊýÁ¿ÒѾ­³¬¹ý1000µÄ»°£¬ÔÙÈ¥loadÏÂÒ»¸ö£¬ÓеãÀàËÆÓÚoracleÖеÄsqeuence.
     Ëæ»ú·Ö²¼¼ÓÔ¤·ÖÇøÒ²²»ÊÇÒ»ÀÍÓÀÒݵġ£ÒòΪÊý¾ÝÊDz»¶ÏµØÔö³¤µÄ£¬Ëæ×Åʱ¼ä²»¶ÏµØÍÆÒÆ£¬ÒѾ­·ÖºÃµÄÇøÓò£¬»òÐíÒѾ­×°²»×¡¸ü¶àµÄÊý¾Ý£¬µ±È»¾ÍÒª½øÒ»²½½øÐÐsplitÁË£¬Í¬ÑùÒ²»á³öÏÖÐÔÄÜËðºÄÎÊÌ⣬ËùÒÔÎÒÃÇ»¹ÊÇÒª¹æ»®ºÃÊý¾ÝÔö³¤ËÙÂÊ£¬¹Û²ìºÃÊý¾Ý¶¨ÆÚά»¤£¬°´Ðè·ÖÎöÊÇ·ñÒª½øÒ»²½·ÖÐÐÊÖ¹¤½«·ÖÇøÔٷֺã¬Ò²»òÕßÊǸüÑÏÖصÄÊÇн¨±í£¬×öºÃ¸ü´óµÄÔ¤·ÖÇøÈ»ºó½øÐÐÊý¾ÝǨÒÆ¡£Ð¡ÎâÖ»ÊDzËÄñ£¬ÔËά·½ÃæÒ²Ö»ÊÇ×ÔÒÑÕâÑùÈÏΪ¶øÒÑ£¬¹©´ó¼Ò×÷¼òµ¥µÄ²Î¿¼°É¡£Èç¹ûÊý¾Ý×°²»×¡ÁË£¬¶ÔÓÚpartition·½Ê½Ô¤·ÖÇøµÄ»°£¬Èç¹ûÈÃËü×ÔÈ»·ÖÁѵĻ°£¬Çé¿ö·ÖÑÏÖØÒ»µã¡£ÒòΪ·ÖÁѳöÀ´µÄ·ÖÇøºÅ»áÊÇÒ»ÑùµÄ£¬ËùÒÔ¼ÆËãµ½partitionIdµÄ»°£¬Æäʵ»¹Êǻص½ÁË˳ÐòдÄê´ú£¬»áÓв¿·ÖÈȵãдÎÊÌâ³öÏÖ£¬Èç¹ûʹÓÃpartition·½Ê½Éú³ÉÖ÷¼üµÄ»°£¬Êý¾ÝÔö³¤ºó¾ÍÒª²»¶ÏµØµ÷Õû·ÖÇøÁË£¬±ÈÈçÔö¶àÔ¤·ÖÇø£¬»òÕß¼ÓÈë×Ó·ÖÇøºÅµÄ´¦Àí.(ÎÒÃǵķÖÇøºÅΪlongÐÍ£¬¿ÉÒÔ½«Ëü×÷Ϊ¶à¼¶partition)

     OK,дµ½ÕâÀ»ù±¾ÒѾ­½²ÍêÁË·ÀÖ¹ÈȵãдʹÓõķ½·¨ºÍ·ÀֹƵ·±split¶ø²ÉÈ¡µÄÔ¤·ÖÇø¡£µ«rowkeyÉè¼Æ£¬Ô¶Ô¶Ò²²»Ö¹ÕâЩ£¬±ÈÈçrowkey³¤¶È£¬È»ºóËüµÄ³¤¶È×î´ó¿ÉÒÔΪcharµÄMAXVALUE,µ«ÊÇ¿´¹ý֮ǰÎÒдKeyValueµÄ·ÖÎöÖªµÀ£¬ÎÒÃǵÄÊý¾Ý¶¼ÊÇÒÔKeyValue·½Ê½´æ´¢ÔÚMemStore»òÕßHFileÖеģ¬Ã¿¸öKeyValue¶¼»á´æ´¢rowKeyµÄÐÅÏ¢£¬Èç¹ûrowkeyÌ«´óµÄ»°£¬±ÈÈçÊÇ128¸ö×Ö½Ú£¬Ò»ÐÐ10¸ö×Ö¶ÎµÄ±í£¬100ÍòÐмǼ£¬¹ârowkey¾ÍÕ¼ÁË1.2G+ËùÒÔ³¤¶È»¹ÊDz»Òª¹ý³¤£¬ÁíÍâÉè¼Æ£¬»¹ÊÇ°´ÐèÇóÀ´°É¡£
     ×îºóÌâÍâ»°ÊÇÎÒÏë·ÖÏíÎÒÔÚgithubÖн¨ÁËÒ»¸öproject,Ï£Íû×öһЩhbaseһЩ¹¤¾ß£ºhttps://github.com/bdifn/hbase-tools,Èç¹û±¾µØ×°ÁËgitµÄ»°£¬¿ÉÒÔÖ´ÐÐÃüÁî: git clone https://github.com/bdifn/hbase-tools.gitÄ¿Ç°¼ÓÁËÒ»¸öregion-helper×ÓÏîÄ¿£¬Ò²ÊÇĿǰΨһµÄÒ»¸ö×ÓÏîÄ¿£¬ÏîĿʹÓÃmaven¹ÜÀí,Ö÷ҪĿµÄÊÇ°ïÖúÎÒÃÇÉè¼Ærowkey×öһЩ²Î¿¼£¬±ÈÈçÎÒÃÇÉè¼ÆµÄËæ»úдºÍÔ¤·ÖÇø²âÊÔ£¬ÌṩÁ˳éÑùµÄ¹¦ÄÜ£¬ÌṩÁ˼ì²âËæ»úдµÄ¹¦ÄÜ£¬È»ºóͳ¼Æ°´Ä¿Ç°rowkeyÉè¼Æ£¬Ëæ»úдnÌõ¼Ç¼ºó£¬Í³¼Æÿ¸öregionµÄ¼Ç¼Êý£¬È»ºóÏÔʾ±ÈÀýµÈ¡£
     ²âÊÔ·ÂÕæÄ£¿éÎÒ³ÌΪsimualtor,Ö÷ÒªÊÇÄ£ÄâhbaseµÄregionÐÐΪ£¬simpleµÄʵÏÖ£¬½ö½öÊÇÉÏÃæÌáµ½µÄÔ¤²âÎÒÃÇrowkeyÉè¼Æºó£¬½¨ºÃÔ¤·ÖÇøºó£¬Ð´Êý¾ÝµÄµÄ·Ö²¼±ÈÀý£¬¶øemulationÊDZȽϱÆÕæµÄ·ÂÕ棬ÉèÏëÊÇÎÒÃÇдÊý¾Ýʱ£¬»áͳ¼ÆÊýÄ¿µÄ´óС£¬¸ù¾ÝÎÒÃǵÄhbase-site.xmlÉ趨£¬Ä£ÄâmemStoreÐÐΪ£¬Ä£ÄâhfileµÄÐÐΪ£¬×îÖÕ»áÉú³ÉÒ»·Ý±íµÄ±¨±í£¬±ÈÈç·ÖÇøµÄÊý¾Ý´óС£¬ÊÇ·ñsplitÁË£¬µÈµÈ£¬ÒÔ¹©ÎÒÃÇÈ¥Éè¼Æhbase±íʱÓÐÒ»¸ö²Î¿¼£¬µ«ÊÇÒź¶µÄÊÇ£¬ÓÉÓÚʱ¼ä¹Øϵ£¬ÎÒÖ»»¨ÁËÒ»µãÒµÓàʱ¼ä¼òµ¥´îÁËһϿò¼Ü£¬Ä¿Ç°Ã»ÓиüÒ»²½µÄʵÏÖ£¬ÒÔºóÓÐʱ¼äÔÙ¼ÓÒÔÍêÉÆ£¬µ±È»Ò²»¶Ó­´ó¼ÒÒ»Æð¼ÓÈ룬һÆðѧϰ°É¡£
      3.jpg
     ÏîĿʹÓÃmaven¹ÜÀí£¬ÎªÁË·½±ã²âÊÔ£¬Ò»Ð©×é¼þµÄʵÀý»¯£¬ÎÒʹÓÃÁËjavaµÄSPI,downloadÔ´Âëºó£¬Èç¹ûÏë²âÊÔ×ÔÒѵÄrowKeyGeneatorµÄ»°£¬´ò¿ªcom.bdifn.hbasetools.regionhelper.rowkey.RowKeyGeneratorÎļþºó£¬Ìæ»»µ½ÄãÃǵÄIDÉú³ÉÆ÷¾Í¿ÉÒÔÁË¡£Èç¹ûÊÇhashµÄ»°£¬³éÑùºÍ²âÊԵȣ¬¶¼ÊÇ¿ÉÒÔ¸´Óõġ£
    Èç²âÊÔ´úÂ룺

  1. public class HBaseSimulatorTest {
  2.     //ͨ¹ýSPI·½Ê½»ñÈ¡HBaseSimulatorʵÀý,SPIµÄʵÏÖΪsimgple
  3.     private  HBaseSimulator hbase = BeanFactory.getInstance().getBeanInstance(HBaseSimulator.class);
  4.     //»ñÈ¡RowKeyGeneratorʵÀý£¬SPIµÄʵÏÖΪhashRowkey
  5.     private RowKeyGenerator rkGen = BeanFactory.getInstance().getBeanInstance(RowKeyGenerator.class);
  6.     //³õÈ绯¿à¹¤£¬È¥¼ì²â100w¸ö³éÑùrowkey,È»ºóÉú³ÉÒ»×ésplitKeys
  7.     HashChoreWoker worker = new HashChoreWoker(1000000,10);
  8.    
  9.     @Test
  10.     public void testHash(){
  11.         byte [][] splitKeys = worker.calcSplitKeys();
  12.         hbase.createTable("user", splitKeys);
  13.         //²åÈë1ÒÚÌõ¼Ç¼£¬¿´Êý¾Ý·Ö²¼
  14.         TableName tableName = TableName.valueOf("user");
  15.         for(int i = 0; i < 100000000; i ++) {
  16.             Put put = new Put(rkGen.nextId());
  17.             hbase.put(tableName, put);
  18.         }
  19.         hbase.report(tableName);
  20.     }
  21.    
  22.     @Test
  23.     public void testPartition(){
  24.         //default 20 partitions.
  25.         PartitionRowKeyManager rkManager = new PartitionRowKeyManager();
  26.         byte [][] splitKeys = rkManager.calcSplitKeys();
  27.         
  28.         hbase.createTable("person", splitKeys);
  29.         
  30.         TableName tableName = TableName.valueOf("person");
  31.         //²åÈë1ÒÚÌõ¼Ç¼£¬¿´Êý¾Ý·Ö²¼
  32.         for(int i = 0; i < 100000000; i ++) {
  33.             Put put = new Put(rkManager.nextId());
  34.             hbase.put(tableName, put);
  35.         }
  36.         
  37.         hbase.report(tableName);
  38.     }
  39. }
¸´ÖÆ´úÂë


Ö´Ðнá¹û:

  1. Execution Reprort:[StartRowkey:puts requsts:(put ratio)]
  2. :9973569:(1.0015434)
  3. 1986344a\x00\x00\x00\x00\x00\x01\x0E\xAE:9999295:(1.0041268)
  4. 331ee65f\x00\x00\x00\x00\x00\x0F)g:10012532:(1.005456)
  5. 4cbfd4f6\x00\x00\x00\x00\x00\x00o0:9975842:(1.0017716)
  6. 664c6388\x00\x00\x00\x00\x00\x02\x1Du:10053337:(1.0095537)
  7. 800945e0\x00\x00\x00\x00\x00\x01\xADV:9998719:(1.0040689)
  8. 99a158d9\x00\x00\x00\x00\x00\x0BZ\xF3:10000563:(1.0042541)
  9. b33a2223\x00\x00\x00\x00\x00\x07\xC6\xE6:9964921:(1.000675)
  10. ccbcf370\x00\x00\x00\x00\x00\x00*\xE2:9958200:(1.0)
  11. e63b8334\x00\x00\x00\x00\x00\x03g\xC1:10063022:(1.0105262)
  12. total requests:100000000
  13. Execution Reprort:[StartRowkey:puts requsts:(put ratio)]
  14. :5000000:(1.0)
  15. \x00\x00\x00\x00\x00\x00\x00\x01:5000000:(1.0)
  16. \x00\x00\x00\x00\x00\x00\x00\x02:5000000:(1.0)
  17. \x00\x00\x00\x00\x00\x00\x00\x03:5000000:(1.0)
  18. \x00\x00\x00\x00\x00\x00\x00\x04:5000000:(1.0)
  19. \x00\x00\x00\x00\x00\x00\x00\x05:5000000:(1.0)
  20. \x00\x00\x00\x00\x00\x00\x00\x06:5000000:(1.0)
  21. \x00\x00\x00\x00\x00\x00\x00\x07:5000000:(1.0)
  22. \x00\x00\x00\x00\x00\x00\x00\x08:5000000:(1.0)
  23. \x00\x00\x00\x00\x00\x00\x00\x09:5000000:(1.0)
  24. \x00\x00\x00\x00\x00\x00\x00\x0A:5000000:(1.0)
  25. \x00\x00\x00\x00\x00\x00\x00\x0B:5000000:(1.0)
  26. \x00\x00\x00\x00\x00\x00\x00\x0C:5000000:(1.0)
  27. \x00\x00\x00\x00\x00\x00\x00\x0D:5000000:(1.0)
  28. \x00\x00\x00\x00\x00\x00\x00\x0E:5000000:(1.0)
  29. \x00\x00\x00\x00\x00\x00\x00\x0F:5000000:(1.0)
  30. \x00\x00\x00\x00\x00\x00\x00\x10:5000000:(1.0)
  31. \x00\x00\x00\x00\x00\x00\x00\x11:5000000:(1.0)
  32. \x00\x00\x00\x00\x00\x00\x00\x12:5000000:(1.0)
  33. \x00\x00\x00\x00\x00\x00\x00\x13:5000000:(1.0)
  34. total requests:100000000
¸´ÖÆ´úÂë








ÒÑÓÐ(19)ÈËÆÀÂÛ

Ìøתµ½Ö¸¶¨Â¥²ã
pig ·¢±íÓÚ 2014-11-6 16:16:28
SplitKeysCalculatorÕâ¸ö·½·¨Ìùһϣ¬¿´¿´ÄÇ
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

271592448 ·¢±íÓÚ 2014-11-20 09:38:54
niubility,л·ÖÏí
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

±¿±¿_ÀË×Ó ·¢±íÓÚ 2014-11-26 12:46:41
Ö±¹Û£¬Àí½â¸üÉî¡£
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

dwshmilyss ·¢±íÓÚ 2014-12-8 17:46:07
Ö±¹Û£¬Àí½â¸üÉî¡£
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

EASONLIU ·¢±íÓÚ 2014-12-17 10:24:00
·¹ý£¬Ñ§Ï°Ñ§Ï°
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

cdb521007 ·¢±íÓÚ 2015-7-27 11:54:11
rowkeyµÄÉ¢ÁÐÉè¼Æ»¹ÕæÊDZȽÏÂé·³°¡£¬ÓÐûÓиü¼òµ¥Ò»µãµÄ·½·¨ÄØ
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

cdb521007 ·¢±íÓÚ 2015-7-28 19:09:33
Êý¾ÝÊǾùÔȵķֲ¼µ½regionÖÐÁË£¬µ«ÊÇÔõôͨ¹ýrowkeyÈ¥²éÊý¾Ý°¡£¬Êý¾ÝµÄrowkeyÎÒÃǶ¼²»ÖªµÀ£¿£¿£¿
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

µËÁ¢»Ô ·¢±íÓÚ 2016-4-5 11:43:00
·¹ý£¬Ñ§Ï°Ñ§Ï°
»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

12ÏÂÒ»Ò³
ÄúÐèÒªµÇ¼ºó²Å¿ÉÒÔ»ØÌû µÇ¼ | Á¢¼´×¢²á

±¾°æ»ý·Ö¹æÔò

¹Ø±Õ

ÍƼöÉÏÒ»Ìõ /2 ÏÂÒ»Ìõ