Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
HBase Êý¾Ý¿â¼ìË÷ÐÔÄÜÓÅ»¯²ßÂÔ
 
×÷Õß  ÖÜÃ÷Ò«  À´Ô´:²®ÀÖÔÚÏß  »ðÁú¹ûÈí¼þ  ·¢²¼ÓÚ 2015-8-17
  2080  次浏览      30
 

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 ·ÃÎÊ·½Ê½ÈëÊÖ£¬¾ÙÀý˵Ã÷ÓÅ»¯·½Ê½¼°×¢ÒâÊÂÏ×îºóͨ¹ýʵÀýÀ´ÑéÖ¤ÓÅ»¯·½°¸¿ÉÐÐÐÔ¡£¼ìË÷ÐÔÄܱ¾ÉíÊÇÊý¾Ý±íÉè¼Æ¡¢³ÌÐòÉè¼Æ¡¢Âß¼­Éè¼ÆµÈµÄ½áºÏ²úÎÐèÒª³ÌÐòÔ±ÉîÈëÀí½âºó²ÅÄÜ×ö³öÕýÈ·µÄÓÅ»¯·½°¸¡£

   
2080 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

MySQLË÷Òý±³ºóµÄÊý¾Ý½á¹¹
MySQLÐÔÄܵ÷ÓÅÓë¼Ü¹¹Éè¼Æ
SQL ServerÊý¾Ý¿â±¸·ÝÓë»Ö¸´
ÈÃÊý¾Ý¿â·ÉÆðÀ´ 10´óDB2ÓÅ»¯
oracleµÄÁÙʱ±í¿Õ¼äдÂú´ÅÅÌ
Êý¾Ý¿âµÄ¿çƽ̨Éè¼Æ


²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿â
¸ß¼¶Êý¾Ý¿â¼Ü¹¹Éè¼ÆÊ¦
HadoopÔ­ÀíÓëʵ¼ù
Oracle Êý¾Ý²Ö¿â
Êý¾Ý²Ö¿âºÍÊý¾ÝÍÚ¾ò
OracleÊý¾Ý¿â¿ª·¢Óë¹ÜÀí


GE Çø¿éÁ´¼¼ÊõÓëʵÏÖÅàѵ
º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Nodejs¸ß¼¶Ó¦Óÿª·¢
ÖÐÊ¢Òæ»ª ׿Խ¹ÜÀíÕß±ØÐë¾ß±¸µÄÎåÏîÄÜÁ¦
ijÐÅÏ¢¼¼Êõ¹«Ë¾ PythonÅàѵ
ij²©²ÊITϵͳ³§ÉÌ Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À
ÖйúÓÊ´¢ÒøÐÐ ²âÊÔ³ÉÊì¶ÈÄ£Ðͼ¯³É(TMMI)
ÖÐÎïÔº ²úÆ·¾­ÀíÓë²úÆ·¹ÜÀí