【大数据架构综述】数据存储篇之Hbase
Hbase
一、Hbase是什么
Hbase是一个开源的Nosql数据库,参考google的BigTable建模,使用Java语言实现,运行在HDFS文件系统上,为Hadoop提供类似BigTable的服务。Apache Hbase
最初是Powerset
公司为了处理自然语言搜索产生的海量数据而开展的项目。
它可以存储海量稀疏的数据,并且具备一定的容错性、高可靠性及伸缩性。且具备Nosql数据库的特点:
-
不支持SQL的跨行事务; -
不满足完整性约束条件; -
灵活的数据模型。
二、Hbase特性
1. 容量巨大
在限定某个列的情况下对于单表存储百亿或更多的数据都没有性能问题,且自身能够周期性地将较小文件合并成大文件以减少对磁盘的访问。
2. 列存储
3. 稀疏性
对于空(null
)的列,并不占用存储空间,因此表可以设计的非常稀疏。
4. 扩展性
-
纵向扩展:不断优化主服务器的性能,提高存储空间和性能; -
横向扩展:不断向集群添加服务器来提供存储空间。 Hbase在理论上是无限横向扩展的。
5. 高可靠性
-
基于HDFS的多副本机制; -
WAL( Write - Ahead - Log
)预写机制; -
Replication
机制
三、Hbase数据模型
-
表( table
):Hbase采用表来组织数据; -
行( row
):每个表都有行组成,每个行由行键(row key
)来标识, 行键可以是任意字符串; -
列族( column family
):一个table有许多个列族,列族是列的集合,属于表结构,也是表的基 本访问控制单元; -
列标识( column qualifier
):属于某一个Column Family:Column Qualifier
形式标识,每条记录 可动态添加; -
时间戳( timestamp
):时间戳用来区分数据的不同版本; -
单元格( cell
):在table中,通过行、列族、列、时间戳来确定一个cell,cell中存储的数据没有 数据类型,是字节数组byte[]
, 通过<RowKey,Column Family: Column Qualifier,Timestamp>
元 组来访问单元格 。
Hbase的特点:
-
只需要定义表名和列族,可动态添加列族和列; -
数据都是字符串类型; -
空值不占用存储空间。
四、Hbase架构及组成
1. Hbase架构图
2. Hbase组件及其功能
-
客户端Client:包含访问Hbase的接口并维护cache,是整个Hbase系统的入口,使用者直接通过客户端操作Hbase。
-
Zookeeper:主要用于实现高可靠性(高可用HA),它是串联Hbase集群和Client的关键。在Hbase中主要负责协调的任务如下:
-
Master选举:通过选举机制保证同一个时刻只有一个HMaster处于活跃状态。 -
系统容错:每个RegionServer在加入集群时都需要到Zookeeper中进行注册,创建一个状态节点,Zookeeper会实时监控每个RegionServer的状态。 -
Region元数据管理:Region元数据被存储在Meta表中。Meta表是存在Zookeeper中。每次客户端发起新的请求时,需要查下Meta表来获取Region的位置。 -
Region状态管理:实时监控(心跳)RegionServer的上下线信息,通知HMaster。Region可能会因为系统故障,配置修改,Region的分裂和合并而导致状态经常发生变更。只要Region发生改变,就要让集群的所有节点知晓。 -
提供Meta表存储位置:保存元数据表的RegionServer位置,Meta表的位置入口由Zookeeper来提供。 -
HMaster:Hbase集群中的主服务器,负责监控集群中的所有RegionServer,并且是所有元数据更改的接口。它主要负责表和Region的管理工作:
-
管理用户对表的增删改查操作; -
管理RegionServer的负载均衡,调整Region的分布; -
Region的分配和移除; -
处理RegionServer的故障转移。 -
RegionServer:主要负责响应用户的请求,向HDFS读写数据。RegionServer运行在DataNode服务器上,实现数据的本地性。每个RegionServer包含多个Region。主要负责如下:
-
处理分批给它的Region:维护Region,处理这些Region的IO请求; -
处理客户端读写请求; -
刷新缓存到HDFS中; -
处理Region分片:切片在运行过程中变得过大的Region; -
执行压缩。
每个Region由多个HStore组成,每个HStore对应表中一个列族的存储。Region相当于HBase中的一张表。
3. Hbase写数据流程
-
客户端访问Zookeeper,从Meta表中得写入数据对应的Region信息和对应的RegionServer
-
客户端访问对应的RegionServer,将数据分别写入HLog和MemStore。MemStore写入数据达到阈值后,将数据写入磁盘文件StoreFile中,在HLog文件中写入一个标记,表示MemStore中数据丢失,可在HLog上恢复。
-
当多个StoreFile文件达到阈值后,会触发Store.compact()将多个StoreFile文件合并成一个大文件。
4. Hbase读数据流程
-
客户端访问Zookeeper,从Meta表读取Region信息对应的服务器;
-
客户端向对应Region服务器发送读数据请求,Region接受请求后,先从MemStore中查找数据,若没有再向blockcache读缓存中查找数据,若再没有再到StoreFile上读取,然后将数据返回给客户端,同时也将数据放在blockcache中。
第一次读数据:memstore -> HFile -> blockcache
第二次(非第一次)读数据:memstore -> blockcache -> HFile -> blockcache
参考文献
《NoSQL数据库原理与应用》 ——王爱国、许桂秋主编