Hbase
今天的主要内容
-
Hbase角色的了解
-
HMaster
-
HRegionServer
-
-
Hbase中的组件及其作用
-
HLog
-
Region
-
Store
-
MemStore
-
HFile
-
-
Hbase架构
- 一张图
-
Hbase读写数据的流程(图一定要熟悉)
-
Hbase读数据流程
-
hbase写数据流程
-
一、Hbase角色的理解
1. HMaster
-
监控 RegionServer
-
处理 RegionServer 故障转移
-
处理元数据的变更
-
处理 region 的分配或移除
-
在空闲时间进行数据的负载均衡
-
通过 Zookeeper 发布自己的位置给客户端
2. RegionServer
-
负责存储 HBase 的实际数据
-
处理分配给它的 Region
-
刷新缓存到 HDFS
-
维护 HLog
-
执行压缩
-
负责处理 Region 分片
二、Hbase中的组件及其作用
-
HLog——Write-Ahead logs
-
Region
-
Store
-
MemStore
-
HFile
1. Write-Ahead logs
-
HBase 的修改记录
-
一个HRegionServer对应一个Hlog
-
Hlog中存放的是数据本身和对数据的操作
-
当对 HBase 读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。
-
但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做 Write-Ahead logfile 的文件中,然后再写入内存中。
-
所以在系统出现故障的时候,数据可以通过这个日志文件重建。因为Hlog中存放的是数据本身和对数据的操作
2. Region
-
Hbase 表的分片
-
HBase 表会根据 RowKey 值被切分成不同的 region 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 region。
-
RegionServer对应着多张表,一张table又对应着多个Region,一个Region维护着一个区间的row key
3. Store
-
HFile 存储在 Store 中,一个 Store 对应 HBase 表中的一个列族(Column Family)。
-
一个Region中有多个Store
4. MemStore
-
就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在 WAL中之后,RegsionServer 会在内存中存储键值对。
-
一个store中对应着一个MemStore,当MemStore达到16k后,写出到队列,然后产生一个新的Memstore,存在队列中的memstore实例化对象会被写到HFile中,一个memstore对应一个HFile,因此,一个Store中有一个memstore,但是有多个HFile。
5. HFile
-
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。
-
是存储在HDFS中的。
-
由HregionServer进行定期合并的,HRegionServer通过调用HDFS的API进行HFile的合并。
三、Hbase架构

概念理解:
· Hbase是依赖于zookeeper和hdfs的
-
HBase 内置有 Zookeeper,但一般我们会有其他的 Zookeeper 集群来监管 master 和regionserver,Zookeeper 通过选举,保证任何时候,集群中只有一个活跃的 HMaster
-
zookeeper中存储了
-
HMaster和RegionServer状态信息
-
HBase中数据的元数据寻址地址,也就是-ROOT-表的地址,即-ROOT-表存在于哪个RegionServer上
-
-
HMaster与 HRegionServer 启动时会向 ZooKeeper 注册,存储所有 HRegion 的寻址入口,实时监控HRegionserver 的上线和下线信息。并实时通知给 HMaster,存储 HBase 的 schema 和 table元数据。
-
默认情况下,HBase 管理 ZooKeeper 实例,Zookeeper 的引入使得 HMaster 不再是单点故障。一般情况下会启动两个 HMaster,非 Active 的 HMaster 会定期的和 Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个 HMaster 反而增加了 Active HMaster 的负担。
-
一个 RegionServer 可以包含多个 HRegion,每个 RegionServer 维护一个 HLog,和多个 HFiles以及其对应的 MemStore。RegionServer 运行于 DataNode 上,数量可以与 DatNode 数量一致。
四、Hbase读数据的流程

1. 寻址流程
-
Client访问Zookeeper,获取-ROOT-表的元数据信息,即表位于哪个RegionServer,并向客户端返回此RegionServer的地址(交互一:Client与Zookeeper的交互)
-
Client通过获取到的RegionServer的IP去访问RegionServer(交互二:client和RegionServer·的交互)
-
Client接着读取RegionServer中的-ROOT-表的内容,获取到.META表的地址(交互三:client和-ROOT-的交互)
-
Client根据.META表的地址,访问.META表,获取到数据的元数据信息(交互四:client和.METAE的交互)
-
client根据获取到的数据的元数据信息,去访问对应的HRegionServer,然后扫描所在的MemeStore和storefile来查询数据(交互五:client和数据本身的交互)
2. 寻址流程细节

-
-ROOT-表无论多大,都只有一个Region,存放着多条.META表的元数据信息,
-
.META表中有多个Region,存放关于实际数据的元数据
-
一个Table对应多个Region,一个Region维护一部分的row key
3. 在Region中读取数据的具体流程

-
先到memstore中寻找,注意:memstore中存放的是用户最近写入的数据,如果没有,则去Blockcache中读取数据,注意:BlockCache中存放的是用户最近读取的数据。如果没有,则去HFile中进行读取
-
HFile中获取到数据以后,现在Blockcache中进行缓存,然后再返回给客户端
-
BlockCache中用到了LRUCache算法
五、Hbase写入数据流程

-
先访问zookeeper,确定当前将要写入的数据所对应的 RegionServer 服务器和 Region。
-
Client 向该 RegionServer 服务器发起写入数据请求,然后 RegionServer 收到请求并响应。
-
Client 先把数据写入到 HLog,以防止数据丢失。
-
然后将数据写入到 Memstore。
-
如果 Hlog 和 Memstore 均写入成功,则这条数据写入成功。在此过程中,如果 Memstore达到16kb,会把 Memstore 中的数据写到一个队列中。
-
当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile 合并成一个大的
尖叫提示:因为内存空间是有限的,所以说溢写过程必定伴随着大量的小文件产生。
网友评论