HBase初识-简单介绍下HBase使用

HBase概念及对比理解

对于我们常使用关系型数据库的来说,我们一般理解数据在数据库中的存储是下面这样子的:

有一张user表,表中数据如下:

id name sex city
1 张三 北京
2 李四 上海

但是对于HBase来说,他的核心是Map,对于常规的Map,我们见到的如下所示:

1
2
3
4
5
6
{
"id":"1",
"name": "张三",
"sex":"男",
"city":"北京"
}

但是对于HBase并不是这样的,HBase有几个概念:Table,Row,Column,Colum Family,Colum Qualifier,Cell,Timestamp

Table:如关系型数据库一样,就是一张表

Row:HBase中的行,由一个行键和多个与之相关联的列组成。其中行键是按照字母进行排序的。

Colum:colum包含colum family和colum qualifier,中间用:分割

Cell:cell包含value和timestamp

上面这些是HBase中一个map中需要包含的,所以hbase中的map如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"1":{
"baseInfo":{
"name":{
2637421:"张三"
}
"sex":{
2637421:"男”
2637425:"女”
}
}
"otherInfo":{
"city":{
2637421"北京"
}
}
}
"2:{
"baseInfo":{
"name":{
2637421:"李四"
}
"sex":{
2637421:"男”
}
}
"otherInfo":{
"city":{
2637421"上海"
}
}
}
}

上面这个Map就展示了HBase中map的结构,其中1和2是表中的row key,baseInfo和otherInfo是colum family 建表时就需要声明好,name,sex和city是colum qulifier,李四,男和上海是value,2637421是timestamp每更新一条数据,老数据会在新数据下面,只是时间戳被更新成最新的

如果搞成比较容易理解的表示方法,如下:

row key cloum family cloum family
name sex city
1 张三 北京
2 李四 上海

HBase使用:

了解了HBase的相关概念,那让我们看一下HBase是如何使用的吧:

安装:

https://hbase.apache.org/book.html#quickstart 安装就对比这个官网这个quickstart进行简单的本地安装就可以了,够我们入门使用了。

命令行使用:

建表

1
create 'user','basicInfo','otherInfo'

其中:user是表名,basicInfo 和 otherInfo是Colum Family,需要注意的是:colum family是在建表时就需要指定的并且是不能修改的。

插入数据

1
2
3
put 'user','1','basicInfo:name','张三'
put 'user','1','basicInfo:sex','男'
put 'user','1','otherInfo:city','北京'

如上表示插入在rowkey为1的数据

获取数据

1
2
3
4
5
6
get 'user','1'

colum cell
basicInfo:name timestamp=1421762485768, value=张三
basicInfo:sex timestamp=1421762485768, value=男
otherInfo:city timestamp=1421762485768, value=北京

看到获取的这个数据是不是发现和上面介绍的概念和结构是一样的

SpringBoot中使用

依赖引入

1
2
3
4
5
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>spring-boot-starter-hbase</artifactId>
<version>${hbase-spring-boot-version}</version>
</dependency>

HBase配置

1
2
3
4
## HBase 配置
spring.data.hbase.quorum=xxx
spring.data.hbase.rootDir=xxx
spring.data.hbase.nodeParent=xxx

使用

我们使用spring为我们提供的HBaseTemplate来进行操作

**插入数据**:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//这里是伪代码
@Autowired
private lateinit val hbaseTemplate:HBaseTemplate;

fun set(key: String,value: User) {
val saveOrUpdates = mutableArrayListof<Mutation>()
// 首先把key转换一下,设置进来
val put = Put(convertKey(key))
// 把对象转换成多个colum的形式,每个Colum包含一个columFamily,qualifier,和value
val colums = convertUserToColums(value)
// 遍历塞进去
for(colum in colums){
put.addColumn(colum.cloumFamily, colum.qualifier, colum.value)
}
saveOrUpdates.add(put)
// 保存
hbaseTemplate.saveOrUpdates("user", saveOrUpdates)
}
**获取数据**:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//这里是伪代码
@Autowired
private lateinit val hbaseTemplate:HBaseTemplate;
fun get(key: String):User {
hbaseTemplate.saveOrUpdates("user",key, UserRowMapper())
}

class UserRowMapper : RowMapper<User> {
private const val COLUMN_FAMILY = "userInfo".getBytes();
private const val NAME = "name".getBytes();
private const val SEX = "sex".getBytes();

override fun mapRow(result: Result, rowNum: Int): User {
val name = result.getValue(COLUMN_FAMILY,NAME).toSting
val sex = result.getValue(COLUMN_FAMILY,SEX).toSting
return User(name,set)
}
}

上面代码只是伪代码,未经过认证,详细使用还要实际使用过程中完善修改。

理解了以上的内容,HBase也算是大致入了个门,以后再有深入的学习,我会再记录下来,有问题的地方希望大家能给留言指出~