|

HBase Êý¾Ý±í½éÉÜ
HBase Êý¾Ý¿âÊÇÒ»¸ö»ùÓÚ·Ö²¼Ê½µÄ¡¢ÃæÏòÁеġ¢Ö÷ÒªÓÃÓڷǽṹ»¯Êý¾Ý´æ´¢ÓÃ;µÄ¿ªÔ´Êý¾Ý¿â¡£ÆäÉè¼ÆË¼Â·À´Ô´ÓÚ Google µÄ·Ç¿ªÔ´Êý¾Ý¿â¡±BigTable¡±¡£
HDFS Ϊ HBase Ìṩµ×²ã´æ´¢Ö§³Ö£¬MapReduce ΪÆäÌṩ¼ÆËãÄÜÁ¦£¬ZooKeeper ΪÆäÌṩе÷·þÎñºÍ failover£¨Ê§Ð§×ªÒƵı¸·Ý²Ù×÷£©»úÖÆ¡£Pig ºÍ Hive Ϊ HBase ÌṩÁ˸߲ãÓïÑÔÖ§³Ö£¬Ê¹Æä¿ÉÒÔ½øÐÐÊý¾Ýͳ¼Æ£¨¿ÉʵÏÖ¶à±í join µÈ£©£¬Sqoop ÔòΪÆäÌṩ RDBMS Êý¾Ýµ¼È빦ÄÜ¡£
HBase ²»ÄÜÖ§³Ö where Ìõ¼þ¡¢Order by ²éѯ£¬Ö»Ö§³Ö°´ÕÕÖ÷¼ü Rowkey ºÍÖ÷¼üµÄ range À´²éѯ£¬µ«ÊÇ¿ÉÒÔͨ¹ý HBase ÌṩµÄ API ½øÐÐÌõ¼þ¹ýÂË¡£
HBase µÄ Rowkey ÊÇÊý¾ÝÐеÄΨһ±êʶ£¬±ØÐëͨ¹ýËü½øÐÐÊý¾ÝÐзÃÎÊ£¬Ä¿Ç°ÓÐÈýÖÖ·½Ê½£¬µ¥Ðмü·ÃÎÊ¡¢Ðмü·¶Î§·ÃÎÊ¡¢È«±íɨÃè·ÃÎÊ¡£Êý¾Ý°´ÐмüµÄ·½Ê½ÅÅÐò´æ´¢£¬ÒÀ´Î°´Î»±È½Ï£¬ÊýÖµ½Ï´óµÄÅÅÁÐÔÚºó£¬ÀýÈç int ·½Ê½µÄÅÅÐò£º1£¬10£¬100£¬11£¬12£¬2£¬20¡£¬906£¬¡¡£
ColumnFamily ÊÇ¡°ÁÐ×塱£¬ÊôÓÚ schema ±í£¬ÔÚ½¨±íʱ¶¨Ò壬ÿ¸öÁÐÊôÓÚÒ»¸öÁÐ×壬ÁÐÃûÓÃÁÐ×å×÷Ϊǰ׺¡°ColumnFamily£ºqualifier¡±£¬·ÃÎÊ¿ØÖÆ¡¢´ÅÅ̺ÍÄÚ´æµÄʹÓÃͳ¼Æ¶¼ÊÇÔÚÁÐ×å²ãÃæ½øÐеġ£
Cell ÊÇͨ¹ýÐкÍÁÐÈ·¶¨µÄÒ»¸ö´æ´¢µ¥Ôª£¬ÖµÒÔ×Ö½ÚÂë´æ´¢£¬Ã»ÓÐÀàÐÍ¡£
Timestamp ÊÇÇø·Ö²»Í¬°æ±¾ Cell µÄË÷Òý£¬64 λÕûÐÍ¡£²»Í¬°æ±¾µÄÊý¾Ý°´ÕÕʱ¼ä´Áµ¹ÐòÅÅÁУ¬×îеÄÊý¾Ý°æ±¾ÅÅÔÚ×îÇ°Ãæ¡£
Hbase ÔÚÐз½ÏòÉÏˮƽ»®·Ö³É N ¸ö Region£¬Ã¿¸ö±íÒ»¿ªÊ¼Ö»ÓÐÒ»¸ö Region£¬Êý¾ÝÁ¿Ôö¶à£¬Region ×Ô¶¯·ÖÁÑΪÁ½¸ö£¬²»Í¬ Region ·Ö²¼ÔÚ²»Í¬ Server ÉÏ£¬µ«Í¬Ò»¸ö²»»á²ð·Öµ½²»Í¬ Server¡£
Region °´ ColumnFamily »®·Ö³É Store£¬Store Ϊ×îС´æ´¢µ¥Ôª£¬ÓÃÓÚ±£´æÒ»¸öÁÐ×åµÄÊý¾Ý£¬Ã¿¸ö Store °üÀ¨ÄÚ´æÖÐµÄ memstore ºÍ³Ö¾Ã»¯µ½ disk É쵀 HFile¡£
ͼ 1 ÊÇ HBase Êý¾Ý±íµÄʾÀý£¬Êý¾Ý·Ö²¼ÔÚ¶ą̀½Úµã»úÆ÷ÉÏÃæ¡£

ͼ 1. HBase Êý¾Ý±íʾÀý
HBase µ÷Óà API ʾÀý
ÀàËÆÓÚ²Ù×÷¹ØÏµÐÍÊý¾Ý¿âµÄ JDBC ¿â£¬HBase client °ü±¾ÉíÌṩÁË´óÁ¿¿ÉÒÔ¹©²Ù×÷µÄ API£¬°ïÖúÓû§¿ìËÙ²Ù×÷ HBase Êý¾Ý¿â¡£ÌṩÁËÖîÈç´´½¨Êý¾Ý±í¡¢É¾³ýÊý¾Ý±í¡¢Ôö¼Ó×ֶΡ¢´æÈëÊý¾Ý¡¢¶ÁÈ¡Êý¾ÝµÈµÈ½Ó¿Ú¡£Çåµ¥ 1 ÌṩÁËÒ»¸ö×÷Õß·â×°µÄ¹¤¾ßÀ࣬°üÀ¨²Ù×÷Êý¾Ý±í¡¢¶ÁÈ¡Êý¾Ý¡¢´æÈëÊý¾Ý¡¢µ¼³öÊý¾ÝµÈ·½·¨¡£
Çåµ¥ 1.HBase API ²Ù×÷¹¤¾ßÀà´úÂë
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class HBaseUtil { private Configuration conf = null; private HBaseAdmin admin = null; protected HBaseUtil(Configuration conf) throws IOException { this.conf = conf; this.admin = new HBaseAdmin(conf); } public boolean existsTable(String table) throws IOException { return admin.tableExists(table); } public void createTable(String table, byte[][] splitKeys, String... colfams) throws IOException { HTableDescriptor desc = new HTableDescriptor(table); for (String cf : colfams) { HColumnDescriptor coldef = new HColumnDescriptor(cf); desc.addFamily(coldef); } if (splitKeys != null) { admin.createTable(desc, splitKeys); } else { admin.createTable(desc); } } public void disableTable(String table) throws IOException { admin.disableTable(table); } public void dropTable(String table) throws IOException { if (existsTable(table)) { disableTable(table); admin.deleteTable(table); } } public void fillTable(String table, int startRow, int endRow, int numCols, int pad, boolean setTimestamp, boolean random, String... colfams) throws IOException { HTable tbl = new HTable(conf, table); for (int row = startRow; row <= endRow; row++) { for (int col = 0; col < numCols; col++) { Put put = new Put(Bytes.toBytes("row-")); for (String cf : colfams) { String colName = "col-"; String val = "val-"; if (setTimestamp) { put.add(Bytes.toBytes(cf), Bytes.toBytes(colName), col, Bytes.toBytes(val)); } else { put.add(Bytes.toBytes(cf), Bytes.toBytes(colName), Bytes.toBytes(val)); } } tbl.put(put); } } tbl.close(); } public void put(String table, String row, String fam, String qual, String val) throws IOException { HTable tbl = new HTable(conf, table); Put put = new Put(Bytes.toBytes(row)); put.add(Bytes.toBytes(fam), Bytes.toBytes(qual), Bytes.toBytes(val)); tbl.put(put); tbl.close(); } public void put(String table, String row, String fam, String qual, long ts, String val) throws IOException { HTable tbl = new HTable(conf, table); Put put = new Put(Bytes.toBytes(row)); put.add(Bytes.toBytes(fam), Bytes.toBytes(qual), ts, Bytes.toBytes(val)); tbl.put(put); tbl.close(); } public void put(String table, String[] rows, String[] fams, String[] quals, long[] ts, String[] vals) throws IOException { HTable tbl = new HTable(conf, table); for (String row : rows) { Put put = new Put(Bytes.toBytes(row)); for (String fam : fams) { int v = 0; for (String qual : quals) { String val = vals[v < vals.length ? v : vals.length]; long t = ts[v < ts.length ? v : ts.length - 1]; put.add(Bytes.toBytes(fam), Bytes.toBytes(qual), t, Bytes.toBytes(val)); v++; } } tbl.put(put); } tbl.close(); } public void dump(String table, String[] rows, String[] fams, String[] quals) throws IOException { HTable tbl = new HTable(conf, table); List<Get> gets = new ArrayList<Get>(); for (String row : rows) { Get get = new Get(Bytes.toBytes(row)); get.setMaxVersions(); if (fams != null) { for (String fam : fams) { for (String qual : quals) { get.addColumn(Bytes.toBytes(fam), Bytes.toBytes(qual)); } } } gets.add(get); } Result[] results = tbl.get(gets); for (Result result : results) { for (KeyValue kv : result.raw()) { System.out.println("KV: " + kv + ", Value: " + Bytes.toString(kv.getValue())); } } } private static void scan(int caching, int batch) throws IOException { HTable table = null; final int[] counters = {0, 0}; Scan scan = new Scan(); scan.setCaching(caching); // co ScanCacheBatchExample-1-Set Set caching and batch parameters. scan.setBatch(batch); ResultScanner scanner = table.getScanner(scan); for (Result result : scanner) { counters[1]++; // co ScanCacheBatchExample-2-Count Count the number of Results available. } scanner.close(); System.out.println("Caching: " + caching + ", Batch: " + batch + ", Results: " + counters[1] + ", RPCs: " + counters[0]); } } |
²Ù×÷±íµÄ API ¶¼ÓÐ HBaseAdmin Ìṩ£¬Ìر𽲽âһϠScan µÄ²Ù×÷²¿Êð¡£
HBase µÄ±íÊý¾Ý·ÖΪ¶à¸ö²ã´Î,HRegion->HStore->[HFile,HFile,...,MemStore]¡£
ÔÚ HBase ÖУ¬Ò»Õűí¿ÉÒÔÓжà¸ö Column Family£¬ÔÚÒ»´Î Scan µÄÁ÷³ÌÖУ¬Ã¿¸ö Column Family(Store) µÄÊý¾Ý¶ÁÈ¡ÓÉÒ»¸ö StoreScanner ¶ÔÏó¸ºÔð¡£Ã¿¸ö Store µÄÊý¾ÝÓÉÒ»¸öÄÚ´æÖÐµÄ MemStore ºÍ´ÅÅÌÉ쵀 HFile Îļþ×é³É£¬¶ÔÓ¦µÄ StoreScanner ¶ÔÏóʹÓÃÒ»¸ö MemStoreScanner ºÍ N ¸ö StoreFileScanner À´½øÐÐʵ¼ÊµÄÊý¾Ý¶ÁÈ¡¡£
Òò´Ë£¬¶ÁȡһÐеÄÊý¾ÝÐèÒªÒÔϲ½Ö裺
- °´ÕÕ˳Ðò¶ÁÈ¡³öÿ¸ö Store
-
¶ÔÓÚÿ¸ö Store£¬ºÏ²¢ Store ÏÂÃæµÄÏà¹ØµÄ HFile ºÍÄÚ´æÖÐµÄ MemStore
-
ÕâÁ½²½¶¼ÊÇͨ¹ý¶ÑÀ´Íê³É¡£RegionScanner µÄ¶Áȡͨ¹ýÏÂÃæµÄ¶à¸ö StoreScanner ×é³ÉµÄ¶ÑÍê³É£¬Ê¹Óà RegionScanner µÄ³ÉÔ±±äÁ¿ KeyValueHeap storeHeap ±íʾ¡£Ò»¸ö StoreScanner Ò»¸ö¶Ñ£¬¶ÑÖеÄÔªËØ¾ÍÊǵ×ϰüº¬µÄ HFile ºÍ MemStore ¶ÔÓ¦µÄ StoreFileScanner ºÍ MemStoreScanner¡£¶ÑµÄÓÅÊÆÊǽ¨¶ÑЧÂʸߣ¬¿ÉÒÔ¶¯Ì¬·ÖÅäÄÚ´æ´óС£¬²»±ØÊÂÏÈÈ·¶¨Éú´æÖÜÆÚ¡£
½Ó×ŵ÷Óà seekScanners() ¶ÔÕâЩ StoreFileScanner ºÍ MemStoreScanner ·Ö±ð½øÐÐ seek¡£seek ÊÇÕë¶Ô KeyValue µÄ£¬seek µÄÓïÒåÊÇ seek µ½Ö¸¶¨ KeyValue£¬Èç¹ûÖ¸¶¨ KeyValue ²»´æÔÚ£¬Ôò seek µ½Ö¸¶¨ KeyValue µÄÏÂÒ»¸ö¡£
ScanÀà³£Ó÷½·¨ËµÃ÷£º
- scan.addFamily()/scan.addColumn()£ºÖ¸¶¨ÐèÒªµÄ Family »ò Column£¬Èç¹ûûÓе÷ÓÃÈκΠaddFamily »ò Column£¬»á·µ»ØËùÓÐµÄ Columns£»
-
scan.setMaxVersions()£ºÖ¸¶¨×î´óµÄ°æ±¾¸öÊý¡£Èç¹û²»´øÈκβÎÊýµ÷Óà setMaxVersions£¬±íʾȡËùÓеİ汾¡£Èç¹û²»µôÓà setMaxVersions£¬Ö»»áÈ¡µ½×îеİ汾.£»
-
scan.setTimeRange()£ºÖ¸¶¨×î´óµÄʱ¼ä´ÁºÍ×îСµÄʱ¼ä´Á£¬Ö»ÓÐÔÚ´Ë·¶Î§ÄÚµÄ Cell ²ÅÄܱ»»ñÈ¡£»
-
scan.setTimeStamp()£ºÖ¸¶¨Ê±¼ä´Á£»
-
scan.setFilter()£ºÖ¸¶¨ Filter À´¹ýÂ˵ô²»ÐèÒªµÄÐÅÏ¢£»
-
scan.setStartRow()£ºÖ¸¶¨¿ªÊ¼µÄÐС£Èç¹û²»µ÷Óã¬Ôò´Ó±íÍ·¿ªÊ¼£»
-
scan.setStopRow()£ºÖ¸¶¨½áÊøµÄÐУ¨²»º¬´ËÐУ©£»
-
scan. setCaching()£ºÃ¿´Î´Ó·þÎñÆ÷¶Ë¶ÁÈ¡µÄÐÐÊý£¨Ó°Ïì RPC£©£»
-
scan.setBatch()£ºÖ¸¶¨×î¶à·µ»ØµÄ Cell ÊýÄ¿¡£ÓÃÓÚ·ÀÖ¹Ò»ÐÐÖÐÓйý¶àµÄÊý¾Ý£¬µ¼Ö OutofMemory ´íÎó£¬Ä¬ÈÏÎÞÏÞÖÆ¡£
HBase Êý¾Ý±íÓÅ»¯
HBase ÊÇÒ»¸ö¸ß¿É¿¿ÐÔ¡¢¸ßÐÔÄÜ¡¢ÃæÏòÁС¢¿ÉÉìËõµÄ·Ö²¼Ê½Êý¾Ý¿â£¬µ«Êǵ±²¢·¢Á¿¹ý¸ß»òÕßÒÑÓÐÊý¾ÝÁ¿ºÜ´óʱ£¬¶ÁдÐÔÄÜ»áϽµ¡£ÎÒÃÇ¿ÉÒÔ²ÉÓÃÈçÏ·½Ê½Öð²½ÌáÉý HBase µÄ¼ìË÷ËÙ¶È¡£
Ô¤ÏÈ·ÖÇø
ĬÈÏÇé¿öÏ£¬ÔÚ´´½¨ HBase ±íµÄʱºò»á×Ô¶¯´´½¨Ò»¸ö Region ·ÖÇø£¬µ±µ¼ÈëÊý¾ÝµÄʱºò£¬ËùÓÐµÄ HBase ¿Í»§¶Ë¶¼ÏòÕâÒ»¸ö Region дÊý¾Ý£¬Ö±µ½Õâ¸ö Region ×ã¹»´óÁ˲ŽøÐÐÇз֡£Ò»ÖÖ¿ÉÒÔ¼Ó¿ìÅúÁ¿Ð´ÈëËٶȵķ½·¨ÊÇͨ¹ýÔ¤ÏÈ´´½¨Ò»Ð©¿ÕµÄ Regions£¬ÕâÑùµ±Êý¾ÝдÈë HBase ʱ£¬»á°´ÕÕ Region ·ÖÇøÇé¿ö£¬ÔÚ¼¯ÈºÄÚ×öÊý¾ÝµÄ¸ºÔؾùºâ¡£
Rowkey ÓÅ»¯
HBase ÖÐ Rowkey Êǰ´ÕÕ×ÖµäÐò´æ´¢£¬Òò´Ë£¬Éè¼Æ Rowkey ʱ£¬Òª³ä·ÖÀûÓÃÅÅÐòÌØµã£¬½«¾³£Ò»Æð¶ÁÈ¡µÄÊý¾Ý´æ´¢µ½Ò»¿é£¬½«×î½ü¿ÉÄܻᱻ·ÃÎʵÄÊý¾Ý·ÅÔÚÒ»¿é¡£
´ËÍ⣬Rowkey ÈôÊǵÝÔöµÄÉú³É£¬½¨Ò鲻ҪʹÓÃÕýÐòÖ±½ÓдÈë Rowkey£¬¶øÊDzÉÓà reverse µÄ·½Ê½·´×ª Rowkey£¬Ê¹µÃ Rowkey ´óÖ¾ùºâ·Ö²¼£¬ÕâÑùÉè¼ÆÓиöºÃ´¦ÊÇÄܽ« RegionServer µÄ¸ºÔؾùºâ£¬·ñÔòÈÝÒײúÉúËùÓÐÐÂÊý¾Ý¶¼ÔÚÒ»¸ö RegionServer É϶ѻýµÄÏÖÏó£¬ÕâÒ»µã»¹¿ÉÒÔ½áºÏ table µÄÔ¤ÇзÖÒ»ÆðÉè¼Æ¡£
¼õÉÙColumnFamily ÊýÁ¿
²»ÒªÔÚÒ»ÕűíÀﶨÒåÌ«¶àµÄ ColumnFamily¡£Ä¿Ç° Hbase ²¢²»ÄܺܺõĴ¦Àí³¬¹ý 2~3 ¸ö ColumnFamily µÄ±í¡£ÒòΪij¸ö ColumnFamily ÔÚ flush µÄʱºò£¬ËüÁÚ½üµÄ ColumnFamily Ò²»áÒò¹ØÁªÐ§Ó¦±»´¥·¢ flush£¬×îÖÕµ¼ÖÂϵͳ²úÉú¸ü¶àµÄ I/O¡£
»º´æ²ßÂÔ (setCaching)
´´½¨±íµÄʱºò£¬¿ÉÒÔͨ¹ý HColumnDescriptor.setInMemory(true) ½«±í·Åµ½ RegionServer µÄ»º´æÖУ¬±£Ö¤ÔÚ¶ÁÈ¡µÄʱºò±» cache ÃüÖС£
ÉèÖô洢ÉúÃüÆÚ
´´½¨±íµÄʱºò£¬¿ÉÒÔͨ¹ý HColumnDescriptor.setTimeToLive(int timeToLive) ÉèÖñíÖÐÊý¾ÝµÄ´æ´¢ÉúÃüÆÚ£¬¹ýÆÚÊý¾Ý½«×Ô¶¯±»É¾³ý¡£
Ó²ÅÌÅäÖÃ
ÿ̨ RegionServer ¹ÜÀí 10~1000 ¸ö Regions£¬Ã¿¸ö Region ÔÚ 1~2G£¬Ôòÿ̨ Server ×îÉÙÒª 10G£¬×î´óÒª 1000*2G=2TB£¬¿¼ÂÇ 3 ±¸·Ý£¬ÔòÒª 6TB¡£·½°¸Ò»ÊÇÓà 3 ¿é 2TB Ó²ÅÌ£¬¶þÊÇÓà 12 ¿é 500G Ó²ÅÌ£¬´ø¿í×㹻ʱ£¬ºóÕßÄÜÌṩ¸ü´óµÄÍÌÍÂÂÊ£¬¸üϸÁ£¶ÈµÄÈßÓ౸·Ý£¬¸ü¿ìËٵĵ¥Å̹ÊÕϻָ´¡£
·ÖÅäºÏÊʵÄÄÚ´æ¸ø RegionServer ·þÎñ
ÔÚ²»Ó°ÏìÆäËû·þÎñµÄÇé¿öÏ£¬Ô½´óÔ½ºÃ¡£ÀýÈçÔÚ HBase µÄ conf Ŀ¼Ï嵀 hbase-env.sh µÄ×îºóÌí¼Ó export HBASE_REGIONSERVER_OPTS=¡±-Xmx16000m $HBASE_REGIONSERVER_OPTS¡±
ÆäÖÐ 16000m Ϊ·ÖÅ䏸 RegionServer µÄÄÚ´æ´óС¡£
дÊý¾ÝµÄ±¸·ÝÊý
±¸·ÝÊýÓë¶ÁÐÔÄܳÉÕý±È£¬ÓëдÐÔÄܳɷ´±È£¬ÇÒ±¸·ÝÊýÓ°Ïì¸ß¿ÉÓÃÐÔ¡£ÓÐÁ½ÖÖÅäÖ÷½Ê½£¬Ò»ÖÖÊǽ« hdfs-site.xml ¿½±´µ½ hbase µÄ conf Ŀ¼Ï£¬È»ºóÔÚÆäÖÐÌí¼Ó»òÐÞ¸ÄÅäÖÃÏî dfs.replication µÄֵΪҪÉèÖõı¸·ÝÊý£¬ÕâÖÖÐ޸ĶÔËùÓÐµÄ HBase Óû§±í¶¼ÉúЧ£¬ÁíÍâÒ»ÖÖ·½Ê½£¬ÊǸÄд HBase ´úÂ룬Èà HBase Ö§³ÖÕë¶ÔÁÐ×åÉèÖñ¸·ÝÊý£¬ÔÚ´´½¨±íʱ£¬ÉèÖÃÁÐ×屸·ÝÊý£¬Ä¬ÈÏΪ 3£¬´ËÖÖ±¸·ÝÊýÖ»¶ÔÉèÖõÄÁÐ×åÉúЧ¡£
WAL£¨Ô¤Ð´ÈÕÖ¾£©
¿ÉÉèÖÿª¹Ø£¬±íʾ HBase ÔÚдÊý¾ÝǰÓò»ÓÃÏÈдÈÕÖ¾£¬Ä¬ÈÏÊÇ´ò¿ª£¬¹Øµô»áÌá¸ßÐÔÄÜ£¬µ«ÊÇÈç¹ûϵͳ³öÏÖ¹ÊÕÏ (¸ºÔð²åÈëµÄ RegionServer ¹Òµô)£¬Êý¾Ý¿ÉÄܻᶪʧ¡£ÅäÖà WAL ÔÚµ÷Óà Java API дÈëʱ£¬ÉèÖà Put ʵÀýµÄ WAL£¬µ÷Óà Put.setWriteToWAL(boolean)¡£
ÅúÁ¿Ð´
HBase µÄ Put Ö§³Öµ¥Ìõ²åÈ룬Ҳ֧³ÖÅúÁ¿²åÈ룬һ°ãÀ´ËµÅúÁ¿Ð´¸ü¿ì£¬½ÚÊ¡À´»ØµÄÍøÂ翪Ïú¡£ÔÚ¿Í»§¶Ëµ÷Óà Java API ʱ£¬ÏȽ«ÅúÁ¿µÄ Put ·ÅÈëÒ»¸ö Put ÁÐ±í£¬È»ºóµ÷Óà HTable µÄ Put(Put Áбí) º¯ÊýÀ´ÅúÁ¿Ð´¡£
¿Í»§¶ËÒ»´Î´Ó·þÎñÆ÷ÀÈ¡µÄÊýÁ¿
ͨ¹ýÅäÖÃÒ»´ÎÀÈ¥µÄ½Ï´óµÄÊý¾ÝÁ¿¿ÉÒÔ¼õÉÙ¿Í»§¶Ë»ñÈ¡Êý¾ÝµÄʱ¼ä£¬µ«ÊÇËü»áÕ¼Óÿͻ§¶ËÄÚ´æ¡£ÓÐÈý¸öµØ·½¿É½øÐÐÅäÖãº
- ÔÚ HBase µÄ conf ÅäÖÃÎļþÖнøÐÐÅäÖà hbase.client.scanner.caching£»
-
ͨ¹ýµ÷Óà HTable.setScannerCaching(int scannerCaching) ½øÐÐÅäÖã»
-
ͨ¹ýµ÷Óà Scan.setCaching(int caching) ½øÐÐÅäÖá£ÈýÕßµÄÓÅÏȼ¶Ô½À´Ô½¸ß¡£
RegionServer µÄÇëÇó´¦Àí IO Ïß³ÌÊý
½ÏÉÙµÄ IO Ïß³ÌÊÊÓÃÓÚ´¦Àíµ¥´ÎÇëÇóÄÚ´æÏûºÄ½Ï¸ßµÄ Big Put ³¡¾° (´óÈÝÁ¿µ¥´Î Put »òÉèÖÃÁ˽ϴó cache µÄ Scan£¬¾ùÊôÓÚ Big Put) »ò ReigonServer µÄÄÚ´æ±È½Ï½ôÕŵij¡¾°¡£
½Ï¶àµÄ IO Ị̈߳¬ÊÊÓÃÓÚµ¥´ÎÇëÇóÄÚ´æÏûºÄµÍ£¬TPS ÒªÇó (ÿÃëÊÂÎñ´¦ÀíÁ¿ (TransactionPerSecond)) ·Ç³£¸ßµÄ³¡¾°¡£ÉèÖøÃÖµµÄʱºò£¬ÒÔ¼à¿ØÄÚ´æÎªÖ÷Òª²Î¿¼¡£
ÔÚ hbase-site.xml ÅäÖÃÎļþÖÐÅäÖÃÏîΪ hbase.regionserver.handler.count¡£
Region ´óСÉèÖÃ
ÅäÖÃÏîΪ hbase.hregion.max.filesize£¬ËùÊôÅäÖÃÎļþΪ hbase-site.xml.£¬Ä¬ÈÏ´óС 256M¡£
ÔÚµ±Ç° ReigonServer Éϵ¥¸ö Reigon µÄ×î´ó´æ´¢¿Õ¼ä£¬µ¥¸ö Region ³¬¹ý¸Ãֵʱ£¬Õâ¸ö Region »á±»×Ô¶¯ split ³É¸üСµÄ Region¡£Ð¡ Region ¶Ô split ºÍ compaction ÓѺã¬ÒòΪ²ð·Ö Region »ò compact С Region ÀïµÄ StoreFile ËٶȺܿ죬ÄÚ´æÕ¼Óõ͡£È±µãÊÇ split ºÍ compaction »áºÜƵ·±£¬ÌرðÊÇÊýÁ¿½Ï¶àµÄС Region ²»Í£µØ split, compaction£¬»áµ¼Ö¼¯ÈºÏìӦʱ¼ä²¨¶¯ºÜ´ó£¬Region ÊýÁ¿Ì«¶à²»½ö¸ø¹ÜÀíÉÏ´øÀ´Âé·³£¬ÉõÖÁ»áÒý·¢Ò»Ð© Hbase µÄ bug¡£Ò»°ã 512M ÒÔÏµĶ¼ËãС Region¡£´ó Region Ôò²»Ì«ÊʺϾ³£ split ºÍ compaction£¬ÒòΪ×öÒ»´Î compact ºÍ split »á²úÉú½Ï³¤Ê±¼äµÄÍ£¶Ù£¬¶ÔÓ¦ÓõĶÁдÐÔÄܳå»÷·Ç³£´ó¡£
´ËÍ⣬´ó Region Òâζ׎ϴóµÄ StoreFile£¬compaction ʱ¶ÔÄÚ´æÒ²ÊÇÒ»¸öÌôÕ½¡£Èç¹ûÄãµÄÓ¦Óó¡¾°ÖУ¬Ä³¸öʱ¼äµãµÄ·ÃÎÊÁ¿½ÏµÍ£¬ÄÇôÔÚ´Ëʱ×ö compact ºÍ split£¬¼ÈÄÜ˳ÀûÍê³É split ºÍ compaction£¬ÓÖÄܱ£Ö¤¾ø´ó¶àÊýʱ¼äƽÎȵĶÁдÐÔÄÜ¡£compaction ÊÇÎÞ·¨±ÜÃâµÄ£¬split ¿ÉÒÔ´Ó×Ô¶¯µ÷ÕûΪÊÖ¶¯¡£Ö»ÒªÍ¨¹ý½«Õâ¸ö²ÎÊýÖµµ÷´óµ½Ä³¸öºÜÄÑ´ïµ½µÄÖµ£¬±ÈÈç 100G£¬¾Í¿ÉÒÔ¼ä½Ó½ûÓÃ×Ô¶¯ split(RegionServer ²»»á¶Ôδµ½´ï 100G µÄ Region ×ö split)¡£ÔÙÅäºÏ RegionSplitter Õâ¸ö¹¤¾ß£¬ÔÚÐèÒª split ʱ£¬ÊÖ¶¯ split¡£ÊÖ¶¯ split ÔÚÁé»îÐÔºÍÎȶ¨ÐÔÉÏ±ÈÆð×Ô¶¯ split Òª¸ßºÜ¶à£¬¶øÇÒ¹ÜÀí³É±¾Ôö¼Ó²»¶à£¬±È½ÏÍÆ¼ö online ʵʱϵͳʹÓá£ÄÚ´æ·½Ãæ£¬Ð¡ Region ÔÚÉèÖà memstore µÄ´óСֵÉϱȽÏÁé»î£¬´ó Region Ôò¹ý´ó¹ýС¶¼²»ÐУ¬¹ý´ó»áµ¼Ö flush ʱ app µÄ IO wait Ôö¸ß£¬¹ýСÔòÒò StoreFile ¹ý¶àÓ°Ïì¶ÁÐÔÄÜ¡£
HBase ÅäÖÃ
½¨Òé HBase µÄ·þÎñÆ÷ÄÚ´æÖÁÉÙ 32G£¬±í 1 ÊÇͨ¹ýʵ¼ù¼ìÑéµÃµ½µÄ·ÖÅ䏸¸÷½ÇÉ«µÄÄڴ潨ÒéÖµ¡£
±í 1. HBase Ïà¹Ø·þÎñÅäÖÃÐÅÏ¢
HBase µÄµ¥¸ö Region ´óС½¨ÒéÉèÖôóһЩ£¬ÍƼö 2G£¬RegionServer ´¦ÀíÉÙÁ¿µÄ´ó Region ±È´óÁ¿µÄС Region ¸ü¿ì¡£¶ÔÓÚ²»ÖØÒªµÄÊý¾Ý£¬ÔÚ´´½¨±íʱ½«Æä·ÅÔÚµ¥¶ÀµÄÁÐ×åÄÚ£¬²¢ÇÒÉèÖÃÆäÁÐ×屸·ÝÊýΪ 2£¨Ä¬ÈÏÊÇÕâÑù¼È±£Ö¤ÁËË«±¸·Ý£¬ÓÖ¿ÉÒÔ½ÚÔ¼¿Õ¼ä£¬Ìá¸ßдÐÔÄÜ£¬´ú¼ÛÊǸ߿ÉÓÃÐԱȱ¸·ÝÊýΪ 3 µÄÉԲÇÒ¶ÁÐÔÄܲ»ÈçĬÈϱ¸·ÝÊýµÄʱºò¡£
ʵ¼Ê°¸Àý
ÏîĿҪÇó¿ÉÒÔɾ³ý´æ´¢ÔÚ HBase Êý¾Ý±íÖеÄÊý¾Ý£¬Êý¾ÝÔÚ HBase ÖÐµÄ Rowkey ÓÉÈÎÎñ ID(Êý¾ÝÓÉÈÎÎñ²úÉú) ¼ÓÉÏ 16 Î»Ëæ»úÊý×é³É£¬ÈÎÎñÐÅÏ¢Óɵ¥¶ÀÒ»Õűíά»¤¡£Í¼ 2 ËùʾÊÇÊý¾Ýɾ³ýÁ÷³Ìͼ¡£

ͼ 2. Êý¾Ýɾ³ýÁ÷³Ìͼ
×î³õµÄÉè¼ÆÊÇÔÚɾ³ýÈÎÎñµÄͬʱ°´ÕÕÈÎÎñ ID ɾ³ý¸ÃÈÎÎñ´æ´¢ÔÚ HBase ÖеÄÏàÓ¦Êý¾Ý¡£µ«ÊÇ HBase Êý¾Ý½Ï¶àʱ»áµ¼ÖÂɾ³ýºÄʱ½Ï³¤£¬Í¬Ê±ÓÉÓÚ´ÅÅÌ I/O ½Ï¸ß£¬»áµ¼ÖÂÊý¾Ý¶ÁÈ¡¡¢Ð´È볬ʱ¡£
²é¿´ HBase ÈÕÖ¾·¢ÏÖɾ³ýÊý¾Ýʱ£¬HBase ÔÚ×ö Major Compaction ²Ù×÷¡£Major Compaction ²Ù×÷µÄÄ¿µÄÊǺϲ¢Îļþ£¬²¢Çå³ýɾ³ý¡¢¹ýÆÚ¡¢¶àÓà°æ±¾µÄÊý¾Ý¡£Major Compaction ʱ HBase ½«ºÏ²¢ Region ÖÐ StoreFile£¬¸Ã¶¯×÷Èç¹û³ÖÐø³¤Ê±¼ä»áµ¼ÖÂÕû¸ö Region ¶¼²»¿É¶Á£¬×îÖÕµ¼ÖÂËùÓлùÓÚÕâЩ Region µÄ²éѯ³¬Ê±¡£
Èç¹ûÏëÒª½â¾ö Major Compaction ÎÊÌ⣬ÐèÒª²é¿´ËüµÄÔ´´úÂ롣ͨ¹ý²é¿´ HBase Ô´Âë·¢ÏÖ RegionServer ÔÚÆô¶¯Ê±ºò£¬Óиö CompactionChecker Ïß³ÌÔÚ¶¨ÆÚ¼ì²âÊÇ·ñÐèÒª×ö Compact¡£Ô´´úÂëÈçͼ 3 Ëùʾ¡£

ͼ 3. CompactionChecker Ï̴߳úÂëͼ
isMajorCompaction Öлá¸ù¾Ý hbase.hregion.majorcompaction ²ÎÊýÀ´ÅжÏÊÇ·ñ×ö Major Compact¡£Èç¹û hbase.hregion.majorcompaction Ϊ 0£¬Ôò·µ»Ø false¡£ÐÞ¸ÄÅäÖÃÎļþ hbase.hregion.majorcompaction Ϊ 0£¬½ûÖ¹ HBase µÄ¶¨ÆÚ Major Compaction »úÖÆ£¬Í¨¹ý×Ô¶¨ÒåµÄ¶¨Ê±»úÖÆ (ÔÚÁ賿 HBase ÒµÎñ²»·±Ã¦Ê±) Ö´ÐÐ Major ²Ù×÷£¬Õâ¸ö¶¨Ê±¿ÉÒÔÊÇͨ¹ý Linux cron ¶¨Ê±Æô¶¯½Å±¾£¬Ò²¿ÉÒÔͨ¹ý Java µÄ timer schedule£¬ÔÚʵ¼ÊÏîÄ¿ÖÐʹÓà Quartz À´Æô¶¯£¬Æô¶¯µÄʱ¼äÅäÖÃÔÚÅäÖÃÎļþÖиø³ö£¬¿ÉÒÔ·½±ãµÄÐÞ¸Ä Major Compact Æô¶¯µÄʱ¼ä¡£Í¨¹ýÕâÖÖÐ޸ĺó£¬ÎÒÃÇ·¢ÏÖÔÚɾ³ýÊý¾ÝºóÈÔ»áÓÐ Compact ²Ù×÷¡£ÕâÑùÁ÷³Ì½øÈë needsCompaction = true µÄ·ÖÖ§¡£²é¿´ needsCompaction ÅжÏÌõ¼þΪ (storefiles.size() ¨C filesCompacting.size()) > minFilesToCompact ´¥·¢¡£Í¬Ê±µ±Ðè½ôËõµÄÎļþÊýµÈÓÚ Store µÄËùÓÐÎļþÊý£¬Minor Compact ×Ô¶¯Éý¼¶Îª Major Compact¡£µ«ÊÇ Compact ²Ù×÷²»ÄܽûÖ¹£¬ÒòΪÕâÑù»áµ¼ÖÂÊý¾ÝÒ»Ö±´æÔÚ£¬×îÖÕÓ°Ïì²éѯЧÂÊ¡£
»ùÓÚÒÔÉÏ·ÖÎö£¬ÎÒÃDZØÐëÖØÐ¿¼ÂÇɾ³ýÊý¾ÝµÄÁ÷³Ì¡£¶ÔÓû§À´Ëµ£¬Óû§Ö»ÒªÔÚ¼ìË÷ʱ¶ÔÓÚɾ³ýµÄÈÎÎñ²»½øÐмìË÷¼´¿É¡£ÄÇôֻÐèҪɾ³ý¸ÃÌõÈÎÎñ¼Ç¼£¬¶ÔÓÚ¸ÃÈÎÎñÏà¹ØÁªµÄÊý¾Ý²»ÐèÒªÁ¢Âí½øÐÐɾ³ý¡£µ±ÏµÍ³¿ÕÏÐʱºòÔÙÈ¥¶¨Ê±É¾³ý HBase Êý¾Ý±íÖеÄÊý¾Ý£¬²¢¶Ô Region ×ö Major Compact£¬ÇåÀíÒѾɾ³ýµÄÊý¾Ý¡£Í¨¹ý¶ÔÈÎÎñɾ³ýÁ÷³ÌµÄÐ޸ģ¬´ïµ½ÏîÄ¿µÄÐèÇó£¬Í¬Ê±ÕâÖÖÐÞ¸ÄÒ²²»ÐèÒªÐÞ¸Ä HBase µÄÅäÖá£

ͼ 4. Êý¾Ýɾ³ýÁ÷³Ì¶Ô±Èͼ
¼ìË÷¡¢²éѯ¡¢É¾³ý HBase Êý¾Ý±íÖеÄÊý¾Ý±¾Éí´æÔÚ´óÁ¿µÄ¹ØÁªÐÔ£¬ÐèÒª²é¿´ HBase Êý¾Ý±íµÄÔ´´úÂë²ÅÄÜÈ·¶¨µ¼Ö¼ìË÷ÐÔÄÜÆ¿¾±µÄ¸ù±¾ÔÒò¼°×îÖÕ½â¾ö·½°¸¡£
½áÊøÓï
HBase Êý¾Ý¿âµÄʹÓü°¼ìË÷ÓÅ»¯·½Ê½¾ùÓ봫ͳ¹ØÏµÐÍÊý¾Ý¿â´æÔڽ϶಻ͬ£¬±¾ÎÄ´ÓÊý¾Ý±íµÄ»ù±¾¶¨Ò巽ʽ³ö·¢£¬Í¨¹ý HBase ×ÔÉíÌṩµÄ API ·ÃÎÊ·½Ê½ÈëÊÖ£¬¾ÙÀý˵Ã÷ÓÅ»¯·½Ê½¼°×¢ÒâÊÂÏ×îºóͨ¹ýʵÀýÀ´ÑéÖ¤ÓÅ»¯·½°¸¿ÉÐÐÐÔ¡£¼ìË÷ÐÔÄܱ¾ÉíÊÇÊý¾Ý±íÉè¼Æ¡¢³ÌÐòÉè¼Æ¡¢Âß¼Éè¼ÆµÈµÄ½áºÏ²úÎÐèÒª³ÌÐòÔ±ÉîÈëÀí½âºó²ÅÄÜ×ö³öÕýÈ·µÄÓÅ»¯·½°¸¡£
|