hbase的读写过程:node
hbase的架构:缓存
Hbase真实数据
hbase真实数据存储在hdfs上,经过配置文件的hbase.rootdir属性可知,文件在/user/hbase/下
hdfs dfs -ls /user/hbase
Found 8 items
drwxr-xr-x - root supergroup 0 2019-05-30 10:05 /user/hbase/.tmp
drwxr-xr-x - root supergroup 0 2019-05-30 11:11 /user/hbase/MasterProcWALs
drwxr-xr-x - root supergroup 0 2019-05-30 10:05 /user/hbase/WALs
drwxr-xr-x - root supergroup 0 2019-05-27 18:49 /user/hbase/archive
drwxr-xr-x - root supergroup 0 2019-05-27 18:11 /user/hbase/data
-rw-r--r-- 3 root supergroup 42 2019-05-27 14:33 /user/hbase/hbase.id
-rw-r--r-- 3 root supergroup 7 2019-05-27 14:33 /user/hbase/hbase.version
drwxr-xr-x - root supergroup 0 2019-05-30 11:16 /user/hbase/oldWALs
.tmp
当对表作建立或者删除操做的时候,会将表move 到该 tmp 目录下,而后再去作处理操做。
MasterProcWALS
记录建立表等DDL操做时的一些事务信息,用于处理如 HMaster 中断致使的 DDL 没法执行、回滚等问题
WALS
属于hbase的预写日志(write-ahead-logs),记录Hbase在数据写入时候的数据信息。数据写入过程当中是先写入到WAL中,再写入到memstore。当发生 RegionServer 宕机重启后,RS 会读取 HDFS中的 WAL 进行 REPLAY 回放从而实现故障恢复。从数据安全的角度,建议开启 WAL
archive
HBase 在作 Split或者 compact 操做完成以后,会将 HFile 先移到archive 目录中,而后将以前的hfile删除掉,该目录由 HMaster 上的一个定时任务按期去清理。
data
真实数据文件HFile,HFile是经过memestore刷下来的.
hbase.id
序列化文件,标识hbase集群的惟一id号,是一个 uuid。
hbase.version
序列化文件,标识hbase集群的版本号。
oldWALs
存放旧的被回收的WAL文件安全
命名空间目录
hdfs dfs -ls /user/hbase/data
Found 2 items
drwxr-xr-x - root supergroup 0 2019-05-30 11:43 /user/hbase/data/default
drwxr-xr-x - root supergroup 0 2019-05-27 14:33 /user/hbase/data/hbase
表级目录
hdfs dfs -ls -R /user/hbase/data/default/t1
drwxr-xr-x /user/hbase/data/default/t1/.tabledesc
drwxr-xr-x /user/hbase/data/default/t1/.tmp
drwxr-xr-x /user/hbase/data/default/t1/68e61220e866d62a27d0cdeb0c1eed83 #HFile服务器
HFile、WAL和Memstore
HFile
HBase实际的存储文件功能是由HFile类实现的,它被专门建立以达到一个目的:有效的存储HBase数据。架构
HFile数据都在前面的data里:oop
WAL
regionserver会将数据保存到menstore(内存)中,直到积攒足够多的数据再将其刷写到磁盘上,这样能够避免建立不少小文件。可是存储在内存中的数据是不稳定的。例如,在服务器断电的状况下数据可能会丢失。
一个常见的解决方法是预写日志(WAL):每次更新操做都会写入日志,只有写入成功才会通知客户端操做成功,而后服务器能够按需自由的批量处理或聚合内存中的数据性能
优化手段:
hbase数据是先写入到WAL而后写入到memstore,因此有的优化,建议你们关闭WAL
可是,关闭WAL以后,写入数据时若是发生宕机,那么数据确定会丢失
并且,关闭WAL对于写入性能的提高,其实不是很明显.WAL其实就相似于hadoop中的edits文件优化
Hbase元数据:
# 列出hbase名字空间的表
hbase(main):023:0> list_namespace_tables 'hbase'
TABLE
meta
namespace
2 row(s) in 0.0140 secondsui
Hbase数据定位过程:
Hbase在数据读取的时候,须要先查询hbase:meta表,经过这个表到指定的regionserver获取region信息并进行数据的读取。详细过程以下:
1.client经过zookeeper获取管理hbase:meta表的regionserver
2.zookeeper返回oldboy-node103
3.向oldboy-node103获取hbase:meta表的的数据信息
4.查找到t1的row1所对应的region是被oldboy-node102所管理
5.将信息返回给客户端
6.向oldboy-node102获取对应region的数据
一旦知道区域(region)的位置,Hbase会缓存此次查询信息。以后客户端能够经过缓存信息定位所需的数据位置,而不用再次查找hbase:meta。spa
读取过程:
区域(region)和列族(column family)是以文件夹形式存在于HDFS的,因此在读取的时候:
若是肯定了区域位置,就直接从指定的region目录读取数据。
若是一个列族文件夹中的文件有多个StoreFile,客户端会经过布隆过滤器筛选出可能存在数据的块,对这些块进行数据的查找。
若是此行有多个列族的话,就会在全部的列族文件夹中同时进行以上操做
写入过程:从上图能够看出,除了真实数据(StoreFile)外,Hbase还处理一种HLog文件,此文件称为预写日志(WAL)。用户发起put请求时,也会先定位数据位置,而后:第一步,决定数据是否须要写到由HLog实现的预写日志(WAL)中,预写日志(WAL)存储了序列号和实际数据,因此在服务器崩溃时能够回滚到还未持久化的数据。一旦数据被写入到WAL中,数据会被放到MemStore内存数据中。同时regionserver会检查MemStore是否已经写满,若是满了,就会被刷写(flush)到磁盘中。会把数据写成HDFS中的新StoreFile,同时也会保存最后写入的序列号,系统就知道那些数据被持久化了。当Storefile 愈来愈多,会触发Compact 合并操做,把过多的 Storefile 合并成一个Storefile。当Storefile 愈来愈大,Region 也会愈来愈大。达到阈值后,会触发Split 切割region操做。