文章目录
- 一、简介
- 定义
- hive和hbase
- 数据模型
- NameSpace
- Region
- Row
- Column
- Time Stamp
- Cell
- 二、Hbase架构
- 数据库的DDL和DML语言
- 高级架构
- 写操作
- Shell操作
- 三、Hbase API
- admin
- 判断表是否存在
- 删除表
- 创建表
一、简介
定义
Hbase是一种分布式,可扩展,支持海量数据存储的nosql数据库
HBase是谷歌BigTable的开源实现,使用zookeeper作为HA的管理,使用hdfs作为底层的数据存储
hive和hbase
hive本身不存储和计算数据,hive中的表纯逻辑。hive的意义可以理解为是把简单易写的hive sql转换成复杂难写的MapReduce程序。所以hive其实是MapReduce(大数据的一种计算框架)的一个包装。
hbase是物理表,不是逻辑表,且hbase比hive高效的多。是一种分布式,可扩展,大容量的数据库。
数据模型
逻辑上,Hbase的数据模型同关系型数据库很类似,数据存储在一张表上,有行有列。但是从底层物理存储结构(K-V)看,Hbase更像是一个multi-dimensional map.(多维度的表)
有列族,row_key
纵向有region区域,横向有列族,都是因为数据量太大,划分区域处理的原因。
NameSpace
命名空间,类似于数据库的database,有两个hbase自带的命名空间,一个default 一个hbase,hbase是系统内部的,不要用。
Region
类似于数据库的表,不同的是,Hbase定义表只需要定义列族就可以,不需要声明具体的列,这也意味着hbase的数据量大,能够轻松应对字段变更的场景。
Row
hbase中每行数据都由一个rowkey和多个column(列)组成,数据是按照rowkey的字典顺序存储的,并且查询数据时只能按照rowkey来查,所以rowkey的设计十分重要。
Column
hbase中每个列都由Column Family(列族)和Column Qulifier(列限定符)进行限定,建表时只需指定Column Family即可。
Time Stamp
时间戳,用于标识数据的不同版本。
Cell
由{rowkey,column:column qulifier,time stamp}组成的唯一确定的单元,cell中的数据是没有类型的,都是字节码形式存储。
二、Hbase架构
Master的作用,管理table的增删改查,分配regions到每个RegionServer,监控每个RegionServer的状态。
RegionServer,管理region,region去存储管理数据。
数据库的DDL和DML语言
ddl代表数据定义语言,是一种有助于创建数据库模式的SQL命令。比如create,drop,alter,truncate和rename等
dml代表数据操作语言,是一种有助于检索和管理关系数据库中数据的SQL命令。比如:insert,update,delete和select等等。
高级架构
与mysql的binlog相似,hbase也有hlog
hbase读比写慢(与常见的数据库不同)
写操作
通过事务保证一致性。
把回滚的判断写到finally里面,以此来保证一定会执行判断是否成功写入。
hive也支持更新操作,但是更新起来特别的慢,所以几乎从来不会用到。hbase和hive是相似的。
Shell操作
主要就是DDL(操作表) 和 DML(操作数据)
三、Hbase API
添加依赖:
org.apache.hbase
hbase-client
hbase-server
admin
判断表是否存在
// 1.判断表是否存在
public static boolean isTableExist(String tableName) throws IOException {
// 1.获取配置文件
HBaseConfiguration hBaseConfiguration = new HBaseConfiguration();
hBaseConfiguration.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");
// 2.获取管理员对象
HBaseAdmin admin = new HBaseAdmin(hBaseConfiguration);
boolean tableExists = admin.tableExists(tableName);
return tableExists;
}
上面这种已过时,但是功能也还可以
通过admin对象能够进行表的增删改查:表是否存在,删除表,增加列,等等
// 1.判断表是否存在(新)
public static boolean isTableExist(String tableName) throws IOException {
// 1.获取配置文件
Configuration hBaseConfiguration = HBaseConfiguration.create();
hBaseConfiguration.set("hbase.zookeeper.quorum", "hadoop102,hadoop103,hadoop104");
// 2.获取管理员对象
HBaseAdmin admin = new HBaseAdmin(hBaseConfiguration);
boolean tableExists = admin.tableExists(tableName);
return tableExists;
}
这种是未过时的。但是功能都是一样的。
删除表
// 删除表
public static void dropTable(String tableName) throws IOException {
// 1.判断表是否存在
if (isTableExist(tableName)){
System.out.println("该表已存在");
return;
}
// 2.使表下线
admin.disableTable(tableName);
// 3.删除表
admin.deleteTable(tableName);
}
创建表
// 创建表
public static void creatTable(String tableName, String ... cfs) throws IOException {
// 1.判断是否存在列族信息
if (cfs == null || cfs.length <= 0){
System.out.println("请设置列族信息");
return;
}
// 2.判断表是否存在
if (isTableExist(tableName)){
System.out.println("该表已存在");
return;
}
// 3.创建表描述器
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
// 4.循环添加列族信息
for(String cf : cfs){
// 5.创建列族描述器
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(cf);
// 6.添加具体的列族信息
hTableDescriptor.addFamily(hColumnDescriptor);
}
// 7.创建表
admin.createTable(hTableDescriptor);
}