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