Hbase定义----Hadoop Databas
HBase是一个分布式的、面向列的开源数据库,该技术来源于Google论文"Bigtable:一个结构化数据的分布式存储系统"。介于NOSQL和RDBMS之间,仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务(可通过hive支持来实现多表join等复杂操作)。
- 高可靠性、高性能、面向列、可伸缩、实时读写
HBase中的表的特点
- 大:一个表可以有上亿行,上百万列;
- 面向列:面向列(族)的存储和权限控制,列(族)独立检索;
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
HBase中的表的基本概念
- Rowkey - 行键(主键)
- Column family - 列簇
- Timestamp – 时间戳
- Cell - {row key, column(= +), version}唯一确定,无数据类型,全部是字节码形式
HBase中的表的行键
Row Key是用来检索记录的主键,访问hbase table
中的行,有三种方式:
- 通过单个row key访问
- 通过row key的range
- 全表扫描
Row key行键可以是任意字符串(最大长度 64KB,实际应用一般为 10-100bytes),在hbase内部,row key保存为字节数组。存储时,数据按照Rowkey的字典顺序(byte order)排序存储
HBase中的表的列族
-
列族在创建表的时候必须声明,一个列族(ColumnFamily)可以包含多个列(qualifier),列族名尽可能短。
-
列族中的列可以自由定义。列中的数据都是以二进制形式存在,没有数据类型;列名都以列族作为前缀,例如列族courses 的两个列的表示 courses:history/courses:math
HBase中的时间戳
- 时间戳的类型是 64位整型。时间戳可以由hbase(在数据写入时自动 )赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可由客户显式赋值。
- HBase中通过row和columns确定的为一个存贮单元称为cell。每个 cell都保存着同一份数据的多个版本(按倒序排列,读取时最先找到的是最近的版本)。版本通过时间戳来索引
hbase原理
Hbase原理-表的物理存储
Hregion是Hbase中分布式存储和负载均衡的最小单元。最小单元就表示不同的Hregion可以分布在不同的HRegion server上。但一个Hregion是不会拆分到多个server上的。
HRegion虽然是分布式存储的最小单元,但并不是存储的最小单元。HRegion由一个或者多个Store组成,每个store保存一个columns family。每个Strore又由一个memStore和0至多个StoreFile组成。StoreFile以HFile格式保存在HDFS上
hbase 系统架构
client,zookeeper,master,regionserver相互通过心跳机制相同通信。
Client
- 包含访问hbase的接口,client维护着一些cache来加快对hbase的访问,比如region的位置信息。
- client访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问region server),master仅仅维护table和region的元数据信息,负载很低(不参与表数据IO的过程)。
zookeeper
- 保证任何时候,集群中只有一个master;
- 存贮所有Region的寻址入口;
- 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master;
- 存储Hbase的schema,包括有哪些table,每个table有哪些column family
Hmaster
- 管理用户对Table的schema操作(增删改);
- 管理HRegionServer的负载均衡,调整Region分布;
- 在Region Split后,负责新Region的分配;
- 在HRegionServer停机后,负责失效HRegionServer 上的Regions迁移;
- Hmaster可以有多个,但是Active的只有一个,其余负责Backup;当active master宕机时,zookeeper负责从backup master中选举其一作为active master
HRegionServer
- HRegionServer内部管理了一系列HRegion对象;
- 每个HRegion对应了Table中的一个Region;
- HRegion中由多个HStore组成;
- 每个HStore对应了Table中的一个Column Family的存储;
- 一个物理节点机器只能有一个RegionServer;
HRegion
HBase使用RowKey将表水平切割成多个HRegion,每个HRegion都纪录各自的[StartKey和EndKey);Client可以通过HMaster快速的定位每个RowKey在哪个HRegion中。
HStore
- HStore存储是HBase存储核心,由两部分组成:
- MemStore: Sorted Memory Buffer,用户写入的数据首先会放入MemStore
- StoreFiles: 当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile)
- 当StoreFile文件数量增长到一定阈值时,触发合并Compact操作,将多个StoreFiles合并成一个StoreFile,过程中会进行版本合并和数据删除。
- HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的。
写操作
- client向region server提交写请求;
- region server找到目标region;
- region检查数据是否与schema一致;
- 如果客户端没有指定版本,则获取当前系统时间作为数据版本;
- 首先将数据写入WAL log;
- 然后将数据写入MemStore;
- 判断Memstore是否需要flush为Store文件
读操作
位置分析:相同的Cell可能存在的位置:
- 对新写入的Cell,它会存在于MemStore中;
- 对之前已经Flush到HDFS中的Cell,存在于某个或某些
StoreFile(HFile)中; - 对刚读取过的Cell,可能存在于BlockCache中;
执行过程:依次扫描BlockCache、MemStore、StoreFile(HFile),将结果合并即可(Merge Read)
数据紧缩
MemStore每次Flush会创建新的HFile,而过多的HFile会引起读的性能问题,HBase采用Compaction机制来解决这个问题
minor compact
Minor Compaction 是指选取一些小的、相邻的 StoreFile 将他们合并成一个更大的StoreFile,在这个过程中不会处理已经 Deleted 或 Expired 的 Cell。一次 MinorCompaction的结果是更少并且更大的StoreFile
Major Compaction
Major Compaction是指将所有的StoreFile合并成一个StoreFile,在这个过程中,标记为Deleted的Cell会被删除,已经Expired的Cell会被丢弃,已经超过最多版本数的Cell会被丢弃。一次Major Compaction的结果是一个HStore只有一个StoreFile存在。Major Compaction可以手动或自动触发,然而由于它会引起很多的IO操作而引起性能问题,因而它一般会被安排在周末、凌晨等集群比较闲的时间
HBase 与关系型数据库的对比
HBase 有以下特点:
- 数据类型,只有字符串;
- 数据操作,简单操作,无复杂关联、连接操作;
- 存储模式,列存储;
- 数据维护,以插入替代修改删除操作;
- 可伸缩性,可轻松增加或减少硬件数量。
主要区别 - Hbase 适合大量插入同时又有读的情况;
- Hbase 的瓶颈是硬盘传输速度,Oracle 的瓶颈是硬盘寻道时间;
- Hbase 很适合寻找按照时间排序 top n 的场景;
- 索引不同造成行为的差异;
- Oracle 既可以做 OLTP 又可以做 OLAP;
Hbase 的局限 - 只能做简单的 Key value 查询,复杂 sql 统计做不到。
- 只能在 row key 上做快速查询。
HBase shell
HBase 的模式设计
- 列族的数量及列族的势:尽量使用一个列族;列族的数据多少称为势
- 行键(Row Key)设计
- 加盐,给rowkey分配一个随机前缀,加盐之后的rowkey就会根据随机生成的前缀分散到各个region上;
- 哈希,用哈希函数生成前缀加盐,使用确定的哈希可以重构完整的rowkey,可用get操作准确获取某一行数据;
- 反转,反转固定长度或者数字格式的rowkey,使rowkey中经常改变的部分放在前面。如手机号的后四位。这样可有效的随机rowkey,但是牺牲了rowkey的有序性
- 尽量最小化行键和列的大小.尽量使列族名小,最好一个字符
- 版本的数量合适