HBase的目录结构

一、HBase目录结构

1.1、On ZooKeeper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ for i in $(echo "ls /hbase" | zookeeper-client | tail -2 | head -1 | awk -F '[][]' '{print $2}'); do echo $i; done
meta-region-server,
rs,
splitWAL,
backup-masters,
table-lock,
flush-table-proc,
master-maintenance,
online-snapshot,
master,
switch,
running,
draining,
namespace,
hbaseid,
table

说明:

  • meta-region-server:包含meta region
  • rs
  • splitWAL
  • backup-masters
  • table-lock
  • flush-table-proc
  • master-maintenance
  • online-snapshot
  • master
  • switch
  • running
  • draining
  • namespace
  • hbaseid
  • table

1.2、On HDFS

1.2.1、根级目录/文件

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo -u hdfs hadoop fs -ls /hbase
Found 14 items
drwxr-xr-x - hdfs supergroup 0 2019-11-12 03:31 /hbase/.hbase-snapshot
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:16 /hbase/.tmp
drwxr-xr-x - hbase supergroup 0 2019-11-12 04:30 /hbase/MasterProcWALs
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:16 /hbase/WALs
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:31 /hbase/archive
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:13 /hbase/corrupt
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:17 /hbase/data
-rw-r--r-- 3 hbase supergroup 42 2019-11-12 03:13 /hbase/hbase.id
-rw-r--r-- 3 hbase supergroup 7 2019-11-12 03:13 /hbase/hbase.version
drwxr-xr-x - hbase supergroup 0 2019-11-12 04:30 /hbase/oldWALs

说明:

  • /hbase/.hbase-snapshot - 存储Snapshot的相关信息
  • /hbase/.tmp - 临时目录。比如,写一个hbase.id文件,先在这里写成功后,再rename到/hbase/hbase.id
  • /hbase/MasterProcWALs - 保存master执行过程中程序的状态,用于中断恢复执行使用
  • /hbase/WALs - 记录每台regionserver上的WAL日志文件
  • /hbase/archive - 归档目录。进行snapshot或者升级时会使用该目录,compaction删除hfile时也会把旧的hfile归档到这里。该目录由 HMaster 上的一个定时任务定期去清理。
  • /hbase/corrupt - splitlog的corrupt目录,以及corrupt hfile的目录
  • /hbase/data - HBase的表数据目录。从0.98版本开始支持 namespace 的概念模型,系统会预置两个 namespace 即: hbase 和 default
  • /hbase/hbase.id - 集群的唯一ID文件。在集群启动时初始化生成
  • /hbase/hbase.version - 版本文件(hbase软件版本、代码静态版本),现在都是8
  • /hbase/oldWALs - 历史WAL日志。已经确认持久化了的WAL日志文件会被移到这里,完成了splitlog的旧日志,也会被放到这里。

1.2.2、子目录/文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
## /hbase/WALs
# 对于每个regionServer节点,WALs日志目录下都包含一个对应的子目录
# 用于记录每台RegionServer上的WAL日志文件
# regionServer目录的名字是有时间的。下一次启动时,RS目录就会使用新的目录结构存放wal,这个旧的RS目录会被splitlog拆分回放
$ sudo -u hdfs hadoop fs -ls /hbase/WALs
Found 4 items
drwxr-xr-x - hbase supergroup 0 2019-11-12 05:16 /hbase/WALs/node2,16020,1573528597339
drwxr-xr-x - hbase supergroup 0 2019-11-12 05:16 /hbase/WALs/node3,16020,1573528597152
drwxr-xr-x - hbase supergroup 0 2019-11-12 05:16 /hbase/WALs/node4,16020,1573528597150
drwxr-xr-x - hbase supergroup 0 2019-11-12 05:16 /hbase/WALs/node5,16020,1573528597109

# 每个子目录下会有多个HLog文件(因为日志滚动)
$ sudo -u hdfs hadoop fs -ls /hbase/WALs/node2,16020,1573528597339
Found 1 items
-rw-r--r-- 3 hbase supergroup 0 2019-11-12 05:16 /hbase/WALs/node2,16020,1573528597339/node2%2C16020%2C1573528597339.node2%2C16020%2C1573528597339.regiongroup-0.1573535804334


## /hbase/oldWALs
# 具体的oldWALs文件
$ sudo -u hdfs hadoop fs -ls /hbase/oldWALs
Found 220 items
-rw-r--r-- 3 hbase supergroup 91 2019-11-12 06:16 /hbase/oldWALs/node2%2C16020%2C1573528597339.node2%2C16020%2C1573528597339.regiongroup-0.1573535804334
-rw-r--r-- 3 hbase supergroup 91 2019-11-12 06:16 /hbase/oldWALs/node3%2C16020%2C1573528597152.node3%2C16020%2C1573528597152.regiongroup-0.1573535804199
-rw-r--r-- 3 hbase supergroup 91 2019-11-12 06:16 /hbase/oldWALs/node4%2C16020%2C1573528597150.meta.1573535805180.meta
-rw-r--r-- 3 hbase supergroup 91 2019-11-12 06:16 /hbase/oldWALs/node4%2C16020%2C1573528597150.node4%2C16020%2C1573528597150.regiongroup-0.1573535804696
-rw-r--r-- 3 hbase supergroup 91 2019-11-12 06:16 /hbase/oldWALs/node5%2C16020%2C1573528597109.node5%2C16020%2C1573528597109.regiongroup-0.1573535804408
-rw-r--r-- 3 hbase supergroup 33602916 2019-11-12 03:34 /hbase/oldWALs/pv2-00000000000000000001.log


## /hbase/archive/
# 表的归档和快照具体目录形如:
/hbase/archive/data/default/表名/region名/列族名/fd2221d8d1ae4e579c21882f0ec4c5a5


## /hbase/data/
# default存放所有用户的数据表
# hbase存放HBase的系统表
$ sudo -u hdfs hadoop fs -ls /hbase/data
Found 2 items
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:17 /hbase/data/default
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:16 /hbase/data/hbase


## /hbase/data/hbase
# meta是元数据表,记录region相关信息
# namespace存储了HBase中的所有namespace信息,包括预置的hbase 和 default
$ sudo -u hdfs hadoop fs -ls /hbase/data/hbase
Found 2 items
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:13 /hbase/data/hbase/meta
drwxr-xr-x - hbase supergroup 0 2019-11-12 03:16 /hbase/data/hbase/namespace

1.2.3、表目录

1
2
3
4
/hbase/data/default/TestTable/.tabledesc/
/hbase/data/default/TestTable/.tabledesc/.tableinfo.0000000001
/hbase/data/default/TestTable/.tabledesc/.tmp
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/

它们的作用分别是:

  • 存放表的元数据信息文件
  • 表具体的元数据信息文件
  • 存放中间数据的临时目录,当.tableinfo被更新时该目录就会被用到
  • 表中的region目录 , 由表名+Start Key+时间戳产生的hashcode

1.2.4、region目录

1
2
3
4
5
6
7
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/列族名/
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/列族名/2e58b3e274ba4d889408b05e526d4b7b
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/recovered.edits/340.seqid
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/.regioninfo
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/.tmp
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/.splits
/hbase/data/default/TestTable/fc06f27a6c5bc2ff57ea38018b4dd399/.merges

它们的作用分别是:

  • 存储该列族所有的数据文件
  • 该列族实际的数据文件(HFile)
  • 当splitlog发生时,一个RS的wal会按照region级别split WALs写到对应目录下的的recovered.edits目录上,使得此region再次被open的时候,回放这些recovered.edits 日志。
  • regioninfo文件。 包含了region的HRegionInfo的序列化信息,与tableinfo类似。hbase hbck 工具可以用它来生成丢失的表条目元数据
  • compaction时的临时目录
  • split时的临时目录,如果region上一次的split没有完成就被中断了,这个region再open时会自动清理这个目录,一般不需要人工干预。
  • merges时的临时目录,和split一样,如果没有正常完成就被中断了,那么在下次被open的时候自动清理。一般也不需要人工干预。

二、HBase涉及的主要文件

  • hfile - 数据文件
  • hfilelink - hbase snapshot会用到, migration upgrade 也会使用到。
  • reference - 用来指定half hfile,一个region有reference时,这个region不能split。split/merge会创建这个。进行compaction后生成新的hfile后,会把这个reference删除。hfile的reference文件名格式一般是 hfile.parentEncRegion。如:/hbase/data/default/table/region-one/family/hfilename。其region-two有reference hfile文件名格式为:/hbase/data/default/table/region-two/family/hfile.region-one 通常无效引用就是 region-one的hfile不存在了,那么这个引用就会失效。他的修复方法一般是把reference无效的引用移除。
  • .regioninfo - 保存着 endkey/offline标志/regionid/regionName/split标志/startkey/tablename等信息
  • tableinfo 保存着 tableName/table属性信息/table级别config信息/family信息。其中family信息保存着 famliyName/famiy属性/famliy级别config信息等。

三、参考

https://segmentfault.com/a/1190000014708618

https://lihuimintu.github.io/2019/06/19/HBase-File-ZK-Structure/#在-hdfs-路径](https://lihuimintu.github.io/2019/06/19/HBase-File-ZK-Structure/#在-hdfs-路径)

https://blog.bcmeng.com/post/hbase-hdfs.html


HBase的目录结构
https://kuberxy.github.io/2022/04/06/HBase的目录结构/
作者
Mr.x
发布于
2022年4月6日
许可协议