立即注册 登录
About云-梭伦科技 返回首页

s060403072的个人空间 https://www.aboutyun.com/?57 [收藏] [复制] [分享] [RSS]

日志

Hbase简单入门的技巧

已有 1578 次阅读2016-3-16 21:55 | 技巧

我们已经知道了Hbase是一个开源的非关系型分布式数据库以及它的作用,下来我们学习这个软件的应用,今天我给大家讲一一些HBase简单入门的技巧。


HBaseConfiguration是用来配置HBase的对象。

他只有两个过时的构造方法,这里不讲。他还有两个静态的创造配置文件的方法,

create() 和create(org.apache.hadoop.conf.Configuration that)

无参数的是创建一个新的与Hbase的资源配置,带参数的是创建一个资源配置的副本。

资源配置创建好了,我们还需要手动设置配置的位置。

用Confguration的set方法:

Configuration conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "服务器地址");

配置搞定。

---

创建表

使用HBaseAdmin

它提供了一个接口来管理HBase的数据库表的元数据。使用HBaseAdmin可以创建,删除,查看,启用和禁用表。它也使用添加和删除表列的字段。

它提供了createTable(HTableDescriptor desc) 这个方法,HTableDescriptor包含HBase的表的所有列描述符的详细信息,是一个目录表,表的根,提供的方法中比较有用的有:

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

如果要增加列,通过addFamily(HColumnDescriptor family) 增加一个列字段。

HColumnDescriptor指一个列,一个列的版本,它提供的方法比较常用的有

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

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

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

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

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

一个简单的例子:

public static void creatTable() {

HBaseAdmin admin = new HBaseAdmin(conf);

if (admin.tableExists("table")) {

admin.disableTable("table");

admin.deleteTable("table");

}

HTableDescriptor tableDescripter = new HTableDescriptor("table".getBytes());

tableDescripter.addFamily(new HColumnDescriptor("one"));

tableDescripter.addFamily(new HColumnDescriptor("two"));

tableDescripter.addFamily(new HColumnDescriptor("three"));

admin.createTable(tableDescripter);

}

删除表

删除表也是通过HBaseAdmin来操作,删除表之前首先要disable表。这是一个非常耗时的操作,所以不建议频繁删除表。

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

Example:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

if (hAdmin.tableExists(tableName)) {

hAdmin.disableTable(tableName);

hAdmin.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:

Scan s = new Scan();

s.setMaxVersions();

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.getValue()));

}

}

插入数据

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

public void put(final Put put) throws IOException

public void put(final List<Put> 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<Put> lp = new ArrayList<Put>();

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);

博客分类:

Hbase

Hbase

HBaseConfiguration是用来配置HBase的对象。

意思是把HBase的配置文件添加到配置信息中,这个类继承自org.apache.hadoop.conf.Configuration,

他只有两个过时的构造方法,这里不讲。他还有两个静态的创造配置文件的方法,

create() 和create(org.apache.hadoop.conf.Configuration that)

无参数的是创建一个新的与Hbase的资源配置,带参数的是创建一个资源配置的副本。

资源配置创建好了,我们还需要手动设置配置的位置。

用Confguration的set方法:

Configuration conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "服务器地址");

配置搞定。

---

创建表

使用HBaseAdmin

它提供了一个接口来管理HBase的数据库表的元数据。使用HBaseAdmin可以创建,删除,查看,启用和禁用表。它也使用添加和删除表列的字段。

它提供了createTable(HTableDescriptor desc) 这个方法,HTableDescriptor包含HBase的表的所有列描述符的详细信息,是一个目录表,表的根,提供的方法中比较有用的有:

setMaxFileSize,指定最大的region size

setMemStoreFlushSize 指定memstore flush到HDFS上的文件大小

如果要增加列,通过addFamily(HColumnDescriptor family) 增加一个列字段。

HColumnDescriptor指一个列,一个列的版本,它提供的方法比较常用的有

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

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

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

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

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

一个简单的例子:

public static void creatTable() {

HBaseAdmin admin = new HBaseAdmin(conf);

if (admin.tableExists("table")) {

admin.disableTable("table");

admin.deleteTable("table");

}

HTableDescriptor tableDescripter = new HTableDescriptor("table".getBytes());

tableDescripter.addFamily(new HColumnDescriptor("one"));

tableDescripter.addFamily(new HColumnDescriptor("two"));

tableDescripter.addFamily(new HColumnDescriptor("three"));

admin.createTable(tableDescripter);

}

删除表

删除表也是通过HBaseAdmin来操作,删除表之前首先要disable表。这是一个非常耗时的操作,所以不建议频繁删除表。

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

Example:

HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);

if (hAdmin.tableExists(tableName)) {

hAdmin.disableTable(tableName);

hAdmin.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:

Scan s = new Scan();

s.setMaxVersions();

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.getValue()));

}

}

插入数据

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

public void put(final Put put) throws IOException

public void put(final List<Put> 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<Put> lp = new ArrayList<Put>();

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);


 


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条