HBase的基本概念
- HBase是一个分布式的.面向列的开源数据库
- HBase时Google Big Table的开源实现
- HBase不同于一般的关系数据库,适合非结构化数据存储
Big Table
- Big Tble是Google设计的分布式数据库存储系统,用来处理海量数据的一种非关系型的数据库
- 适合大规模海量数据,PB级数据
- 分布式,并发数据处理,效率极高
- 易于拓展,支持动态伸缩
- 适用于廉价设备
- 不适用传统关系型数据库的存储
面向列的数据库
HBase与传统关系型数据库的区别
HBase | 关系型数据库 | |
---|---|---|
数据库大小 | PB级别 | GB TB |
数据类型 | Bytes | 丰富的数据类型 |
事务支持 | ACID只支持单个Row级别 | 全面的ACID支持, 对Row和表 |
索引 | 只支持Row-key | 支持 |
吞吐量 | 百万写入/秒 | 数千写入/秒 |
-
关系型数据库
-
同样的数据保存到列数据库
-
行数据库 与 列数据库的存储方式比较
什么是非结构化数据存储
- 结构化数据
- 适合用二维表来展示的数据
- 非结构化数据
- 非结构化数据是数据结构不规则或不完整
- 没有预定义的数据模型
- 不方便用数据库二维逻辑来表现
- 办公文档,文本,图片,XML,HTML,各类报表,图像和音频/视频信息等
HBase在Hadoop生态中的地位
-
HBase是Apache基金顶级项目
-
HBase基于HDFS进行数据存储
-
HBase可以存储超大数据并适合用来进行大数据的实时查询
HBase与HDFS
- HBase建立在Hadoop文件系统上,利用了HDFS的容错能力
- HBase提供对数据的随机实时读/写访问能力
- HBase内部使用哈希表,并存储索引,可以快速查找HDFS中数据
HBase使用的场景
- 瞬间写入量很大
- 大量数据需要长期保存,且数量会持续增长
- HBase不适合有join,多级索引,表关系复杂的数据模型
HBase的数据模型
- NameSpace:关系型数据库的"数据库"
- 表(table):用于存储管理数据,具有稀疏的,面向列的特点.HBase中的每一张表,就是所谓的大表(BigTable),可以有上亿行,上百万列.对于值为空的列,并不占用存储空间,因此表可以设计的非常稀疏
- 行(Row):在表里面,每一行代表着一个数据对象,每一行都是以一个行键(Row Key)来进行唯一标识的,行键并没有什么特定的数据类型,以二进制的字节来存储
- 列(Column):HBase的列由Column family 和Column qualifier组成,由冒号:进行行间隔
- 行键(Row Key):类似于MySQL中的主键,HBase根据行键来快速检索数据,一个行键对应一条记录。与MySQL主键不同的是,HBase的行键是天然固有的,每一行数据都存在行键。
- 列族(ColumnFamily):是列的集合。列族在表定义时需要指定,而列在插入数据时动态指定。列中的数据都是以二进制形式存在,没有数据类型。在物理存储结构上,每个表中的每个列族单独以一个文件存储。一个表可以有多个列簇。
- 列修饰符(Column Qualifier) : 列族中的数据通过列标识来进行映射, 可以理解为一个键值对(key-value), 列修饰符(Column Qualifier) 就是key 对应关系型数据库的列
- 时间戳(TimeStamp):是列的一个属性,是一个64位整数。由行键和列确定的单元格,可以存储多个数据,每个数据含有时间戳属性,数据具有版本特性。可根据版本(VERSIONS)或时间戳来指定查询历史版本数据,如果都不指定,则默认返回最新版本的数据。
- 区域(Region):HBase自动把表水平划分成的多个区域,划分的区域随着数据的增大而增多。
- HBase 支持特定场景下的 ACID,即对行级别的 操作保证完全的 ACID
cap定理
-
分布式系统最最大的难点,就是各个节点的状态如何同步.CAP定理是这方面的基本定理,也是理解分布式系统的起点
-
一致性(所有节点在同一时间具有相同的数据)
-
可用性(保证每个请求不管成功或者失败都有响应,但不保证获取的数据的正确性)
-
分区容错性(系统中任意信息的丢失或失败不会影响系统的运行,系统如果不能在某个时限内达成数据一致性,就必须在上面两个操作之间做出选择)
-
HBase架构
-
Client
- 与zookeeper通信,找到数据入口地址
- 使用HBase RPC机制与HMaster和HRegionServer进行通信
- Client与HMaster进行通信进行管理类操作
- Client与HRegionServer进行数据读写类操作
-
Zookeepr
- 保证任何时候,集群中只有一个running master,避免单点问题
- 存储所有Region的寻址入口,包括-ROOT-表地址,HMaster地址
- 实时监控Region Server的状态,将Region server的上线和下线信息,实时通知给Master
- 存储Hbase的schema,包括有哪些table,每个table有哪些column family
-
HMaster
可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行。
- 角色功能:
- ①为Region server分配region;
- ②负责region server的负载均衡;
- ③发现失效的region serve并重新分配其上的region;
- ④HDFS上的垃圾文件回收;
- ⑤处理用户对表的增删改查操作。
- 角色功能:
-
HRegionServer
HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写数据。
作用:
- ①维护Master分配给它的region,处理对这些region的IO请求;
- ②负责切分在运行过程中变得过大的region。
- 此外,HRegionServer管理一系列HRegion对象,每个HRegion对应Table中一个Region,HRegion由多个HStore组成,每个HStore对应Table中一个Column Family的存储,Column Family就是一个集中的存储单元,故将具有相同IO特性的Column放在一个Column Family会更高效。
-
HStore
-
HBase存储的核心,由MemStore和StoreFile组成
-
用户写入数据的流程为:client访问ZK, ZK返回RegionServer地址-> client访问RegionServer写入数据 -> 数据存入MemStore,一直到MemStore满 -> Flush成StoreFile
-
-
HRegion
- 一个表最开始存储的时候,是一个region。
- 一个Region中会有个多个store,每个store用来存储一个列簇。如果只有一个column family,就只有一个store。
- region会随着插入的数据越来越多,会进行拆分。默认大小是10G一个。
-
HLog
- 在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。
HBase模块协作
- HBase启动
- HMaster启动, 注册到Zookeeper, 等待RegionServer汇报
- RegionServer注册到Zookeeper, 并向HMaster汇报
- 对各个RegionServer(包括失效的)的数据进行整理, 分配Region和meta信息
- RegionServer失效
- HMaster将失效RegionServer上的Region分配到其他节点
- HMaster更新hbase: meta 表以保证数据正常访问
- HMaster失效
- 处于Backup状态的其他HMaster节点推选出一个转为Active状态
- 数据能正常读写, 但是不能创建删除表, 也不能更改表结构