Hbase中对数据 增删改查 工作流程

Hbase写插入数据流程:

1、大体部分

如果将一张表看成是一个区域(region)的话,即每张表一开始只有一个region。往数据表中不断的插入数据,随着数据不断插入表,region不断增大,当增大到某个阀值的时候(百万千万级别),hbase会自动对表进行水平分成多个区域(区域大小一定但是行数不一定相同),每个区域都称为一个region,每个region会保存一个表里面的某段连续的数据。当表中的行数不断增多,就会有越来越多的region。即一个regionserver中的region过多,这时候master就会将一部分region分配到其他的regionserver中,实现master负载均衡的功能。

2、缩小到每一个region

一个region由多个store组成,一个store对应一个CF(列族);一个store包含了memstore和storefile(HFlie)。数据先写入内存中的memetore,memstore是内存中的缓存区,同时还会将 数据顺序写入到位于硬盘中的Hlog文件中,该文件不仅仅是一个日志文件,同时还记录了操作的数据信息,当机器从宕机状态下恢复到正常运行状态,Hlog文件就会被读进内存实现数据恢复。当memstore中的数据达到某个阀值的时候,regionserver会启动一个flashcache的进程将数据从memestore刷入storeflie,每次写入形成单独的一个storefile(Hfile)。

Hbase读取数据流程:

1、存储分布

表中的数据被切分到集群中,若要查询数据需要知道该数据在第几行以及被分到哪一台regionserver中。然而master只负责负载均衡以及故障转移,这时候需要构建一个类似记录存储路径的信息,这部分就由zookeeper来完成。

当表中的数据多达上千万甚至上亿行时,被切分的数据会被保存到一张叫META的表中,它也是hbase结构中的一张表。该张表可简单的认为为两列,行数不确定。META表中的每一行的行键保存描述某个region的存储的行数,对应的第二列保存 该region被分配到的regionserver的ip地址。由此META表中的行数远比一张完整表的行数要少的多,但是依然保存了全部的数据信息。

虽然META表的行数已经大大减少,但是可能随着数据的不断插入,行数可能会依然很大。这时候需要将META表中的数据需要再进行一次类似的操作。因为META表同样是hbase结构中的一张表,同样会被切分。META表被切分的“region”就会保存到一张与META表结构类似的名为-ROOT-的表中,该张表只有一个region,永远不会被切分成多个region,zookeeper记录了-ROOT-表的位置。-ROOT-表中的行键描述了META表被切分的多个region的存储信息,即-ROOT-表中的一行对应META表中的一个region,对应的列同样是记录保存该信息的节点ip。这样一来-ROOT-表中的一条数据就可能对应着真实的上万或上百万的数据。

2、读取定位

通过zookeeper里的文件得到-ROOT-表的位置。通过-ROOT-表查找META表的第一个表中相应的region的位置。META表中的每一个region在-ROOT-表中都是一行记录。通过META表找到所要的用户表region的位置。用户表中的每个region在META表中都是一行记录。由于-ROOT-表永远不会被分隔为多个region,保证了最多需要三次跳转,就能定位到任意的region。

3、数据交互

定位到region,开始先从Memstore查数据,若找不到再和与Memstore处于同一内存空间的BlockCache中查数据若Memstore和BlockCache这两块内存都没有要查找的数据,则需要从硬盘的HFile中获取。把读到的结果放入BlockCache。由于BlockCache采用的是LRU策略,因此BlockCache达到上限后,会启动淘汰机制,淘汰掉最老的一批数据。因此BlockCache中存储的是一些频繁被查询的数据。

Hbase修改数据的流程:

1、时间戳

HBase 中通过 Row 和 Columns 确定的一个存储单元称为 Cell。每个 Cell 都保存着同一份数据的多个版本。 版本通过时间戳来索引,时间戳的类型是 64 位整型。时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。

2、修改数据

当对数据进行修改,修改的数据会将当前的数据覆盖,由hbase在写入数据时自动赋予修改数据后的时间戳,每个 Cell 中,不同版本的数据按照时间倒序排序,即最新的数据排在最前面。保证每次获取的数据时最新修改后的数据。

Hbase删除数据的流程:

1、执行delete操作并不是把数据真的删除了,而是添加了一个标记,代表此数据被删除掉,直到hbase执行大合并,才会真的从hfile中删除数据

2、大合并和小合并

这里需要回到写入数据到stofile说起,当storefile的文件数量增长到一定阀值后,系统会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的stofile,这就是小合并。大合并则是指将一个列族的所有stoefile合并成一个文件。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180419B08HBJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券