简述
Hadoop Databases 基于Hadoop存储,是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。**利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为其分布式协同服务** 主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)
数据模型
列族
** 权限控 HBase表中的每个列都归属于某个列族,**列族必须作为表模式(schema)定义的一部分预先给出。如 create ‘test’, ‘course’
列名以列族作为前缀,每个“列族”都可以有多个列成员(column);如course:math, course:english, 新的列族成员(列)可以随后按需、动态加入制、存储以及调优都是在列族层面进行的
HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。
timestamp时间戳
** 在HBase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异, 不同版本的数据按照时间倒序排序,最新的数据版本排在最前面** 。
** 时间戳的类型是 64位整型** 时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间 时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳
单元格cell
单元格是有版本的(时间戳决定),行和列交叉决定
- 单元格的内容是未解析的字节数组(row key ,column(=<family>+<qualifier>), version) 一确定的单元,cell中的数据是没有类型的,全部是字节数组形式储存二进制安全
Hlog
- 预写日志,上传数据时不会直接存储磁盘上,先存储在哪内存中,到达一定阈值后写出
- HLog文件就是一个普通的Hadoop Sequence File,Sequence File 的Key是HLogKey对象, HLogKey中记录了写入数据的归属信息,除了table和region名字外, 同时还包括 sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0, 或者是最近一次存入文件系统中sequence number HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的KeyValu
架构
基本组件与流程
Client
- 访问Zookeeper,不会直接和Master打交道,包含了访问Hbase的接口并维护cache来加快对Hbase的访问
- Zookeeper记录着meta表在哪里,存储元数据信息(Hbase:meta),上面存储哪个region存储在哪里
[zk: localhost:2181(CONNECTED) 1] ls /hbase/table
[hbase:meta, hbase:namespace, student]
[zk: localhost:2181(CONNECTED) 2] ls /hbase
[replication, meta-region-server, rs, splitWAL, backup-masters, table-lock, flush-table-proc, region-in-transition, online-snapshot, master, running, recovering-regions, draining, namespace, hbaseid, table]
[zk: localhost:2181(CONNECTED) 3] get /h
hadoop-ha hbase
[zk: localhost:2181(CONNECTED) 3] get /h
hadoop-ha hbase
[zk: localhost:2181(CONNECTED) 3] get /h
hadoop-ha hbase
[zk: localhost:2181(CONNECTED) 3] get /hbase/meta-region-server
?regionserver:60020Xz??f
??PBUF
five??????0
cZxid = 0x2b00000047
ctime = Wed Oct 26 10:36:17 CST 2022
mZxid = 0x2b00000047
mtime = Wed Oct 26 10:36:17 CST 2022
pZxid = 0x2b00000047
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 58
numChildren = 0
[zk: localhost:2181(CONNECTED) 4]
- 获取之后去对应区域寻找meta表上对应的region信息
- 直接到相应的region上读取相应的数据
Zookeeper
- 保证任何时候集群中只有一个存或的HMseter
- 存储这所有Region的寻址入口(meta位置)
- 实时监控Regionserver的上下线,并实时通知HMaster
- 存储HBase的schema和table元数据
Master
- 为RegionServer分配region
- 负责Region server的负载均衡
- 发现失效的RegionServer并重新分配上面的Region
- 管理用户对table的增删改操作
RegionServer
- RegionServer维护region,处理这些region的IO请求
- RegionServer负责分担在运行过程中变得过大的Region(人工干预)
Region
Hbase自动把表横向切分成几个区域,每个region存储一段连续的数据(字典排序)
** 每个表一开始只有一个Region,region不断增大,当增大到一个阈值的时候, region就会等分会两个新的region(裂变)table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver**
Memstore和storeFile
- 一个region由于多个store组成,一个store对应一个列族
- store包括位于内存中的memstore和位于磁盘的storefile,写操作先写入memstore,当memstore中的数据达到某个阈值, hregionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile
- 当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、major compaction), 在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile
- 当一个region的所有storefile增长到一定阈值后,会把当前的region分割成两个,并由于Hmaste分配到对应的RegionServer服务器,实现负载均衡
- 客户端检索数据,先到memstore上找,找不到再找storefile
- Heregion是Hbase中分布式存储和负载均衡的最小单元,最小单元就表示不同的HRegion可以分布再不同的Hregion
版权归原作者 祺嘉朱 所有, 如有侵权,请联系我们删除。