Hbase学习记录

1.hbase的逻辑存储结构

img

  • 1.每条数据都具有一个rowkey,其具有唯一性,相当于mysql表中的主键(primary key)。

  • 2.其次是有一个列簇,相当就是列的集合,一个列簇在对应物理存储上相当于一个文件夹,当一个列簇中的字段越来越多的时候,就需要对表进行纵向的切分,便有了列簇的概念。

  • 3.当表中的数据越来越多的时候,表就会变的越来越高,需要对表进行横向的切分,这个切片就是region。

    hbase的表其实就是kv结构的,只不过这个v是个多维的结构。

2.Hbase的物理存储结构

image-20210712142811471

由上图可以看出,在Hbase中一条数据会被当成多条来存储。每一条Hbase存储的数据都有完整的row key,列簇,列,时间戳和操作类型。

3.Hbase和mysql的对比

image-20210712143823927

4.Hbase的优势

  • 1.横向扩展:当现有服务出现瓶颈不需要停止现有的集群来提升配置,只需要在现有运行的集群中添加行的机器节点即可,一旦新的RegionServer建立完成,集群会开始重新调整。
  • 2.列式存储:Hbase是面向来存储的,
  • 每个列都单独存储,所以在Hbase中列是连续存储的,行不是。列可以动态的进行添加,列为空时就不会进行存储,节省空间。
  • 3.半结构化或者非结构化数据:Hbase支持半结构化或者非结构化的数据存储,因为对于数据字段不够确定或者杂乱无章非常难按一个概念去进行抽取的数据非常适合。
  • 4.高并发,随机读写:Hbase采用LSMT架构(log structured merge tree)进行设计,会周期性地将小文件合并成为大文件以减少磁盘访问同时减少NameNode压力。解决了HDFS不能随机读写的问题,在写入数据方面有很大的优势,特别是在pb级数据上面明显。
  • 5.自动切分:Hbase的数据是存在多个Region Server中的Region组成的,这些RegionServer又分布在不同的dataNode上面,如果一个region增长到一个阈值,为了减少负载均衡和减少IO,HBase会自动的或者手动干预将该Region切分成更小的region,也称之为subRegion。
  • 6.自动故障处理和负载均衡:Hbase是运行在HDFS之上的,Hbase的数据都是以多副本的方式来存放,数据也是分布式存放,数据的恢复可以得到保障。

5.Hbase的基本架构和原理

image-20210712153141418
  • 5.1Region Server(RS)

    是Region的管理者,其实现类是HRegionServer,主要作用:

    • 对数据的操作get,put,delete

    • 对region的操作,splitRegion,compactRegion

      Rs相当实现是在关系型数据库中DML的操作,实现的是数据的管理。

  • 5.2Master

    Master时所有RS的管理者,其实类是HMaster,主要作用:

    • 对于表的操作create,delete,alter
    • 对于region Server的操作,分配region到每一个RS,监控每一个RS的状态,负载均衡和故障转移,发现失效的RS重新为他们分配自己负责的region。
    • hdfs上面的垃圾回收,标记为删除而且经过major compact的文件。
  • 5.3zookeeper

    Hbase通过zookeeper来做master的高可用,Rs的监控元数据的入口以及集群配置的维护工作。

    • 负责Master高可用是切换工作。
    • 降低Master的负担,承担Master的部分工作。
  • 5.4HDFS

    HDFS为Hbase提供最底层的数据存储服务,同时为Hbase提供高可用的支持,底层的最终存储是构建在HDFS之上的。

6.Hbase的核心组件

image-20210712154525588

一个Rs是由一个HLog(默认是一个,1.1版本可以开启多个HLog),一个BlockCache以及多个Store组成。

  • Hlog是用来保证数据写入的可靠性,
  • BlockCache是可以将数据缓存到内存中以提升数据读取性能;
  • Region是HBase中数据表的一个数据分片,每个表中可以有多个分区,对数据的横向切分。同时一个RS上面通常会负责多个region的数据读写。一个region通常包含多个Store。
  • store存放的是对应列簇的数据,如一个表中有有两个列簇,那么在每个region中就会有两个store。每个store中有且仅有一个MemStore和多个HFile。用户数据写入时会将对应的列簇信息写入到Memstre中,同时一旦写入的数据超过了设定的阈值,系统会将Memstore中的数据落盘形成HFile文件。HFile存放在HDFS之上,是一种定制化的数据存储文件,方便用户进行数据读取。其结构关系如下图所示。

img

  • storeFile 保存数据的物理文件,StoreFile以HFile的形式存储到HDFS上,每个Store会有一个或者多个StoreFile(HFile),数据在每个StroreFile中是有序的,HFile可以理解为一种文件格式,像doc,txt等一样的概念,之不是是以key,value的形式存储。
  • MemStore写缓存,由于HFile中数据要求是有序的,所以数据是先存到MemStore中,排好序后,等到达刷写时才会刷写到Hfile中,每次刷写都会形成一个新的Hfile。
  • HLog由于数据要经过mem store排序后才会写到hfile中,但把数据保存到内存中会有很高的概率导致数据丢失,为了解决这个问题,数据在写入MemStored的同时,也会写在一个叫做write-ahead-logfile的文件中,当系统出现问题时,数据就可以通过这个日志文件来重建。wal类似于msyql的binlog,用来做灾难恢复,Hlog记录所有数据的变更,一旦数据修改,就可以从Hlog恢复,每个HRegionServer维护一个Hlog。
  • HRegion 就是所说的region,一个tabel由一个或者多个region组成,一个region可以看成table按照行切分且有序的数据块,每个region都有自身的StartKey,EndKey。一个region由一个store或者多个store来组成,每个store中都相当于一个列簇,相同列簇中的列都保存在一个store中,同一个tabel的region会分布到集群中不同的RS中以实现读写请求的负载均衡,所以一个RS中会包含来自不同table中的N个region。

7.Hbased的写入数据过程

image-20210712170751610

写入流程:写流程:
1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。
2)访问对应的 Region Server,获取 hbase:meta 表,(同时meta table是不会被split的)根据读请求的 namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
3)与目标 Region Server 进行通讯;
4)将数分别写入HLog和MemStore中,数据会在MemStore 进行排序(若MemStore中数据有丢失,则可以从HLog中进行恢复);
5)向客户端发送 ack;(当写入到内存时就可立即返回,代表写入成功,这也是Hbase,I/O高性能的保证)
6)当MemStore 的数据达到一定阈值后,将数据刷写到StoreFile文件。
7)当多个StoreFile文件达到一定大小后会触发Compact操作,合并为一个StoreFile,这里同时进行版本的合并(更新)及数据的删除
8)当Compact后会逐步形成越来越大的StoreFile,此时会触发Split操作,把当前的StoreFile进行分割,相当于一个大的Region进行分割的过程,大的Region分割成两个。