目录
1.HBase的写流程图
2.流程分析
2.1 具体流程
- 1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。
- 2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey, 查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以 及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
- 3)与目标 Region Server 进行通讯;
- 4)将数据顺序写入(追加)到 WAL;
- 5)将数据写入对应的 MemStore,数据会在 MemStore 进行排序;
- 6)向客户端发送 ack;
- 7)等达到 MemStore 的刷写时机后,将数据刷写到 HFile。
2.2 关于Hbase:meta表
描述HBase表的表,元数据表。有了 Region 标识符,就可以唯一标识每个 Region。为了定位每个 Region 所在的位置,可以构建一张映射表。映射表的每个条目包含两项内容,一项是 Region 标识符,另一项是 Region Server服务器标识。这个条目就表示 Region 和 Region Server服务器之间的对应关系,从而就可以使用户知道某个 Region 存储在哪个 Region Server服务器中。这个映射表包含了关于 Region 的元数据,因此也被称为“元数据表”,又名“Meta表”。使用 scan 命令可查看 Meta 表的结构,如图所示
Meta 表中的每一行记录了一个 Region 的信息。RowKey 包含表名、起始行键和时间戳信息,中间用逗号隔开,第一个 Region 的起始行键为空。时间戳之后用.隔开的为分区名称的编码字符串,该信息是由前面的表名、起始行键和时间戳进行字符串编码后形成的。
Meta 表里有一个列族 info。info 包含了三个列,分别为 Regioninfo、Server 和 Serverstartcode。Regionlnfo中记录了 Region 的详细信息,包括行键范围 StartKey 和 EndKey、列族列表和属性。
Server 记录了管理该 Region 的 Region Server服务器的地址,如 localhost:16201。Serverstartcode 记录了 Region Server服务器开始托管该 Region 的时间。当用户表特别大时,用户表的 Region 也会非常多。Meta 表存储了这些 Region 信息,也变得非常大。Meta 表也需要划分成多个 Region,每个 Meta 分区记录一部分用户表和分区管理的情况。(有了meta表,就可以得到region和HRegionServer的对应关系,可以进行Region定位。客户端通过 ZooKeeper 获取 Meta 表(分区表)存储的地址,首先在对应的 Regionserver上获取 Meta 表的信息(meta表存在Regionserver上),得到所需的Region对应的Region server的信息,然后从Region Server服务器上找到所需的数据)
2.3 关于写入WAL和MemStore的先后问题
可以通过查看put实现源码:
1)先写入WAL,但是不同步
2)再写入内存Mem Store
3)最后同步WAL,检查内存是否写入成功,如果失败回滚事务
上面的三个步骤利用了事务的原子操作,如果失败立即回滚,如果面试官问起的话,也可以说成是数据先写进WAL,后写进内存Mem Store。