HBase内部结构详解
最近在看《HBase不睡觉书》,挺不错的,很适合入门,推荐大家看看。
宏观架构
Master:
负责启动的时候分配Region到具体的RegionServer,执行各种管理操作。(Master在HBase中的功能比较弱,假如Master挂了,依然可以对数据进行增删改查,但不能创建表、修改列族配置等)。
RegionServer:
RegionServer上有一个或多个Region,我们读写的数据就存储在Region上。
Region:
存储一张表的一部分数据。
HDFS:
真正存储数据的载体。
Zookeeper:
Zookeeper在HBase中比较重要,如果将Zookeeper关掉,就不能读取数据,因为读取数据所需要的元数据表hbase:meta的位置存储在Zookeeper上。
RegionServer内部架构
WAL:
预写日志(Write-Ahead Log),当操作到达Region的时候,HBase首先把操作写到WAL里面。HBase会先把数据放到基于内存实现的MemStore里,等数据达到一定的数量时才flush到最终存储的HFile内。假设HBase把数据从MemStore刷写到HFile的过程中,服务器宕机了或者断电了,那么数据就丢失了。由于数据在写到MemStore之前,先被写到WAL了,那当故障恢复的时候,就可以从WAL中恢复数据了(因为WAL的数据是存储在HDFS上的,所以数据并不会丢失)。
Region:
存储一张表的一部分数据,每个Region都有起始rowkey和结束rowkey,代表了它所存储的row范围。
Region内部结构
多个Store:
每一个Region内都包含有多个Store实例。一个Store对应一个列族的数据,如果一个表有两个列族,那么在一个Region里面就有两个Store。
Store内部结构
MemStore:
每个Store中有一个MemStore实例。数据写入WAL之后就会被放入MemStore。MemStore是内存的存储对象,只有当MemStore满了的时候才会将数据刷写(flush)到HFile中。
HFile:
在Store中有多个HFile。当MemStore满了之后HBase就会在HDFS上生成一个新的HFile,然后把MemStore中的内容写到这个HFile中。HFile直接跟HDFS打交道,它是数据的存储实体。
HFile的内部结构
Data:
数据块。我们存储在HBase表中的数据就在这里。
Meta:
元数据块。Meta块只有在文件关闭的时候才会写入。
FileInfo:
文件信息。只有在文件关闭的时候才会写入,存储的是这个文件的信息,比如最后一个key(Last Key),平均的Key长度(Avg Key Len)等。
DataIndex:
存储Data块索引信息的块文件。
MediaIndex:
存储Meta块索引信息的块文件。
Trailer:
存储了FileInfo、DataIndex、MetaIndex的偏移值。
Data数据块内部结构
BlockType:
块的类型。
Cell(KeyValue):
Cell是一个接口,KeyValue是它的实现类。
KeyValue类:
Value:
存储数据。
Value前面的:
存储跟该单元格相关的元数据信息。
问题:
WAL是存储在HDFS上的,MemStore是存储在内存中,HFile又是存储在HDFS上的。数据在进入HFile之前已经被存储到HDFS一次了,为什么还需要被放入MemStore?
因为HDFS上的文件只能创建、追加、删除,但是不能修改。这样就不能按顺序地存放数据了,增加MemStore的作用是维持数据按照rowkey顺序排列(把数据整理成顺序存放,再一起写入硬盘),而不是做一个缓存,不能加速写入的速度。