天天看点

大数据技术-HBase:HBase写入路径

HBase数据是最终存放到hdfs上的,而我们知道hdfs是不支持随机写,只能提供append的形式追加,然后一旦写入后是不可变的。那么HBase是如何提供所谓的低延时写入和读取?下面我们就分析下其中的奥秘。

写路径就是指HBase怎样完成put和delete操作的。该路径开始于客户端,然后到regionserver,最后被写入到一个叫做HFile的数据文件中。其中还包括了HBase为了防止数据丢失写路径的优化设计。因此,理解写路径对于HBase的可能数据出现丢失情况会有一个更加深入的理解。

每个HBase表被托管到一系列服务器上面,主要分为以下三类:

1、一个active状态的master server;

2、一个或多个backup severs;

3、多个regionserver。

regionserver用于托管HBase的表。因为HBase表可能特别大,会被分为多个部分,叫做多个region。每个regionserver上具有一个或多个regions。由于regionsever才处理regions,所以如果master server崩溃了却不会引起数据丢失或不可用。

由于rowkey是排序的,很容易确认哪个regionserver管理哪个key。每个更改请求都会指定一个具体的row。每个rowkey属于一个特定regionserver上的region。客户端会首先定位到哪个regionserver, 然后本地缓存这部分location数据,失效的情况会更新。

当一个请求被特定的regionserver收到后,改变不会马上被写入HFile的,因为数据写入HFile是必须是排序好的rowkey,这样当读数据的适合可以允许随机的row高效率搜索。数据不能被随机插入HFile。如果每个更新都写入一个新的文件,许多小文件将会被创建。这种方案是非常不好的,不具有可扩展性去合并和读。因为更新不能立即写入新的HFile。

实际上,HBase是用一个叫做memstore的内存区块存储这些更新,这个可以高效处理随机写入操作。memstore里面的数据是被排序好的。当memstore所占的空间达到一定大小后,将会被写入到新的HFile。

大数据技术-HBase:HBase写入路径

尽管数据先写入memstore是比较高效的,但是引入了数据丢失风险。一旦系统或者regionserver异常退出,所有的memstore中数据将会丢失。为了应对这个问题,HBase提供了一中叫做预写式日志(WAL)的机制。它是在写入memstore之前,首先将更新写入WAL,如果regionserver崩溃,将可以依赖于WAL里面的记录信息重新构建数据。

WAL文件中的数据组织形式有别于HFile的数据结构。WAL 文件包括一系列edits,一个edit代表当个put或者delete,包括属于哪个region的更新。更新数据是append的形式到WAL的。

WAL也会定期轮转,一旦轮转后,原来的表将不会做任何改动了。默认是WAL文件的大小达到HDFS的block大小的95%时候,将会轮转。参数hbase.regionserver.logroll.multiplier乘上block的大小hbase.regionserver.hlog.blocksize。同时也会定期进行轮转,受hbase.regionserver.logroll.period的影响,默认是1个小时,及时这时大小还比较小,都可能轮转。

控制一定大小的WAL有利于在做replay的时候更为高效。一旦replay完成,WAL将会被归档起来,然后由一个叫做LogCleaner的后台线程去做删除。一个regionserver共享一个WAL文件。一个确定时间对于某个regionserver只可能存在一个active的WAL。

每个edit和它对于的sequence id是唯一的。当memstore被刷新到磁盘,最后的sequence id将会被清除。内存里面会记录每个WAL 文件的最大sequence id及对应的文件名,这样便于跟踪哪些WAL可以被归档了。WAL 文件轮转和memstore flush是两个独立的动作,不会同时发生。但是我们不需要保留很多WAL文件,以避免耗时的恢复过程。所以当WAL文件轮转后,HBase会检查是否有过多的WAL文件,然后决定是否需要强制将memstore刷新到磁盘,这样可以将某些WAL文件归档。

可以使用$HBASE_HOME/bin/hbase hlog 工具查看WAL文件内容:

usage: HLog <filename...> [-h] [-j] [-p] [-r <arg>] [-s <arg>] [-w <arg>]

 -h,--help             Output help message

 -j,--json             Output JSON

 -p,--printvals        Print values

 -r,--region <arg>     Region to filter by. Pass region name; e.g.

                       'hbase:meta,,1'

 -s,--sequence <arg>   Sequence to filter by. Pass sequence number.

 -w,--row <arg>        Row to filter by. Pass row name.

继续阅读