HBase基础
HBase概述
HBase是一个领先的NoSQL数据库
- 是一个面向列存储的数据库
- 是一个分布式hash map
- 基于Google Big Table论文
- 使用HDFS作为存储并利用其可靠性
HBase特点
- 数据访问速度快,响应时间约2-20毫秒
- 支持随机读写,每个节点20k~100k+ops/s
- 可扩展性,可扩展到20000+节点
HBase发展历史
时间 | 时间 |
---|---|
2006年 | Google发表了关于Big Table论文 |
2007年 | 第一个版本的HBase和Hadoop0.15.0一起发布 |
2008年 | HBase作为Hadoop的子项目 |
2010年 | HBase称为Apache顶级项目 |
2011年 | Cloudera基于HBase0.90.1推出CDH3 |
2012年 | HBase发布了0.94版本 |
2013-2014年 | HBase先后发布了0.96版本/0.98版本 |
2015-2016年 | HBase先后发布了1.0版本、1.1版本和1.2.4版本 |
2017年 | HBase发布1.3版本 |
2018年 | HBase先后发布了1.4版本和2.0版本 |
HBase用户群体
HBase应用场景(一)
增量数据-时间序列数据
- 高容量,高速写入
HBase应用场景(二)
信息交换-消息传递
- 高容量,高速读写
HBase应用场景(三)
内容服务-Web后端应用程序
- 高容量,高速读写
HBase应用场景示例
- 9000 memcached instances,4000 shards mysql
Alibab
-
自2010年以来,HBase一直为阿里搜索系统的核心存储
-
当前规模(到2018为止)
3个集群,每个有1000+ nodes 在Yarn上与Flink共享 每天提供超过10M+ops/s的服务
Apache HBase生态圈
HBase生态圈技术
- Lily-基于HBase的CRM
- OpenTSDB-HBase面向时间序列数据管理
- Kylin-HBase上的OLAP
- Phoenix-SQL操作HBase工具
- Splice Machine-基于HBase的OLTP
- Apache Tephra-HBase事务支持
- TiDB-分布式SQL DB
- Apache Omid-优化事务管理
- Yarn application timeline server v.2迁移到HBase
- Hive metadata存储可以迁移到HBase
- Ambari Metrics Server将使用HBase做数据存储
HBase物理架构
概述
HBase采用Master/Slave架构
- HMaster
- RegionServer
- Zookeeper
- HBase Client
- Region
HMaster
HMaster的作用
- 是HBase集群的主节点,可以配置多个,用来实现HA
- 管理和分配Region
- 负责RegionServer的负载均衡
- 发现失效的RegionServer并重新分配其上的Region
RegionServer
RegionServer负责管理维护Region
- 一个RegionServer包含一个WAL、一个BlockCache(读缓存)和多个Region
- 一个Region包含多个存储区,每个存储区对应一个列簇
- 一个存储区由多个StoreFile和MemStore组成
- 一个StoreFile对应于一个HFile和一个列簇
- HFile和WAL作为序列文件保存在HDFS上
- Client与RegionServer交互
Region和Table
- 单个Table(表)被分区成大小大致相同的Region
- Region是HBase集群分别数据的最小单位
- Region被分配给集群中的RegionServer
- 一个Region只能分配给一个RegionServer
HBase逻辑架构-Row
Rowkey(行键)是唯一的并已排序
Schema可以定义何时插入记录
每个Row都可以定义自己的列,即使其他Row不使用
- 相关列定义为列簇
使用唯一时间戳维护多个Row版本
- 在不同版本中值类型可以不同
HBase数据全部以字节存储
HBase数据管理
数据管理目录
-
系统目录表hbase:meta
存储元数据等
-
HDFS目录中的文件
-
Servers上的region实实例
HBase数据在HDFS上
-
可以通过HDFS进行修复File
-
修复路径
RegionServer->Table->Region->RowKey->列簇
HBase架构特点
强一致性
自动扩展
- 当Region变大会自动分割
- 使用HDFS扩展数据并管理空间
写恢复
- 使用WAL(Write Ahead Log)
与Hadoop集成
HBase Shell
HBase Shell是一种操作HBase的交互模式
- 支持完整的HBase命令集
命令类别 | 命令 |
---|---|
General | version, status, whoami, help |
DDL | alter, create, describe, disable, drop, enable, exists, is_disabled, is_enabled, list |
DML | count, delete, deleteall, get, get_counter, incr, put, scan, truncate |
Tools | ssign, balance_switch, balancer, close_region, compact, flush, major_compact, move, split, unassign, zk_dump |
Replication | add_peer, disable_peer, enable_peer, remove_peer, start_replication, stop_replication |
HBase服务启动
- 启动hadoop
[root@hadoop100 ~]# start-all.sh
[root@hadoop100 ~]# jps
- 启动master
[root@hadoop100 ~]# hhbase-daemon.sh start master
- 启动hbase shell
[root@hadoop100 ~]# hbase shell
HBase操作
- 查看版本
version
- 查看集群状态
status
- 查看当前用户以及分组
whoami
- 查看帮助
help
- 查看HBase所有的表
list
list相当于mysql中的show tables
- 创建一个表
create 'customer',{NAME=>'addr'},{NAME=>'order'}
- 列出表的详细信息
desc 'customer'
- 添加数据
put 'customer','1','addr:city','montoreal'
- 获取数据
get 'customer','1'
- 添加数据并查看
put 'customer','1','addr:address','210021 xiaohang road'
get 'customer','1'
在同一个列名中写入不同的值
put 'customer','1','addr:city','nanjing'
get 'customer','1'
数据被覆盖了
- 修改列簇名并查看表详情
disable 'customer'
alter 'customer',{NAME=>'sample'},{NAME=>'order',METHOD=>delete'}
desc 'customer'
一定用先禁用表:disable
- 添加数据加上时间戳并查看
enable 'customer'
put 'customer','1','addr:city','xuzhou',1600920903023
get 'customer','1','addr:city'
注意:如果添加数据为同一列名的,时间戳在已有的数据时间戳后的将覆盖掉数据,否则不会
- 查看记录
#查看所有记录
scan 'customer'
#查看列名为city的数据
scan 'customer',{COLUMNS=>'addr:city'}
#查看前一条数据
scan 'customer',{LIMIT=>1}
- 统计表记录数
put 'customer','2','addr:city','zhenjiang'
put 'customer','2','addr:address','baohua'
scan 'customer'
count 'customer'
- 删除行键再统计表记录数
delete 'customer','2'
count 'customer'
- 添加列簇
alter 'customer',NAME=>'name'
- 删除列簇
alter 'customer',NAME=>'sample',METHOD=>'delete'
- 修改表名并查看
snapshot 'customer','temp'
clone_snapshot 'temp','cust'
delete_snapshot 'temp'
desc 'cust'
HBase基本命令总结
用户权限:
user_permisooion ['表名'...]
grant '用户名', 'RWXCA'
表:
增:create '表名',{NAME=>'列簇名'},{NAME=>'列簇名'}...
删:disable '表名' ----> drop '表名'
改:snapshot '表名','镜像名'
clone_snapshot '镜像名','新表名'
查:list
行:put的时候:put '表名','行键','列簇名:列名','值'[,时间戳]
可以单独删除行,行内数据全部删除
列簇:
增:alter '表名',NAME=>'列簇名'
删alter '表名',NAME=>'列簇名',METHOD='delete'
改:先加,后删
查:get '表名','行键','列簇名'
列:
cell:值+时间戳
HBase导入文件
将文档数据导入HBase
##通过hbase shell导入文档数据
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.separator=, \
-Dimporttsv.columns="HBASE_ROW_KEY,order:numb,order:date" \
customer file:///home/vagrant/hbase_import_data.csv
示例
- 先把emp_basic.csv文件放入家目录下
- 上传到hdfs上
[root@hadoop100 ~]# hdfs dfs -put /root/emp_basic.csv /test/
- 创建表
create 'emp_basic',{NAME=>'emp'},{NAME=>'time'}
- 通过hbase导入文件
[root@hadoop100 ~]# hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.separator="," \
-Dimporttsv.columns="HBASE_ROW_KEY, \
emp:name,emp:job_title,emp:company,time:sDate,time:eDate" \
"emp_basic" /test/emp_basic.csv
反斜杠\代表换行的意思,如放一行写入,则不需要加反斜杠
- 查询数据
get 'emp_basic','emp_id'
修改表权限
- 配置hbase-site.xml
[root@hadoop100 ~]# vi /opt/hbase/conf/hbase-site.xml
- 输入
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController</value>
</property>
<property>
<name>hbase.superuser</name>
<value>root</value>
</property>
- 保存退出
- 重启hbase master
[root@hadoop100 ~]# hbase-daemon.sh restart master
- 再次进入hbase shell
[root@hadoop100 ~]# hbase shell
- 赋权
disable 'customer'
grant 'root', 'RWXCA'
R - 代表读取权限
W - 代表写权限
X - 代表执行权限
C - 代表创建权限
A - 代表管理权限
- 查看表的权限
user_permission 'customer'
- 撤销用户访问表的权限
revoke 'customer'
慎用