HBASE学习笔记--API

HBaseConfigurationjava

HBaseConfiguration是每个hbase client都会使用到的对象,它表明的是HBase配置信息。它有两种构造方式:api

public HBaseConfiguration()数组

public HBaseConfiguration(final Configuration c)dom

 

默认的构造方式会尝试从hbase-default.xml和hbase-site.xml中读取配置。若是classpath没有这两个文件,就须要你本身设置配置。eclipse

Configuration HBASE_CONFIG = new Configuration();

HBASE_CONFIG.set(“hbase.zookeeper.quorum”, “zkServer”);

HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, “2181″);

HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

 

 

增长family异步

经过 HTableDescriptor的 addFamily方法函数

public void addFamily(final HColumnDescriptor family)性能

HColumnDescriptor 表明的是column的schema,提供的方法比较经常使用的有学习

setTimeToLive:指定最大的TTL,单位是ms,过时数据会被自动删除。测试

setInMemory:指定是否放在内存中,对小表有用,可用于提升效率。默认关闭

setBloomFilter:指定是否使用BloomFilter,可提升随机查询效率。默认关闭

setCompressionType:设定数据压缩类型。默认无压缩。

setMaxVersions:指定数据最大保存的版本个数。默认为3。

 

建表 api:

void createTable(HTableDescriptor desc) 

void createTable(HTableDescriptor desc, byte[] startKey,byte[] endKey, int numRegions) 

void createTable(HTableDescriptor desc, byte[][] splitKeys) 

void createTableAsync(HTableDescriptor desc, byte[][] splitKeys) 

 

第一个函数相对简单,就是建立一个表,这个表没有任何region。后三个函数是建立表的时候帮你分配好指定数量的region(提早分配region的好处,了解HBase的人都清楚,为了减小Split,这样能节省很多时间)

 

第二个函数是使用者指定表的“起始行键”、“末尾行键”和region的数量,这样系统自动给你划分region。根据的region数,来均分全部的行键。这个方法的问题是若是你的表的行键不是连续的,那样的话就致使有些region的行键不会用到,有些region是全满的。

 

因此HBase很人性的给了第三种和第四种方法。这两个函数是用户须要本身region的划分。这个函数的参数splitKeys是一个二维字节数据,行的最大数表示region划分数+1,列就表示region和region之间的行键。

 

byte[][] regions = new byte[][] {  

  Bytes.toBytes("A"), 

  Bytes.toBytes("D"), 

  Bytes.toBytes("G"), 

  Bytes.toBytes("K"), 

  Bytes.toBytes("O"), 

  Bytes.toBytes("T") 

}; 

 

就表示有7个region(6+1),具体region表示的行键为:

[java] view plaincopyprint?

[1] start key: , end key: A 

[2] start key: A, end key: D 

[3] start key: D, end key: G 

[4] start key: G, end key: K 

[5] start key: K, end key: O 

[6] start key: O, end key: T 

[7] start key: T, end key:

 

删除表

删除表也是经过HBaseAdmin来操做,删除表以前首先要disable表。这是一个很是耗时的操做,因此不建议频繁删除表。

disableTable和deleteTable分别用来disable和delete表。

admin = new HBaseAdmin(HbaseConf);                  

admin.disableTable(tableName);            

admin.deleteTable(tableName);

 

查询数据

查询分为单条随机查询和批量查询。

单条查询是经过rowkey在table中查询某一行的数据。HTable提供了get方法来完成单条查询。

批量查询是经过制定一段rowkey的范围来查询。HTable提供了个getScanner方法来完成批量查询。

public Result get(final Get get)

public ResultScanner getScanner(final Scan scan)

Get对象包含了一个Get查询须要的信息。它的构造方法有两种:

  public Get(byte [] row)

  public Get(byte [] row, RowLock rowLock)

Rowlock是为了保证读写的原子性,你能够传递一个已经存在Rowlock,不然HBase会自动生成一个新的rowlock。

Scan对象提供了默认构造函数,通常使用默认构造函数。

 

Get/Scan的经常使用方法有:

addFamily/addColumn:指定须要的family或者column,若是没有调用任何addFamily或者Column,会返回全部的columns.

setMaxVersions:指定最大的版本个数。若是不带任何参数调用setMaxVersions,表示取全部的版本。若是不掉用setMaxVersions,只会取到最新的版本。

setTimeRange:指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取。

setTimeStamp:指定时间戳。

setFilter:指定Filter来过滤掉不须要的信息

 

Scan特有的方法:

setStartRow:指定开始的行。若是不调用,则从表头开始。

setStopRow:指定结束的行(不含此行)。

setBatch:指定最多返回的Cell数目。用于防止一行中有过多的数据,致使OutofMemory错误。

ResultScanner是Result的一个容器,每次调用ResultScanner的next方法,会返回Result.

public Result next() throws IOException;

public Result [] next(int nbRows) throws IOException;

 

Result表明是一行的数据。经常使用方法有:

getRow:返回rowkey

raw:返回全部的key value数组。

getValue:按照column来获取cell的值

 

Example:

table = new HTable(conf, tableName);

table.setAutoFlush(false, false);

table.setWriteBufferSize(writeBufferSize);

Scan scan = new Scan();

scan.setTimeRange(start, end);

scan.addFamily(COLUMN_FAMILY);

scan.setMaxVersions();

ResultScanner ss = table.getScanner(scan);

ResultScanner ss = table.getScanner(s);

for(Result r:ss){

    System.out.println(new String(r.getRow()));

        for(KeyValue kv:r.raw()){

            System.out.println(new String(kv.getQualifier()));

            System.out.println(new String(kv.getValue()));

}

 } 

 

插入数据

HTable经过put方法来插入数据。 

public void put(final Put put) throws IOException

public void put(final List puts) throws IOException

能够传递单个批Put对象或者List put对象来分别实现单条插入和批量插入。

Put提供了3种构造方式:

public Put(byte [] row)

public Put(byte [] row, RowLock rowLock)

public Put(Put putToCopy) 

 

Put经常使用的方法有:

add:增长一个Cell

setTimeStamp:指定全部cell默认的timestamp,若是一个Cell没有指定timestamp,就会用到这个值。若是没有调用,HBase会将当前时间做为未指定timestamp的cell的timestamp.

setWriteToWAL: WAL是Write Ahead Log的缩写,指的是HBase在插入操做前是否写Log。默认是打开,关掉会提升性能,可是若是系统出现故障(负责插入的Region Server挂掉),数据可能会丢失。

另外HTable也有两个方法也会影响插入的性能

setAutoFlash: AutoFlush指的是在每次调用HBase的Put操做,是否提交到HBase Server。默认是true,每次会提交。若是此时是单条插入,就会有更多的IO,从而下降性能.

setWriteBufferSize: Write Buffer Size在AutoFlush为false的时候起做用,默认是2MB,也就是当插入数据超过2MB,就会自动提交到Server

 

Example:

HTable table = new HTable(hbaseConfig, tableName);

table.setAutoFlush(autoFlush);

List lp = new ArrayList();

int count = 10000;

byte[] buffer = new byte[1024];

Random r = new Random();

for (int i = 1; i <= count; ++i) {

       Put p = new Put(String.format(“row%09d”,i).getBytes());

       r.nextBytes(buffer);

       p.add(“f1″.getBytes(), null, buffer);

       p.add(“f2″.getBytes(), null, buffer);

       p.add(“f3″.getBytes(), null, buffer);

       p.add(“f4″.getBytes(), null, buffer);

       p.setWriteToWAL(wal);

       lp.add(p);

       if(i%1000==0){

           table.put(lp);

           lp.clear();

       }

    }

 

 

删除数据

HTable 经过delete方法来删除数据。

  public void delete(final Delete delete) 

 

Delete构造方法有:

public Delete(byte [] row)

public Delete(byte [] row, long timestamp, RowLock rowLock)

public Delete(final Delete d)

Delete经常使用方法有

deleteFamily/deleteColumns:指定要删除的family或者column的数据。若是不调用任何这样的方法,将会删除整行。

注意:若是某个Cell的timestamp高于当前时间,这个Cell将不会被删除,仍然能够查出来。

 

Example:

HTable table = new HTable(hbaseConfig, “mytest”);

Delete d = new Delete(“row1″.getBytes());

table.delete(d) 

 

 

切分表

HBaseAdmin提供split方法来将table 进行split.

public void split(final String tableNameOrRegionName)

 

若是提供的tableName,那么会将table全部region进行split ;若是提供的region Name,那么只会split这个region.

因为split是一个异步操做,咱们并不能确切的控制region的个数。

 

Example:

          

public void split(String tableName,int number,int timeout) throws Exception {

    Configuration HBASE_CONFIG = new Configuration();

    HBASE_CONFIG.set(“hbase.zookeeper.quorum”, GlobalConf.ZOOKEEPER_QUORUM);

    HBASE_CONFIG.set(“hbase.zookeeper.property.clientPort”, GlobalConf.ZOOKEEPER_PORT);

    HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);

    HBaseAdmin hAdmin = new HBaseAdmin(cfg);

    HTable hTable = new HTable(cfg,tableName);

    int oldsize = 0;

    t =  System.currentTimeMillis();

    while(true){

       int size = hTable.getRegionsInfo().size();

       logger.info(“the region number=”+size);

       if(size>=number ) break;

       if(size!=oldsize){

           hAdmin.split(hTable.getTableName());

           oldsize = size;

       }       else if(System.currentTimeMillis()-t>timeout){

           break;

       }

       Thread.sleep(1000*10);

    }

}

 

 

 学习中的一些错误

用eclipse测试hbase时报错:

13/11/19 16:14:06 INFO ipc.HBaseRPC: Problem connecting to server: zzz.yyy.sqa.cm4/202.106.199.38:36020

 

缘由:

须要设置host: zzz.yyy.sqa.cm4 ,在开发机的集群和我本身电脑的集群该ip不同,一个是外网ip,一个是内网ip。须要手动设置host