HBase内部结构详解

Posted 不是七七子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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顺序排列(把数据整理成顺序存放,再一起写入硬盘),而不是做一个缓存,不能加速写入的速度。

以上是关于HBase内部结构详解的主要内容,如果未能解决你的问题,请参考以下文章

Redis内部数据结构详解 -- skiplist

Redis内部数据结构详解——ziplist

Redis内部数据结构详解——ziplist

图文详解 HBase 的读写流程

Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

硬盘内部硬件结构和工作原理详解