NoSQL综述及Apache HBase基础
一.HBase
1.HBase概述
- HBase是一个领先的NoSQL数据库
是一个面向列存储的数据库
是一个分布式hash map
基于Google Big Table论文
使用HDFS作为存储并利用其可靠性 - HBase特点
数据访问速度快,响应时间约2-20毫秒
支持随机读写,每个节点20k~100k+ ops/s
可扩展性,可扩展到20,000+节点
2.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版本 |
3.HBase应用场景
3.1增量数据-时间序列数据
高容量,高速写入
3.2信息交换-消息传递
高容量,高速读写
3.3内容服务-Web后端应用程序
高容量,高速读写
3.4HBase应用场景示例
- Facebook
9000 memcached instances,4000 shards mysql
2011全部迁移到HBase - Alibaba
自2010年以来,HBase一直为阿里搜索系统的核心存储
当前规模
3 个集群,每个有1000+ nodes
在Yarn上与Flink共享
每天提供超过10M+ ops/s 的服务
4.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做数据存储
5.HBase物理架构
HBase采用Master/Slave架构
- HMaster
- RegionServer
- Zookeeper
- HBase Client
- Region
5.1 HMaster
HMaster的作用:
- 是HBase集群的主节点,可以配置多个,用来实现HA
- 管理和分配Region
- 负责RegionServer的负载均衡
- 发现失效的RegionServer并重新分配其上的Region
5.2RegionServer
RegionServer负责管理维护Region
- 一个RegionServer包含一个WAL、一个BlockCache (读缓存)和多个Region
- 一个Region包含多个存储区,每个存储区对应一个列族
- 一个存储区由多个StoreFile和MemStore组成(MemStore内存)
- 一个StoreFile对应于一个HFile和一个列族
- HFile和WAL作为序列文件保存在HDFS上
- Client与RegionServer交互
功能:
-
负责管理HBase的实际数据
-
处理分配给它的Region
-
刷新缓存到HDFS
-
维护HLog
-
执行Compaction
-
负责处理Region分片
5.3Region和Table
- 单个Table(表)被分区成大小大致相同的Region
- Region是HBase集群分布数据的最小单位
- Region被分配给集群中的RegionServer
- 一个Region只能分配给一个RegionServer
HRegion
HBase使用表(table)存储数据集,表由行和列组成,这与关系型数据库类似。但是在HBase,当表的大小超过设定值时,HBase会自动将表划分为不同的区域(Region),每个区域成为HRegion,它是HBase集群上分布式存储和负载均衡的最小单位,在这一点上,表和HRegion类似于HDFS中文件和文件块的概念。一个HRgion中保存一个表中一段连续的数据,通过表名和主键范围(开始主键~结束主键)来区分每一个HRgion。
6.HBase逻辑架构 - Row
- Rowkey(行键)是唯一的并已排序
- Schema可以定义何时插入记录
- 每个Row都可以定义自己的列,即使其他Row不使用
相关列定义为列族 - 使用唯一时间戳维护多个Row版本
在不同版本中值类型可以不同 - HBase数据全部以字节存储
7.HBase数据管理
- 数据管理目录
系统目录表hbase:meta
存储元数据等
HDFS目录中的文件
Servers上的region实例 - HBase数据在HDFS上
可以通过HDFS进行修复File
修复路径:
RegionServer->Table->Region->RowKey->列族
8.HBase架构特点
- 强一致性
- 自动扩展
当Region变大会自动分割
使用HDFS扩展数据并管理空间 - 写恢复
使用WAL(Write Ahead Log) - 与Hadoop集成
9.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 | assign, 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 Shell命令 | 功能描述 |
---|---|
list | 列出HBase中的所有表 |
create | 创建一张表 |
describe | 列出表的详细信息 |
alter | 修改表的列族 |
disable | 禁用表,使表无效 |
enable | 启用表,使表有效 |
drop | 删除表 |
exists | 判断表是否存在 |
count | 统计表中行的数量,一个行键为一行 |
delete | 删除指定对象的值 |
deleteall | 删除指定行所有元素值 |
get | 获取行或者单元的值 |
incr | 增加指定表,行或列或值 |
put | 向指定的表单元添加值 |
tools | 列出HBase所支持的工具 |
scan | 通过·对表的扫描来获取对应的值 |
status | 返回HBase集群的·状态信息 |
shutdown | 关闭HBase集群· |
truncate | 重新创建指定表 |
version | HBase的版本信息 |
9.1创建表:create
语法:
create '表名称','列名称1','列名称2',...,'列名称N'
--创建表
create 'customer', {NAME=>'addr'}, {NAME=>'order'}
9. 2查看所有表:list,describe
语法:
list
列出表的详细信息
desc '表名'
--查看表
list
--列出表的详细信息
desc 'customer'
9.3添加数据:put
语法:
put '表名称' ,'行建','列建','值'
--插入数据
put 'customer','2','addr:address','zhenjiang'
9.4扫描表:scan
scan用于全表扫描
scan '表名称',{COLUMN=>['列族名1','列族名2'...],参数名=>参数值...}
hbase(main):103:0> scan 'customer'
ROW COLUMN+CELL
1001 column=addr:address, timestamp=1600937534433, value=ahha
2 column=addr:address, timestamp=1600927647563, value=baohua
jsmith column=addr:city, timestamp=1600925557395, value=montreal
3 row(s) in 0.0110 seconds
hbase(main):007:0> scan 'customer',{LIMIT=>1}
ROW COLUMN+CELL
2 column=addr:address, timestamp=1600927553710, value=baohua
1 row(s) in 0.0140 seconds
hbase(main):008:0> scan 'customer',{COLUMNS=>'addr:city'}
ROW COLUMN+CELL
jsmith column=addr:city, timestamp=1600925557395, value=montreal
1 row(s) in 0.0090 seconds
9.5获取数据:get
get用于获取行的所有单元或者某个指定的单元
get '表名称','行键',{COLUMN=>['列族名1','列族名2'...],参数名=>参数值...}
get '表名称','行键',{COLUMN=>['列键1','列键2'...],参数名=>参数值...}
--获取数据
hbase(main):095:0> get 'customer','2',{COLUMN=>'addr:address'}
COLUMN CELL
addr:address timestamp=1600927647563, value=baohua
1 hbase(main):097:0> get 'customer','1001','addr:address'
COLUMN CELL
addr:address timestamp=1600937534433, value=ahha
1 row(s) in 0.0120 seconds
(s) in 0.0070 seconds
--修改版本
alter 'customer',NAME=>'ORDER',VERSION=>5
--
9.6删除数据:delete
delete '表名称','行键','列键'
deleteall '表名称','行键'
9.7修改表:alter
使用alter可为表增加或者修改列族
alter '表名称',参数名=>参数值,...
hbase(main):100:0> alter 'customer',NAME=>'ORDER',VERSION=>5
Unknown argument ignored for column family ORDER: 1.8.7
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 1.9050 seconds
9.8删除表drop
HBase表分为两个状态:ENABLED 和DISABLED
--使用disable将表置为不可用状态
disable 'customer'
--使用enable将表置为可用状态
enable 'customer'
当表ENABLED状态时,会被禁止删除。所有需要先将表置为DISABLED状态才能删除
disable 'customer'
--删除
drop 'customer'
用户权限:
user_permission ['表名' ...]
grant '用户名','RWXCA'
表:
增:create '表名',{NAME=>'列簇名'},{NAME=>'列簇名'}...
删:disable '表名' ————> drop '表名'
改:snapshot '表名','镜像名'
clone_snapshot '镜像名','新表名'
delete_snapshot '镜像名'
查:list
行:put的时候:put '表名','行键','列簇名:列名','值'[,时间戳]
可以单独删行,行内数据全部删除
列簇:
增:alter '表名',NAME=>'列簇名'
删:...... ,METHOD='delete'
改:先加,后删
查:get '表名','行键','列簇名'
列:
cell:值+时间戳
获取用户权限需要改配置文件
<property>
<name>hbase.security.authrization</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>