Hbase总结

183 阅读6分钟

Hbase的定义

高性能的,不完全支持ACID,分布式,易拓展,列式Nosql数据库。

适合场景:适合数据报表分析,不适合实时数据
缺点
1.原生不支持表连接,group by语法,如果需要sql分析,可以与Hive和phoneix集成
2.架构复杂(需要额外维护一套zookeeper集群,也依赖于Hadoop的服务),少量数据下无法发挥优势,只有海量数据下才能发挥优势

Hbase的架构

Hbase各个组件的作用:

Hmaster:

  •         管理用户对表的增加、删除、修改、查询等操作。
    
  •         实现不同HRegionServer之间的负载均衡。
    
  •         在Region分裂或合并后,负责重新调整Region的分布。
    
  •         对发生故障失效的HRegionServer上的Region进行迁移。
    
  • HRegionServer:
  •            负责存储和维护分配给自己的Region。
    
  •            处理来自客户端的读写请求。
    

client:

  •        并不是直接从HMaster主服务器上读取数据,而是在获得Region的存储位置信息后,直接从HRegionServer上读取数据。
    
  •      客户端并不依赖HMaster,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和HMaster通信,这种设计方式使得HMaster负载很小 
    

zookeeper:

  • 保证任何时候,集群中只有一个活跃的master,因为为保证安全性会启动多个Master。
  • 存储所有Region的寻址入口。知道那个Region在哪台机器上。
  • 实时监控Region Server的状态,将Region Server的上下线的信息汇报给HMaster。(因为每间隔一段时间,RegionServer与Master都会zookeeper发送心跳信息),Region Server不直接向Master发送信息的原因是为了减少Master的压力因为只有一个活跃的Master,所有的RegionServer同时向他汇报信息,压力太大。而若有100台RegionServer时,Region Server可以分每10台向一个zookeeper汇报信息,实现zookeeper的负载均衡。
  • 存储Hbase的元数据(Schema)包括,知道整个Hbase集群中有哪些Table,每个 Table 有哪些column family(列族)。

image.png

Hbase的表的解析

Hbase逻辑结构像传统的表,但底层物理结构更符合K-V类型的存储结构。而K-V类型的特点,使得Hbase支持高并发。Hbase可保存多版本数据,默认最新的三个版本的数据,按照时间戳来区分版本号(可修改)。

逻辑结构

了解Hbase的表的逻辑结构之前,我们先说明Hbase的几个专有名词的具体含义:

  • rowkey:前面说到了hbase的表的物理结构更像k-v结构,是因为rowkey起到了key的作用,rowkey是唯一的,数据只能按照rowkey检索
  • row:row是属于逻辑上的概念,row指rowkey代表的一行数据
  • column Family:列族是表结构下面的一个单位,列族是具体的,需要特别指定,列族下可以有多个列,但列无需提前指定
  • Column Qualifier:标识一个列归属于哪个列族,列依赖于列族
  • store:一个列族的保存的数据(包含rowkey)逻辑上归属于一个store
  • region:region是表存储数据的最小单位,一张表初始只有一个region,当数据量够大时会发生分裂,region包含一个rowkey的多个列族,一张表可以有多个region,region分别部署在不同的server上,但是一个region只能部署在一个server上

image.png

物理结构

hbase的表的物理结构比逻辑结构简单多了,简略说一下:

  • storefile:storefile是store下的单位,一个store下可以有多个storefile,,但过多的storefile可能影响性能
  • cell:cell是物理意义上的最小的一条具体数据,包含了rowkey,timestamp等,Hbase只保存字符串数据

image.png

Hbase的读写流程

Hbase的写流程

Hbase的数据可靠性依靠WAL,依靠预写日志的方式,现将数据写入Hlog,再写入Hbase

image.png

  • client请求zookeeper,获取表的meta信息,获取目的的表在哪个regionserver中,并将请求信息缓存到client的meta信息中
  • 请求regionserver,获取具体的region,现将数据写入Hlog中(wal),再写入metastore,并向客户端确认写入
  • metastore刷写机制到了,再写到storefile

Hbase的读流程

image.png

  • Client先访问zookeeper,获取hbase:meta表位于哪个Region Server。
  • 访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问。
  • 与目标Region Server进行通讯;
  • 分别在Block Cache(读缓存),MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
  • 将查询到的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache。
  • 将合并后的最终结果返回给客户端。

Hbase的文件合并和分裂

Region的分裂

region的store带下超过阈值时候(默认为256M),会分裂成两个region,分裂时服务不可用,高并发情况下,对服务影响较大,可根据参数hbase.hregion.max.filesize调整

  • region所在regionServer创建splits目录;

  • 关闭要分裂的region的读写请求;

  • 在splits目录中创建所需要的文件结构;

  • 移动两个新region文件目录到目录表中,并更新.META表;

  • 异步复制父region中的数据到两个子region中(最主要的消耗时间);

  • 复制完成后、打开两个新产生的region,并上线,可以接收新的读写请求;

  • 异步任务把定时把原来被分裂的region从.META表中清除掉,并从文件系统中删除该region所占用的空间

Region的合并

  • 随着MemStore不断有数据写入,当MemStore的大小超过配置或默认大小的时候,HBase会把MemStore中的数据刷新到HDFS中,生成新的StoreFile文件 ,当一个region中包含的StoreFile文件数目超过配置地的阈值,后台合并任务,会把这些文件合并成数量更少,体积更大的文件。
  • 当这个过程持续到这些文件 中最大的StoreFile文件 超过配置最大存储文件 大小时,此时会触发一个region拆分操作,减少读取过程中的IO

Hbase的优化

减少列族的数量,一个列族会分配一个metasotore,过多的metastore(小文件)会触发flush,触发compaction写入hfile,compaction的机制
设计rowkey,确保以原则:

  • 一 确保rowkey唯一性
  • 二 rowkey应散列分散存储,减少regionserver的负载压力
  • 三 rowkey不能太长