问题产生及解决:
HDFS存文件,MapReduce处理数据,处理数据中间会有传输延迟,所以要在HDFS和MapReduce中间创建一个数据库用来存数据,这个数据库就是HBase。
HBase是基于HDFS的数据库。
一、为什么学习HBase
需要实时随机访问超大规模数据集的场景
针对分布式计算而设计的NoSQL
与Hadoop紧密结合
二、HBase的简介
基于Google的BigTable论文的理论基础
基于列存储的NoSQL数据库 基于HDFS的分布式存储 本质上只有插入操作 高可靠性、可扩展性
三、HBase体系结构
Master/Slaves的主从服务器结构
HMaster服务器+多个HRegionServer服务器
Hbase体系结构解析:
四、HBase数据模型
典型的关系表存在的问题
如果现在新加一门课程,能够在不修改表结构的情况下去保存新的课程成绩吗? 如果某同学数学课程参加了补考,那么两次的考试成绩都能够保存下来吗? 如果某同学只考试了一门课程而其它课程都没有成绩,是否我们可以只保存有成绩的课程而节省存储空 间呢
HBase中的概念视图
用Excel表格来表示:
HBase特点
- 大:一个表可以有上百万行,上亿行
- 面向列:面向列(族)的储存和权限控制,列(族)独立检索
- 稀疏:对于为空(null)的列,并不占用储存空间,因此,表可以设计的非常稀疏
- 列储存
- 可伸缩
- 时间戳
- 不可修改数据
HBase与关系型数据库的比较
数据类型
HBase只有字符串类型
数据操作
HBase没有修改操作,表和表之间相互分离
存储模式
HBase基于列存储,关系型数据库基于行存储
数据维护
HBase的更新实际是插入新的数据
可伸缩性
HBase很容易靠增加硬件满足系统需要
五、HBase环境部署(下载安装配置)
1、软件下载
http://archive.cloudera.com/cdh5/cdh/5/hbase-1.2.0-cdh5.7.0.tar.gz
2、解压HBase到app目录下
(如果没有目录可以自己新建,也可以参照我的配置
Hadoop安装流程&使用CDH版的Hadoop搭建HDFS环境)
[hadoop@hadoop000 ~]$cd software/
[hadoop@hadoop000 software]$ tar zxvf hbase-1.2.0-cdh5.7.0.tar.gz -C ~/app/
[hadoop@hadoop000 software]$ cd ../app/hbase-1.2.0-cdh5.7.0/
重要的目录
[hadoop@hadoop000 hbase-1.2.0-cdh5.7.0]$ tree -L 2
3、配置HBase
(1)hbase-env.sh
[hadoop@hadoop000 conf]$ vim hbase-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_251
HBASE_MANAGES_ZK=false
(2)hbase-site.xml
<configuration>
<!-- hbase.rootdir指的是hbase的存储目录,它的值必须与core-site.xml中fs.defaultFS的值 保持一致-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop000:9000/hbase</value>
</property>
<!-- hbase运行模式:true表示分布式,false表示单机模式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- ZK节点的主机名和端口,如果有多个,使用逗号分隔-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop000:2181</value>
</property>
</configuration>
(3)regionservers
hadoop000是主机名
[hadoop@hadoop000 conf]$ vim regionservers
hadoop000
(4)导出HBase环境变量
[hadoop@hadoop000 conf]$ vim ~/.bash_profile
hbase_home=/home/hadoop/app/hbase-1.2.0-cdh5.7.0
export PATH=$PATH:$hbase_home/bin
export PATH
[hadoop@hadoop000 conf]$ source ~/.bash_profile
[hadoop@hadoop000 conf]$ echo $hbase_home
/home/hadoop/app/hbase-1.2.0-cdh5.7.0
六、hbase的启动
未启动之前查看jps:
[hadoop@hadoop000 ~]$ jps
8027 Jps
1.启动hadoop(dfs和yarn)
一起启动dfs和yarn:start-all.sh
分别启动也可以:
start-dfs.sh
start-yarn.sh
[hadoop@hadoop000 ~]$ jps (6个节点)
8935 DataNode
9607 NodeManager
9496 ResourceManager
8745 NameNode
10314 Jps
9227 SecondaryNameNode
2.启动zookeeper
zookeeper的安装配置参考我的另一篇CSDN:
zkServer.sh start
[hadoop@hadoop000 ~]$ jps (7个节点,多了QuorumPeerMain)
8935 DataNode
9607 NodeManager
9496 ResourceManager
8745 NameNode
12121 QuorumPeerMain
9227 SecondaryNameNode
12348 Jps
3.启动hbase
start-hbase.sh
[hadoop@hadoop000 ~]$ jps (9个节点,多了HMaster和HRegionServer)
17009 HMaster
17188 HRegionServer
8935 DataNode
9607 NodeManager
9496 ResourceManager
8745 NameNode
12121 QuorumPeerMain
18042 Jps
9227 SecondaryNameNode
4.hbase浏览器模式 http://192.168.1.14:60010/
5. 关的时候倒着来:
关闭hbase:
stop-hbase.sh
关闭zk:
zkServer.sh stop
关闭dfs和yarn:
stop-all.sh
七、使用HBase
1.HDFS上HBase的文件
[hadoop@hadoop000 hbase-1.2.0-cdh5.7.0]$ hadoop dfs -ls /hbase
在浏览器查看内容如下:
2.HBase Shell
(1)HBase Shell帮助命令
[hadoop@hadoop000 hbase-1.2.0-cdh5.7.0]$ hbase
(2)启动HBase Shell
[hadoop@hadoop000 hbase-1.2.0-cdh5.7.0]$ hbase shell
3.HBase Shell 常用命令
(1)创建表——create
hbase(main):001:0> create 'scores','grade','course'
0 row(s) in 2.8780 seconds
=> Hbase::Table - scores
(2)查询表——list
hbase(main):002:0> list
TABLE
scores
1 row(s) in 0.0570 seconds => ["scores"]
(3)查看表所有列族的详细信息——describe
hbase(main):003:0> describe 'scores'
(4)插入数据——put
hbase(main):004:0> put 'scores','tom','grade:','1'
0 row(s) in 0.2000 seconds
hbase(main):005:0> put 'scores','tom','course:art','88'
0 row(s) in 0.0490 seconds
hbase(main):006:0> put 'scores','tom','course:math','98'
0 row(s) in 0.0150 seconds
hbase(main):007:0> put 'scores','jason','grade:','2'
0 row(s) in 0.0180 seconds
hbase(main):008:0> put 'scores','jason','course:art','90'
0 row(s) in 0.0150 seconds
hbase(main):009:0> put 'scores','jason','course:math','99'
0 row(s) in 0.0080 seconds
(5)扫描表——scan
# 全表扫描
hbase(main):010:0> scan 'scores'
# 按列族扫描
hbase(main):012:0> scan 'scores',{COLUMNS=>'course'}
# 按列键扫描
hbase(main):015:0> scan 'scores',{COLUMNS=>'course:art'}
(6)获取数据——get
# 按行键获取所有单元
hbase(main):017:0> get 'scores','jason'
# 按行键获取指定列键的值
hbase(main):018:0> get 'scores','jason',{COLUMN=>'course:art'}
(7)删除数据——delete/deleteall
# delete只能删除一个单元
hbase(main):019:0> delete 'scores','jason','course:art'
# deleteall删除一行
hbase(main):021:0> deleteall 'scores','jason'
(8)修改表——alter
使用alter可以为表增加或者修改列族。
参数当中,列族名NAME必须提供,如果已存在则进行修改,否则增加一个新的列族。
# 修改已存在的列族
hbase(main):024:0> alter 'scores',NAME=>'course',VERSIONS => '5'
# 增加新的列族
hbase(main):026:0> alter 'scores',NAME=>'address',VERSIONS => '1'
(9)删除表
表的状态分为两种:DISABLED和ENABLE,分别表示是否可用状态。
注意:要删除表,必须先禁用该表。
#禁用表
hbase(main):029:0> disable 'scores'
#删除表
hbase(main):033:0> drop 'scores'
hadoop的几个网站:
50070