Hbase的定义
高性能的,不完全支持ACID,分布式,易拓展,列式Nosql数据库。
适合场景:适合数据报表分析,不适合实时数据
缺点:
1.原生不支持表连接,group by语法,如果需要sql分析,可以与Hive和phoneix集成
2.架构复杂(需要额外维护一套zookeeper集群,也依赖于Hadoop的服务),少量数据下无法发挥优势,只有海量数据下才能发挥优势
Hbase的架构
Hbase各个组件的作用:
Hmaster:
-
管理用户对表的增加、删除、修改、查询等操作。 -
实现不同HRegionServer之间的负载均衡。 -
在Region分裂或合并后,负责重新调整Region的分布。 -
对发生故障失效的HRegionServer上的Region进行迁移。 - HRegionServer:
-
负责存储和维护分配给自己的Region。 -
处理来自客户端的读写请求。
client:
-
并不是直接从HMaster主服务器上读取数据,而是在获得Region的存储位置信息后,直接从HRegionServer上读取数据。 -
客户端并不依赖HMaster,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和HMaster通信,这种设计方式使得HMaster负载很小
zookeeper:
- 保证任何时候,集群中只有一个活跃的master,因为为保证安全性会启动多个Master。
- 存储所有Region的寻址入口。知道那个Region在哪台机器上。
- 实时监控Region Server的状态,将Region Server的上下线的信息汇报给HMaster。(因为每间隔一段时间,RegionServer与Master都会zookeeper发送心跳信息),Region Server不直接向Master发送信息的原因是为了减少Master的压力因为只有一个活跃的Master,所有的RegionServer同时向他汇报信息,压力太大。而若有100台RegionServer时,Region Server可以分每10台向一个zookeeper汇报信息,实现zookeeper的负载均衡。
- 存储Hbase的元数据(Schema)包括,知道整个Hbase集群中有哪些Table,每个 Table 有哪些column family(列族)。
Hbase的表的解析
Hbase逻辑结构像传统的表,但底层物理结构更符合K-V类型的存储结构。而K-V类型的特点,使得Hbase支持高并发。Hbase可保存多版本数据,默认最新的三个版本的数据,按照时间戳来区分版本号(可修改)。
逻辑结构
了解Hbase的表的逻辑结构之前,我们先说明Hbase的几个专有名词的具体含义:
- rowkey:前面说到了hbase的表的物理结构更像k-v结构,是因为rowkey起到了key的作用,rowkey是唯一的,数据只能按照rowkey检索
- row:row是属于逻辑上的概念,row指rowkey代表的一行数据
- column Family:列族是表结构下面的一个单位,列族是具体的,需要特别指定,列族下可以有多个列,但列无需提前指定
- Column Qualifier:标识一个列归属于哪个列族,列依赖于列族
- store:一个列族的保存的数据(包含rowkey)逻辑上归属于一个store
- region:region是表存储数据的最小单位,一张表初始只有一个region,当数据量够大时会发生分裂,region包含一个rowkey的多个列族,一张表可以有多个region,region分别部署在不同的server上,但是一个region只能部署在一个server上
物理结构
hbase的表的物理结构比逻辑结构简单多了,简略说一下:
- storefile:storefile是store下的单位,一个store下可以有多个storefile,,但过多的storefile可能影响性能
- cell:cell是物理意义上的最小的一条具体数据,包含了rowkey,timestamp等,Hbase只保存字符串数据
Hbase的读写流程
Hbase的写流程
Hbase的数据可靠性依靠WAL,依靠预写日志的方式,现将数据写入Hlog,再写入Hbase
- client请求zookeeper,获取表的meta信息,获取目的的表在哪个regionserver中,并将请求信息缓存到client的meta信息中
- 请求regionserver,获取具体的region,现将数据写入Hlog中(wal),再写入metastore,并向客户端确认写入
- metastore刷写机制到了,再写到storefile
Hbase的读流程
- Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。
- 访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
- 与目标Region Server进行通讯;
- 分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
- 将查询到的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache。
- 将合并后的最终结果返回给客户端。
Hbase的文件合并和分裂
Region的分裂
region的store带下超过阈值时候(默认为256M),会分裂成两个region,分裂时服务不可用,高并发情况下,对服务影响较大,可根据参数hbase.hregion.max.filesize调整
-
region所在regionServer创建splits目录;
-
关闭要分裂的region的读写请求;
-
在splits目录中创建所需要的文件结构;
-
移动两个新region文件目录到目录表中,并更新.META表;
-
异步复制父region中的数据到两个子region中(最主要的消耗时间);
-
复制完成后、打开两个新产生的region,并上线,可以接收新的读写请求;
-
异步任务把定时把原来被分裂的region从.META表中清除掉,并从文件系统中删除该region所占用的空间
Region的合并
- 随着MemStore不断有数据写入,当MemStore的大小超过配置或默认大小的时候,HBase会把MemStore中的数据刷新到HDFS中,生成新的StoreFile文件 ,当一个region中包含的StoreFile文件数目超过配置地的阈值,后台合并任务,会把这些文件合并成数量更少,体积更大的文件。
- 当这个过程持续到这些文件 中最大的StoreFile文件 超过配置最大存储文件 大小时,此时会触发一个region拆分操作,减少读取过程中的IO
Hbase的优化
减少列族的数量,一个列族会分配一个metasotore,过多的metastore(小文件)会触发flush,触发compaction写入hfile,compaction的机制
设计rowkey,确保以原则:
- 一 确保rowkey唯一性
- 二 rowkey应散列分散存储,减少regionserver的负载压力
- 三 rowkey不能太长