Hbase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。
就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。
HBase是Apache的Hadoop项目的子项目。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
另一个不同的是HBase基于列的而不是基于行的模式。
本文章主要介绍 Hbase 和 在centos环境下如何安装 。
Quick Guide
Hbase架构
- Zookeeper,作为分布式的协调。RegionServer也会把自己的信息写到ZooKeeper中。
- HDFS是Hbase运行的底层文件系统
- RegionServer,理解为数据节点,存储数据的。
- Master RegionServer要实时的向Master报告信息。Master知道全局的RegionServer运行情况,可以控制RegionServer的故障转移和Region的切分。
Hbase数据模型
HBase 是一个稀疏的、分布式、持久、多维、排序的映射,它以行键(row key),列键(column key)和时间戳(timestamp)为索引。有以下特点:
- Table:Hbase的table由多个行组成
- Row:一个行在Hbase中由一个或多个有值的列组成。Row按照字母进行排序,因此行健的设计非常重要。这种设计方式可以让有关系的行非常的近,通常行健的设计是网站的域名反转,比如(org.apache.www, org.apache.mail, org.apache.jira),这样的话所有的Apache的域名就很接近。
- Column:列由列簇加上列的标识组成,一般是“列簇:列标识”,创建表的时候不用指定列标识
- Column Family:列簇在物理上包含了许多的列与列的值,每个列簇都有一些存储的属性可配置。例如是否使用缓存,压缩类型,存储版本数等。在表中,每一行都有相同的列簇,尽管有些列簇什么东西也没有存。
- Column Qualifier:列簇的限定词,理解为列的唯一标识。但是列标识是可以改变的,因此每一行可能有不同的列标识
- Cell:Cell是由row,column family,column qualifier包含时间戳与值组成的,一般表达某个值的版本
- Timestamp:时间戳一般写在value的旁边,代表某个值的版本号,默认的时间戳是你写入数据的那一刻,但是你也可以在写入数据的时候指定不同的时间戳
Hbase与关系型数据库对比
属性 | Hbase | RDBMS |
---|---|---|
数据类型 | 只有字符串 | 丰富的数据类型 |
数据操作 | 增删改查,不支持join | 各种各样的函数与表连接 |
存储模式 | 基于列式存储 | 基于表结构和行式存储 |
数据保护 | 更新后仍然保留旧版本 | 替换 |
可伸缩性 | 轻易增加节点 | 需要中间层,牺牲性能 |
Hbase安装部署
0.前置条件
- java
- hadoop
- zookeeper
1.下载安装包
1 | cd /hadoop/software |
- 2.解压
1 | tar -zxvf hbase-2.0.5-bin.tar.gz -C /hadoop/install |
- 3.把hadoop的hdfs-site.xml和core-site.xml 放到hbase/conf下
1 | cd /hadoop/install/hadoop/etc/hadoop |
4.修改hbase配置文件
1.修改hbase-env.sh
1
2
3
4
5
6
7cd /hadoop/install/hbase-2.0.5/conf/
vi hbase-env.sh
# 配置内容
export JAVA_HOME=/hadoop/install/jdk1.8.0_141
export HBASE_MANAGES_ZK=false
export HBASE_HEAPSIZE=8G2.修改hbase-site.xml
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
34
35
36
37<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://master:9000/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>master,node1,node2,node3</value>
</property>
<!-- zookerper日志 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/hadoop/install/hadoop/zookeeper-3.4.12</value>
</property>
<!-- todo -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<!-- hbase master web界面绑定端口 -->
<property>
<name>hbase.master.info.port</name>
<value>16010</value>
</property>
<!-- regionserver 信息 web界面接口 -->
<property>
<name>hbase.regionserver.info.port</name>
<value>16030</value>
</property>
</configuration>3.修改regionservers文件,从节点的主机名
1
2
3
4master
node01
node02
node03
5.将配置好的HBase拷贝到cd 其他机器里
1 | cd /hadoop/install |
- 6.配置环境变量
1 | cd /home/hadoop/.bashrc |
- 7.master启动hbase
1 | start-hbase.sh |
- 8.使用jps查看:都有HRegionServer,master多个HMaster
- 9.通过网页查看启动是否正常:打开浏览器,访问http://192.168.52.100:16010/,检查hbase是否正常
Hbase基本命令
hbase shell命令 | 描述 |
---|---|
alter | 修改列族(column family)模式 |
count | 统计表中行的数量 |
create | 创建表 |
describe | 显示表相关的详细信息 |
delete | 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值) |
deleteall | 删除指定行的所有元素值 |
disable | 使表无效 |
drop | 删除表 |
enable | 使表有效 |
exists | 测试表是否存在 |
exit | 退出hbase shell |
get | 获取行或单元(cell)的值 |
incr | 增加指定表,行或列的值 |
list | 列出hbase中存在的所有表 |
put | 向指向的表单元添加值 |
tools | 列出hbase所支持的工具 |
scan | 通过对表的扫描来获取对用的值 |
status | 返回hbase集群的状态信息 |
shutdown | 关闭hbase集群(与exit不同) |
truncate | 重新创建指定表 |
version | 返回hbase版本信息 |
1. 进入hbase
1 | ./hbase shell |
- 参数说明
- 进入到hbase目录并进入hbase
2. 浏览所有表
1 | list |
- 参数说明
- 查看表列表
3. 查看表结构
1 | describe 'BizvaneV2.VipSearch' |
- 参数说明
- describe 动作命令,BizvaneV2.VipSearch 为要查看表结构的表名
4. 创建表
1 | create 'UserInfo', { NAME => 'info', REPLICATION_SCOPE => '1' } |
- 参数说明
- create 动作命令,UserInfo 为要创建的表名
- NAME 列族名,info 为列族名称
- REPLICATION_SCOPE 是否复制,0为不复制,1为复制
5. 修改表结构
1 | disable 'UserInfo' |
参数说明
- 修改表结构要使表不启用状态
- disable 动作命令,使要修改结构的表无效,UserInfo 为表名
- 修改命令
- alter 动作命令
- UserInfo 要修改的表名称
- {NAME => ‘extendInfo’, REPLICATION_SCOPE => ‘1’} 要修改的结构体
- describe 动作命令,查看表结构描述,验证是否修改成功
6. 添加数据
1 | put 'UserInfo','row_1','info:firstname','liu' |
- 参数说明
- 添加命令
- put 动作命令,
- UserInfo 要添加数据的表名称
- row_1 数据行
- info:firstname 列及列名字
- liu 要添加的值
- 添加命令
7. 查看数据
1 | scan 'UserInfo' |
- 参数说明
- scan 动作命令
- 要查看表的名称
- scan 动作命令
8. 修改数据
1 | put 'UserInfo','row_1','info:firstname','liu_copy' |
- 参数说明
- 添加命令
- put 动作命令,
- UserInfo 要修改数据的表名称
- row_1 数据行
- info:firstname 列及列名字
- liu 新数据值
- 添加命令
9. 删除数据
1 | delete 'UserInfo','row_1','info:firstname'参数说明 |
- 删除命令
- delete 动作命令,
- UserInfo 要修改数据的表名称
- row_1 数据行
- info:firstname 列及列名字
- 删除命令
10. 删除表
1 | disable 'UserInfo' |
参数说明
- 修改表结构要使表不启用状态
- 删除命令
- disable 使表不启用,UserInfo 要不启用的表名称
- drop 删除命令 UserInfo 要删除的表名称
11. 帮助
1 | help |
- 参数说明
- help 帮助命令,可以查看Hbase提供的命令清单
More info: Hbase