一、HBase数据模型
HBase分布式数据库的数据存储在行列式的表格中,它是一个多维度的映射模型,其数据模型如下所示。表的索引是行键,列族,列限定符和时间戳,表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,列族支持动态扩展,可以很轻松的添加一个列族或者列,无须预先定义列的数量及数据类型,所有列均以字符串形式存储
RowKey表示行键,每个HBase表中只能有一个行键,它在HBase中以字典序的方式存储。由于RowKey是HBase表的唯一标识,因此Row Key的设计非常重要。
HBase表的列是由列族名、限定符以及列名组成的,其中“:”为限定符。创建HBase表不需要指定列,因为列是可变的,非常灵活。
在HBase中,列族由很多列组成。在同一个表里,不同列族有完全不同的属性,但是同一个列族内的所有列都会有相同的属性,而属性都是定义在列族上的。
表示时间戳,记录每次操作数据的时间,通常记作数据的版本号。
二、HBase的Shell操作
HBase Shell提供大量操作HBase的命令,通过Shell命令很方便地操作HBase数据库,如创建、删除及修改表、向表中添加数据、列出表中的相关信息等操作。当使用Shell命令行操作HBase时,需要进入HBase Shell交互界面,执行“bin/hbase shell”命令进入到目录/hbase的界面。
在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。
1)显示hbase中的表l ist
2)创建表user,包含info、data两个列族
3)向user表中插入数据
4)获取user表中row key为rk0001的所有信息
5)获取user表中row key为rk0001,列族为info,版本号最新3个的信息 HBase2.0默认VERSIONS为1,也就是说,默认情况只会存取一个版本的列数据。需要使用alter命令修改表的版本号。
清空表数据
添加列族
三、HBase的Java API操作
HBase是由Java语言开发的,它对外提供了Java API的接口。下面,通过一个表来列举HBase常见的Java API。
下面代码主要利用HBase常用的Java API进行表的创建,插入,删除等操作
package com.hadoop.hbase; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class HbaseApiDemo { //初始化Configuration对象 private Configuration conf = null; //初始化连接 private Connection conn = null; @Before public void init() throws Exception { //获取Configuration对象 conf = HBaseConfiguration.create(); //对于hbase的客户端来说,只需要知道hbase所经过的Zookeeper集群地址即可 conf.set("hbase.zookeeper.quorum", "bigdata01:2181,bigdata02:2181,bigdata03:2181"); //获取连接 conn = ConnectionFactory.createConnection(conf); } @Test public void CreateTable() throws Exception { try { //获取操作对象 Admin admin = conn.getAdmin(); //构建一个user表 TableDescriptorBuilder t_user = TableDescriptorBuilder.newBuilder(TableName.valueOf("t_user")); //创建列族 1 ColumnFamilyDescriptor of = ColumnFamilyDescriptorBuilder.of("info"); t_user.setColumnFamily(of); //创建列族 2 ColumnFamilyDescriptor of1 = ColumnFamilyDescriptorBuilder.of("data"); t_user.setColumnFamily(of1); //构建 TableDescriptor build = t_user.build(); //创建表 admin.createTable(build); // 关闭连接 admin.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } @Test public void testPut() throws Exception { //创建table对象,通过table对象来添加数据 Table table = conn.getTable(TableName.valueOf("t_user")); //创建一个集合,用于存放Put对象 ArrayList<Put> puts = new ArrayList<Put>(); //构建put对象(kv形式),并指定其行键 Put put01 = new Put(Bytes.toBytes("rk002")); put01.addColumn(Bytes.toBytes("info"), Bytes.toBytes("username"), Bytes.toBytes("zhangsan")); put01.addColumn(Bytes.toBytes("info"), Bytes.toBytes("password"), Bytes.toBytes("345678")); Put put02 = new Put("rk003".getBytes()); put02.addColumn(Bytes.toBytes("info"), Bytes.toBytes("username"), Bytes.toBytes("lisi")); //把所有的put对象添加到一个集合中 puts.add(put01); puts.add(put02); //提交所有的插入数据的记录 table.put(puts); //关闭 table.close(); conn.close(); } @Test public void testGet() throws IOException { Table table = conn.getTable(TableName.valueOf("t_user")); //得到用于扫描region的对象 // Scan scan = new Scan(); Get get = new Get("rk002".getBytes()); //使用HTable得到resultcanner实现类的对象 Result result1 = table.get(get); List<Cell> cells = result1.listCells(); for (Cell cell : cells) { //得到rowkey System.out.println("行键:" + Bytes.toString(CellUtil.cloneRow(cell))); //得到列族 System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell))); System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell))); System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell))); } } @Test public void testScan() throws Exception { //获取table对象 Table table = conn.getTable(TableName.valueOf("t_user")); //获取scan对象 Scan scan = new Scan(); //获取查询的数据 ResultScanner scanner = table.getScanner(scan); //获取ResultScanner所有数据,返回迭代器 Iterator<Result> iter = scanner.iterator(); //遍历迭代器 while (iter.hasNext()) { //获取当前每一行结果数据 Result result = iter.next(); //获取当前每一行中所有的cell对象 List<Cell> cells = result.listCells(); //迭代所有的cell for(Cell c:cells){ //获取行键 byte[] rowArray = c.getRowArray(); //获取列族 byte[] familyArray = c.getFamilyArray(); //获取列族下的列名称 byte[] qualifierArray = c.getQualifierArray(); //列字段的值 byte[] valueArray = c.getValueArray(); //打印rowArray、familyArray、qualifierArray、valueArray System.out.println("行键:"+new String(rowArray, c.getRowOffset(), c.getRowLength())); System.out.print("列族:"+new String(familyArray,c.getFamilyOffset(), c.getFamilyLength())); System.out.print(" "+"列:"+ new String(qualifierArray, c.getQualifierOffset(), c.getQualifierLength())); System.out.println(" "+"值:"+ new String(valueArray, c.getValueOffset(), c.getValueLength())); } System.out.println("-----------------------"); } //关闭 table.close(); conn.close(); } @Test public void testDel() throws Exception { //获取table对象 Table table = conn.getTable(TableName.valueOf("t_user")); //获取delete对象,需要一个rowkey Delete delete = new Delete("rk002".getBytes()); //在delete对象中指定要删除的列族-列名称 delete.addColumn("info".getBytes(), "password".getBytes()); //执行删除操作 table.delete(delete); //关闭 table.close(); conn.close(); } @Test public void testDrop() throws Exception { //获取一个表的管理器 Admin admin = conn.getAdmin(); //删除表时先需要禁用表 admin.disableTable(TableName.valueOf("t_user")); admin.deleteTable(TableName.valueOf("t_user")); //关闭 admin.close(); conn.close(); } }
创作不易 觉得有帮助请点赞关注收藏~~~