Hadoop之HBase基本简介

目录

1.HBase的基本概念

2.HBase的工作流程


1.HBase的基本概念


1.1基本概念

  • HBase运行在HDFS上,所以HBase中的数据以多副本形式存放,数据也服从分布式存放,数据的恢复也可以得到保障。
  • HBase支持横向扩展,这就意味着如果现有服务器硬件性能出现瓶颈只需要在现有的正在运行的集群中添加新的机器节点即可。
  • HBase是面向列存储非关系型数据库,每个列都单独存储,所以在HBase中列是连续存储的,而行不是,区别于关系型数据库。
  • HBase不支持事务,适合结构化数据和非结构化数据,只需要建立表表的列簇即可,不需要单独的在创建列

1.2基本结构组成

1.2.1HMaster

  • 监控RegionServer,处理RegionServer故障转移,处理region的分配或移除,在空闲时间进行数据的负载均衡,通过Zookeeper发布自己的位置给客户端

1.2.2RegionServer

  • 负责存储HBase的实际数据,处理分配给它的Region,刷新缓存到HDFS,可以维护HLog,可以执行压缩,负责处理Region分片
  • 内含组件:
  • Write-Ahead logs
  • HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。如果机器突然原地爆炸,把数据保存在内存中会引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
  • HFile 和 Store
  • HFile存储在Store中对应列簇中的一个列(存放于DataNode中),一个Store对应HBase表中的一个列族
  • MemStore
  • 内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
  • Region
  • Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region

1.2.3Zookeeper

  • HMaster与HRegionServer 启动时会向ZooKeeper注册,存储所有HRegion的寻址入口,实时监控HRegionserver的上线和下线信息,并实时通知给HMaster,存储HBase的schema和table元数据;
  • Zookeeper的引入使得HMaster不再是单点故障。一般情况下会启动两个HMaster,非Active的HMaster会定期的和Active HMaster通信以获取其最新状态,从而保证它是实时更新的

Hadoop之HBase基本简介


2.HBase的工作流程


2.1读数据流程

  • HRegionServer保存着meta表以及表数据,要访问表数据,
  • 首先Client先去访问zookeeper,从zookeeper里面获取meta表所在的位置信息,即找到这个meta表在哪个HRegionServer上保存着,
  • 接着Client通过刚才获取到的HRegionServer的IP来访问Meta表所在的HRegionServer,
  • 然后扫描所在HRegionServer的Memstore和Storefile来查询数据,
  • 最后HRegionServer把查询到的数据响应给Client。

2.2写数据流程

  • ​​​​​​​Client也是先访问zookeeper,找到Meta表,并获取Meta表元数据。
  • 确定当前将要写入的数据所对应的HRegion和HRegionServer服务器。
  • Client先把数据写入到HLog,以防止数据丢失。
  • 然后将数据写入到Memstore
  • 如果HLog和Memstore均写入成功,则这条数据写入成功。
  • 如果Memstore达到阈值,会把Memstore中的数据flush到Storefile中。在·
  • 当Storefile越来越多,会触发Compact合并操作,把过多的Storefile合并成一个大的Storefile(对HDFS友好)。
  • 当Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,将Region一分为二。

2.3进行预分区

  • 为了负载均衡,防止数据倾斜;
  • 每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护;
  • create 'staff','info',SPLITS => ['1000','2000','3000','4000'],指定表名和列簇名