1、 什么是HBASE
- 分布式,面向列的开源数据库
- HBase是Goole BigTable的开源实现
- HBase不同于一般的关系数据库,适合非结构化的数据存储
- 可以支持在线业务
-
2、BigTable
BigTable是Google设计的分布式的数据存储系统,用来处理海量的数据的一种非关系型的数据库
结构化数据
- 适合用二维来展示的数据
- 非结构化数据
- 非结构化数据是数据结构不规则不完整
- 没有预定义的数据模型
- 不方便用数据库二维逻辑来表现
- 办公文档,文本,图片,XML,HTML,各类报表,图像和音频/视频信息等
小结:
- 关系型数据库:行市存储,每一行数据都是连续的所有的记录都放在一个连续的存储空间中
- 列数据库:列式存储,每一列对应一个文件不同列并不对应连续的存储空间
结构化数据 vs 非结构化的数据
HBase是Apach基金会顶级项目
- HBase基于HDFS进行数据存储
- Hbase建立在Hadoop文件系统上,利用了HDFS的容错的能力
- Hbase提供对数据的随机实时读/写访问功能
- Hbase内部使用哈希表,并存储索引,可以快速查询hdfs中的数据
5hive vs hbase区别
- 都可以处理海量数据
- 文件都是保存在hdfs上
- hive和hbase不同
- hbase计算不是mapreduce实现的而自己实现CRUD的功能
- hive通过mapreduce实现数据
- hbase可以有集群,集群的管理是通过ZooKeeper来实现的
- hive只能做离线的计算
- hbase提供对数据的随机实时读/写访问功能
HBASE的使用场景
- 瞬间写入量很大
- 大量数据需要长期保存,且数量会持续增长
- HBase不适合join,多级索引,表关系复杂的数据模型
Hbase存储模型和关系型数据库的存储模型
ACID定义
指数据库事务正确执行的四个基本要锁的缩写
- 原子性 A
- 整个事务中所有的操作,要么全部完成,要不全部不完成,不可能停滞在中间的某个环节,事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像是这个事务从来没有执行过一样。
- 一致性C
- 一个事务可以封装状态改变(除非它是一个只读的),事务必须始终保持系统处于一致的状态,不管在任何给定时间并发事务有多少。
- 隔离性 I
- 隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作,如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一个事务在系统中认为只有该事务在使用系统,这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有以恶搞请求用于同一数据。
- 持久性D
- 在事务完成后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会回滚。
- Hbase
- hbase支持特定场景下的ACID,即对行级别的操作保证完全的ACID
CAP定理
分布式系统的最大难点就是各个节点的状态如何同步,CAP定理是这方面的基本定理,也是理解分布式系统的起点。
- 一致性(所有节点在同一时间具有相同的数据)
- 可用性(保证每个请求不管成功或失败都有响应,但不保证获取的数据的正确性)
- 分区容错性(系统中任意信息的丢失或失败不会影响系统的运行,系统如果不能在某一个时限达成数据一致性,就必须在上面两个操作之间做出选择)
- habse是CAP的CP系统,即hbase是强一致性的
1.2.3 Hbase表结构
- NameSpace:关系型数据的”数据库”(database)
- 表(table):可以有上亿行,上百万行,对于为值为空的列,并不占用存储空间,因此表可以设计的非常的稀疏
- 行(Row):在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识的,行键并没有特定的数据类型,以二进制的字节来存储,Hbase有索引但只是在行键rowkey上面
- 列(column):Hbase的列由column family 和column qulifier组成,由冒号:进行间隔,如 famliy:qualifier
- 行键(RowKey):类似于MySQL中的主键,HBASE根据行键来快速检索数据,一个行对应一条记录,与mysql主键不同的是,hbase的行键是天然固有的,每一行数据都存在行键。
- 列族(columnFamily):是列的集合,列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都是以二进制进形式存在,没有数据类型。在物理存储结构上,每一个表中的每一个列族单独以一个文件存储,一个表可以有多个列簇。
- 列修饰符(Column Qualifier):列族中的数据通过列标识来进行映射,可以理解为一个键值对(key-value),列修饰符(Column Qualifier)就是key对应的关系型数据库的列
- 时间戳(TimeStamp):是列的一个属性,是一个64位的整数。由行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性,可以根据版本(VERSIONS)或时间戳来指定查询历史版本数据,如果都不指定,则默认返回最新版本的数据。
HBASE与传统关系数据库的区别
hbase 关系型数据库
数据库大小 PB级别 GB TB
数据类型 Bytes 丰富的数据类型
事务支持 ACID只支持单个Row级别 全面的ACID支持,对Row和表
索引 只支持Row-Key 支持
吞吐量 百万写入/秒 数千写入/秒
区别:
1、创建HBASE表的时候只需要指定表名和列族
2、每一个行当中,只需要列族相同就可以了,至于每一个列族中的key:value对key可以完全不同。
HBASE的基础架构
1、Client
- 与zookeeper通信,找到数据入口的地址
- 使用hbase rpc机制与HMaster和HRegionServer进行通讯
- Client与HMaster进行管理类操作
- Client与HRegionServer进行数据读写类操作
2、Zookeeper
- 保证HMaster有一个活着
- HRegionServer HMaster 地址存储
- 监控Region Server的状态将Region Sever信息通知HMaster
元数据存储
3、HMaster
可以启动多个HMaster,通过Zookeeper的Master Election机制总有一个Master运行
- 为Region server分配region
- 负责region server的负载均衡
- 发现失效的region server并重新分配其上的region
- HDFS上的垃圾文件回收
- 处理用户对表格的增删改查
4、HRegionServer
- HBASE中最核心的部分,主要负责相应用户I/O请求,向HDFS文件系统中读写数据
- 维护Master分配给他的region,处理对这些region的IO请求
- 负责切分在运行的过程中变得更大的region
- 此外HregionSever管理一系列HRegion对象,每一个HRegion对应Table中的一个Region,Hregion由多个Hstore组成。每一个Hstroe对应Table中一个Column Famliy的存储,ColumnFamily就是一个集中的存储单元,故将其具有相同IO特性的column放在一个column family会更加高效
5、HStore
用户写入数据的流程为:client访问zk,zk返回RegionSever地址-》client访问RegionSever写入数据-》数据存储MemStore,一直到MemStore满-》Fluse成StoreFile
注:每一个column family对应一个HStore
6、HRegion
- 一个表最开始存储的时候是一个region
- 一个region中会有多个store,每一个store用来存储一个列族,如果只有一个column family,就只有一个store
- region会随着插入数据越来越多,会进行拆分,默认是大小10G
7、HLog
在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引起HLog就为了防止这一种情况。
Hbase模块协作
- hbase启动
- HMaster启动,注册到zk,等待regionsever汇报
- regionserver注册到zk,并向hmaster汇报
- 对各个regionserver(包括失效的)数据进行整理,分配region和meta信息
- regionsever失效
- hmaster将失效的regionserver上的region分配到其他的节点
- hmaster更新hbase:meta表以保证数据正常访问
- hmaster失效
- 处于Backup状态其他HMaster节点推选出一个转为Active状态
- 数据能正常的读写,但是不能创建删除表,也不能更改表结构。
基本操作:
名称 | 命令表达式 |
---|---|
创建表 | create ‘表名’,‘列簇名1’,‘列族名2’,‘列族名n’ |
添加记录 | put ‘表名’,‘行名’,‘列名’,‘值’ |
查看记录 | get ‘表名’,‘行名’ |
查看表中的记录总数 | count ‘表名’ |
删除记录 | delete ‘表名’,‘行名’,‘列名’ |
删除一张表 | 第一步 disable ‘表名’ 第二步 drop ‘表名’ |
查看所有记录 | scan “表名称” |
查看指定表指定列多有数据 | scan ‘表名’,{columns=>’列族名:列名’} |
更新记录 | 重写覆盖 |
连接集群
hbase shell
创建表
create 'user','base_info'
删除表
disable 'user'
drop 'user'
创建名称空间
create_namespace 'test'
展示现有名称空间
list_namespace
创建表的时候添加namespace
create 'test:user','base_info'
显示某个名称空间下有哪一些表
list_namespace_table 'test'
查询某一个rowkey的数据
get 'user','rowkey_16'
查询某一个列簇的数据
get 'user','rowkey_16','base_info'
get 'user','rowkey_16','base_info:username'
get 'user','rowkey_16',{COLUMN =>['base_info:username','base_info:sex']}
删除表中的数据
delete 'user','rowkey_16','base_info:username'
清空数据
truncate 'user'
操作列簇
alter 'user',NAME=>'f2'
alter 'user','delete'=>'f2 '
总结:
面向列存储,非关系数据
适合存储非关系型数据库
hbase创建表的过程很简单,只需要指定表名和列族名就可以了
row-key 行键 hbase的索引只在row-key中才有
column family列族 key:value 这里面key又叫column quanlifler
不同行的相同的column family中column quanlifier可以完全不同
组件
- HMaster
- HRegionServer
- HRegion
- Hstore(一个列族对一个store)
- memstore
- storefile
- Hstore(一个列族对一个store)
- HRegion
Hbase回顾
- 面向列,列式存储
- 每一列数据放到同一个文件中,列与列之间的存储位置并不连续
- 数据是一行一行存的,每一行都是连续的
- 非关系型数据NoSQL
- 关系型数据 非关系数据(没有严格的模型的概念)
- 事务
- 行级别事务,不是事务性的数据库
- CAP定理 CP系统(一致性和分区容错性)
- 行键(RowKey),只有rowkey有索引
- 列族(ColumnFamliy)k:v数据库,查询性能类似的k:v放到同一个ColumnFamily中
- 列修饰符(column Qualifier)在ColumnFamily下的Key:value 对的key ColumnFamily:Column Qualifier:value
HBase Shell命令实战
- HBase DDL和DML命令 | 名称 | 命令表达式 | | —- | —- | | 创建表 | create ‘表名’,‘列族名1’,‘列族名2’,‘列族名n’ | | 添加记录 | put ‘表名’,‘行名’,‘列名’,‘值’ | | 查看记录 | get ‘表名’,‘行名’ | | 查看表中的记录总数 | count ‘表名’ | | 删除记录 | delect ‘表名’,‘行名’,‘列名’ | | 删除一张表 | 第一步 disable ‘表名’ 第二步 drop ‘表名’ | | 查看所有记录 | scan ‘表名称’ | | 查看指定表指定列所有数据 | scan ‘表名’,{COLUMNS=>’列族名:列名’} | | 更新记录 | 重写覆盖 |
连接集群
hbase shell
创建表
create 'user','base_info'
删除表
disable 'user'
drop 'user'
创建名称空间
create_namespace 'test'
展现现有的名称空间
list_namespace
创建表的时候添加namespace
create 'test:user','base_info'
显示某一个名称空间下有哪一些表
list_namespace_table 'test'
插入数据
查询表中的所有的数据
scan 'user'
查询某个rowkey的数据
get 'user','rowkey_16'
查询某个列簇的数据
暂时听到这里,后续有时间再继续学习!