一、HBase简介
1.1 定义
-- 1. HBase是什么?
1. 分布式
2. 可扩展
3. 支持海量数据的存储
4. NoSQL的数据库。
-- 2. 说明:
a、NoSQL: Not only SQL,不仅仅是一个数据库
b、是基于谷歌的三篇论文之bigtable生成的。
c、HBase:理解为Hadoop base
-- 3. 大数据框架:
a、数据的存储:hdfs / hive / hbase
b、数据的传输:flume / sqoop
c、数据的计算:tez / mr / spark / flink
-- 4. 和传统数据库的差别:
传统数据库的结构:数据库 --> 表 --> 行和列
HBase的结构 : namespace(命名空间) --> table --> 列族 --> 行和列 --> orgion --> store
HBase可以理解为多维的map,嵌套的map结构。
1.2 HBase数据模型
1.2.1 HBase逻辑结构

1.2.2 HBase的物理结构

1.2.3 数据模型
--1. HBase表的几个概念
1. 'namespace':命名空间,类似mysql的数据库,在HBase中默认有两个namespace:default/HBase
2. '列族' :
3. 'column' :列,在使用时,格式为:'列族名:列名'
4. 'row' :行,在HBase中,行是逻辑概念上的,在物理内存中,同一行的数据很可能不在一起的。
"那么我们通过什么参数来判断两个数据是不是属于同一行呢"?
就是下面的rowkey,rowkey相同,就表示是同一行的数据。
5. 'rowKey' :行的标签,唯一定位行的标识
6. 'region' :区域,表示多行数据,在HBase中,一个table默认是一个region
7. 'store' :在同一个region中,列族的个数 = store的个数,store有两种:memstore/storefile
8. 'timeStemp':时间戳,表示数据执行的时间,每执行一次操作就会生成一个版本。
9. 'table' :表,可以理解为多维的map,在创建表的时候,只需要声明表名和列族就可以.
"非常适用于非结构化数据,不需要指定数据的格式"
10. 'cell' : 单元格,在表中的同一个位置'某一行的某一列位置',会有多个cell,相同的位置每修改一次,就会生成一个cell。
由{rowkey,列族:列名,time stamp},进行唯一标识。
-- 2. HBase集群的几个概念
1. 'master':可以理解为hadoop的NM,专门负责管理小弟'regionServer',实现类为:Hmaster
2. 'regionServer':可以理解为hadoop的DM,专门负责管理region中的数据,还有两个组件:WAL'可理解为NM的内存区域的元数
据'和balckcache,至于具体是干嘛的,后面写操作的时候讲,实现类为:HRegionServer
3. 'meta' : 元数据,zookeeper有它的地址,某一个regionServer保存着这个数据。主要有table和region所在的位置。
4. 'zookeeper':① master的高可用 ② RegionServer的监控 ③ Region的元数据管理。
-- 3. 说明:
在底层存储时,数据按照rowkey的字典顺序从小到大进行排列。

二、 HBase的安装
2.1 部署zookeeper和Hadoop
2.2 解压HBase到指定的位置
[atguigu@hadoop105 software]$ tar -zxvf hbase-2.0.5-bin.tar.gz -C /opt/module
2.3 配置环境变量
[atguigu@hadoop105 ~]$ sudo vim /etc/profile.d/my_env.sh
- 添加
#HBASE_HOME
export HBASE_HOME=/opt/module/hbase-2.0.5
export PATH=$PATH:$HBASE_HOME/bin
2.4 配置HBase的文件
- 修改HBase对应的配置文件
#export HBASE_MANAGES_ZK=true
修改至:
export HBASE_MANAGES_ZK=false
- hbase-site.xml增加如下配置内容:
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop105:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop105,hadoop106,hadoop107</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
</configuration>
- 配置regionservers
hadoop105
hadoop106
hadoop107
2.5 分发HBase
[atguigu@hadoop105 module]$ xsync hbase-2.0.5
2.6 启动HBase
先启动hadoop集群,再启动zk,然后启动HBase
- 单点启动
hbase-daemon.sh start master
hbase-daemon.sh start regionserver
-daemon是指后台启动。
- 群起
[atguigu@hadoop105 hbase-2.0.5]$ start-hbase.sh
-- 说明:
a、会启动当前节点的master
b、在所有节点启动regionServer
c、Hmaster和regionServer都是一个进程。
2.7 查看HBase的页面
网址:hadoop105:16010
2.8 master的高可用(可选)
- 关闭HBase的集群
stop-hbase.sh
- 在conf目录下创建backup-masters文件
touch conf/backup-masters
- 在backup-masters文件中配置高可用HMaster节点
echo hadoop106 > conf/backup-masters
- 将整个conf目录scp到其他节点
xsync conf
三、 HBase的操作
3.1 基本操作
- 进入hbase的客户端
[atguigu@hadoop105 conf]$ hbase shell
- 查看所有namespace中所有的表
hbase(main):001:0> list
TABLE
test:user #test是一个namespace
user #没有写命名空间的,则默认是default
2 row(s)
Took 0.4410 seconds
=> ["test:user", "user"]
3.2 表的操作
- 创建表
--1.语法: create 'namespace:tablename','列族1','列族2',...
如果是namespace是default,则可以省略
--2.实例1:hbase(main):002:0> create 'test','info','info1'
实例2:hbase(main):004:0> create 'test:lianzp','info'
- 添加数据
-- 1. 语法: put 'tablename','rowkey','列族1:列名','value'
说明:shell操作每次只能添加一个值
-- 2. 实例: hbase(main):008:0> put 'user','1001','info1:age',20
- 全局扫描数据
-- 1. 语法: scan 'tablename'
-- 2. 实例: hbase(main):009:0> scan 'user'
-- 3. 打印结果:#如下是显示了4行数据,实际上数据在表中属于3行
ROW COLUMN+CELL
1000 column=info2:sex, timestamp=1592894945017, value=woman
1001 column=info1:age, timestamp=1592911858092, value=20
1001 column=info1:name, timestamp=1592894905511, value=lianzp
1003 column=info1:age, timestamp=1592894925226, value=50
- 扫描指定行的数据
-- 1. 语法:scan 'tablename',{
STARTROW=>'rowkey',STOPROW=>'rowkey'}
-- 2. 说明:
a、区间为左闭右开
b、如果STARTROW没有写,则表示开始的rowkey为负无穷,即没有下限,只有上限
如果STOPROW没有写,则表示结束的rowkey为正无穷,即没有上限,只有下限
-- 3. 实例:hbase(main):012:0> scan 'user',{
STARTROW=>'1000',STOPROW=>'1003'}
hbase(main):014:0> scan 'user',{
STARTROW=>'1000'}
hbase(main):015:0> scan 'user',{
STOPROW=>'1001'}
-- 4. 结果:
ROW COLUMN+CELL
1000 column=info2:sex, timestamp=1592894945017, value=woman
1001 column=info1:age, timestamp=1592911858092, value=20
1001 column=info1:name, timestamp=1592894905511, value=lianzp
2 row(s)
- 获取某一行的数据
-- 1. 语法: get 'tablename','rowkey'
-- 2. 实例: get 'user','1001'
- 获取某一行指定列的数据
-- 1. 语法: get 'tablename','rowkey','列族1:列名'
-- 2. 实例: get 'user','1001','info1:age'
- 获取行的数量
-- 1. 语法: count 'tablename'
-- 2. 实例: hbase(main):001:0> count 'user'
- 查询表的结构
-- 1. 语法: describe 'tablename'
-- 2. 实例: hbase(main):002:0> describe 'user'

- 删除某一行某一列的值
-- 1. 语法: delete 'tablename','rowkey','列族1:列名'
-- 2. 实例: hbase(main):002:0> hbase(main):005:0> delete 'user','1001','info1:age'
-- 3. 说明:
a、一个位置默认保留一个版本,如果一个位置被多次修改时,删除当前的数据,再进行查询时,在未flush的情况下,上一个版本的数据
可以被查询出来。
b、此处的删除并不是真正的删除,只是给这个删除的数据打上了一个标记,只有当落盘flush的时候,才会真正的被清理掉。
10 . 删除某一行的全部数据
-- 1. 语法: deleteall 'tablename','rowkey'
-- 2. 实例: hbase(main):020:0> deleteall 'user','1001'
- 清除表数据
-- 1. 语法: truncate 'tablename'
-- 2. 实例:hbase(main):020:0> truncate 'user'
-- 3. 说明:
a、在执行的过程中,首先会自动disable 'user'
b、然后再清空表数据,truncate 'user'
-- 4. 打印结果
Truncating 'user' table (it may take a while):
Disabling table...
Truncating table...
Took 1.5164 seconds
- 删除表
-- 1. 语法: drop 'tablename'
-- 2. 实例: hbase(main):020:0> drop 'user'
-- 3. 说明:
如果直接drop表,会报错:ERROR: Table student is enabled. Disable it first
a、在删除表时,需要手动将表设置为:disable 'tablename'
b、然后再删除,drop 'tablename'
- 多版本
-- 1.设置多版本
alter 'student' ,{
NAME => 'info',VERSIONS => 3}
-- 2.查询多版本
get 'student','1001',{
COLUMN => 'info:age' ,VERSIONS => 3 }
3.3 namespace操作
- 创建namespace
hbase(main):037:0> create_namespace 'lianzp'
- 查询namespace
hbase(main):039:0> list_namespace

最低0.47元/天 解锁文章
3976

被折叠的 条评论
为什么被折叠?



