一、准备
启动hdfs集群(之前的HA集群),启动Hbase。
二、创建工程
三、API操作Hbase分布式数据库
1)插入一条数据
@Test
public void put() throws Exception {
//创建conf对象 会加载你项目资源文件下的两个XML文件
Configuration conf = HBaseConfiguration.create();
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//通过连接查询tableName对象 表名
TableName tname = TableName.valueOf("ns1:t1");
//获得table
Table table = conn.getTable(tname);
//通过bytes工具类创建字节数组(将字符串)
byte[] rowid = Bytes.toBytes("row1"); //rowkey名
//创建put对象
Put put = new Put(rowid);
byte[] f1 = Bytes.toBytes("f1"); //列簇名
byte[] id = Bytes.toBytes("id") ; //列名
byte[] value = Bytes.toBytes(102); //设置值
put.addColumn(f1,id,value);
//执行插入
table.put(put);
}
执行结束,在shell里面查询结果如下:(hbase存储的数据都是字节数组)
2)批量插入一万条数据
@Test
public void bigInsert() throws Exception {
DecimalFormat format = new DecimalFormat();
format.applyPattern("0000");
long start = System.currentTimeMillis() ;
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tname = TableName.valueOf("ns1:t2");
HTable table = (HTable)conn.getTable(tname);
//不要自动清理缓冲区
table.setAutoFlush(false);
for(int i = 1 ; i < 10000 ; i ++){
Put put = new Put(Bytes.toBytes("row" + format.format(i))) ;
//关闭写前日志
put.setWriteToWAL(false);
put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("id"),Bytes.toBytes(i));
put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom" + i));
put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("age"),Bytes.toBytes(i % 100));
table.put(put);
if(i % 2000 == 0){
table.flushCommits();
}
}
//手动刷新缓冲区
table.flushCommits();
System.out.println(System.currentTimeMillis() - start );
}
3)获取某一列的数据
@Test
public void get() throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tname = TableName.valueOf("ns1:t1");
Table table = conn.getTable(tname);
byte[] rowid = Bytes.toBytes("row1");
Get get = new Get(rowid);
Result r = table.get(get);
byte[] idvalue = r.getValue(Bytes.toBytes("f1"),Bytes.toBytes("id"));
System.out.println(Bytes.toInt(idvalue));
}
4)创建工作空间
@Test
public void createNameSpace() throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
//创建名字空间描述符
NamespaceDescriptor nsd = NamespaceDescriptor.create("ns2").build();
admin.createNamespace(nsd);
//列举出所有的工作空间
NamespaceDescriptor[] ns = admin.listNamespaceDescriptors();
for(NamespaceDescriptor n : ns){
System.out.println(n.getName());
}
}
因为NamespaceDescriptor对象的构造函数是私有的,没法直接new,所以创建模式是一下的调用步骤。使用了设计模式
工作空间的创造步骤:
5)创建表
@Test
public void createTable() throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
Admin admin = conn.getAdmin();
//创建表名对象
TableName tableName = TableName.valueOf("ns2:t2");
//创建表描述符对象
HTableDescriptor tbl = new HTableDescriptor(tableName);
//创建列族描述符
HColumnDescriptor col = new HColumnDescriptor("f1" );
tbl.addFamily(col);
admin.createTable(tbl);
System.out.println("over");
}
HBaseAdmin这个类有很多关于工作空间、表、Region等的操作
6)根据rowkey范围扫描表
@Test
public void scan() throws Exception {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tname = TableName.valueOf("ns1:t2");
Table table = conn.getTable(tname);
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("row5000"));//包前 [row5000,
scan.setStopRow(Bytes.toBytes("row5050"));//不包后 ,row5050)
ResultScanner rs = table.getScanner(scan);
Iterator<Result> it = rs.iterator();
while (it.hasNext()) {
Result r = it.next();
byte[] name = r.getValue(Bytes.toBytes("f1"), Bytes.toBytes("name"));
System.out.println(Bytes.toString(name));
}
}
7)指定版本扫描
@Test
public void getWithVersions() throws IOException {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tname = TableName.valueOf("ns1:t3");
Table table = conn.getTable(tname);
Get get = new Get(Bytes.toBytes("row001"));
//检索所有版本
get.setMaxVersions();
Result r = table.get(get);
List<Cell> cells = r.getColumnCells(Bytes.toBytes("f1"), Bytes.toBytes("name"));
for (Cell c : cells) {
String f = Bytes.toString(c.getFamily());
String col = Bytes.toString(c.getQualifier());
long ts = c.getTimestamp();
String val = Bytes.toString(c.getValue());
System.out.println(f + "/" + col + "/" + ts + "=" + val);
}
}
8)过滤器
@Test
public void testRowFilter() throws IOException {
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
TableName tname = TableName.valueOf("ns1:t2");
Scan scan = new Scan();
//扫描出rowkey < row0100的数据,rowkey根据字典排序的
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,
new BinaryComparator(Bytes.toBytes("row0100")));
scan.setFilter(rowFilter);
Table t = conn.getTable(tname);
ResultScanner rs = t.getScanner(scan);
Iterator<Result> it = rs.iterator();
while (it.hasNext()) {
Result r = it.next();
System.out.println(Bytes.toString(r.getRow()));
}
}
过滤器类型:
比较方式类型:
这些就是基本的Hbase的API操作,有的类没有测试,比如多条件的scan,常用的过滤器等。
还有一个比较重要的是协处理器coprocessor的API。