Hbase

2 minute read

hbase是hadoop生态圈、依赖hdfs、能存储海量数据的分布式、可伸缩数据库

hbase VS hdfs hbase相比于其它数据库的优点是什么? hdfs:不支持随机修改,查询效率低,对小文件支持不友好 mysql:数据量 redis:内存贵

HBASE是列式存储,什么是列式存储? habse通过rowkey+column family + Column Qualifier + version + KeyType(类型) 唯一标识一条数据, hbase插入、更新操作其实是新插了一条数据,version+1 hbase删除操作实际上也是增加一条记录,只不过我们在KeyType里边设置为“Delete”就可以了 所以hbase类似于key-value的存储结构,hbase列式存储讲的是列族存储的概念

hbase架构是什么? 与列族存储有什么关系? https://juejin.cn/post/6844904179274629128 HBASE的角色包含client、hmaster、hregionserver、zookeeper 1、Client客户端,它提供了访问HBase的接口,并且维护了对应的cache来加速HBase的访问。 2、Zookeeper存储HBase的元数据(meta表),无论是读还是写数据,都是去Zookeeper里边拿到meta元数据告诉给客户端去哪台机器读写数据 3、HRegionServer它是处理客户端的读写请求,负责与HDFS底层交互,是真正干活的节点。 总结大致的流程就是:client请求到Zookeeper,然后Zookeeper返回HRegionServer地址给client,client得到Zookeeper返回的地址去请求HRegionServer,HRegionServer读写数据后返回给client。

HBase一张表的数据会分到多台机器上,根据rowkey来实现数据的水平切割

一个regionserver可以有多个region,每个region下面有多个store,一个列族的数据是存储在一起的,一个列族的数据是存储在一个Store里边 其实我们可以认为HBase是基于列族存储的(毕竟物理存储,一个列族是存储到同一个Store里的)

每个store内部有Mem Store、Store File、HFile mem store是内存,HBase在写数据的时候,会先写到Mem Store,当MemStore超过一定阈值,就会将内存中的数据刷写到硬盘上,形成StoreFile,而StoreFile底层是以HFile的格式保存,HFile是HBase中KeyValue数据的存储格式。 hlog类似于redo日志,我们写数据的时候是先写到内存的,为了防止机器宕机,内存的数据没刷到磁盘中就挂了。我们在写Mem store的时候还会写一份HLog。HLog是顺序写到磁盘的,所以速度还是挺快的

HRegionServer是真正干活的机器(用于与hdfs交互),我们HBase表用RowKey来横向切分表 HRegion里边会有多个Store,每个Store其实就是一个列族的数据(所以我们可以说HBase是基于列族存储的) Store里边有Men Store和StoreFile(HFile),其实就是先走一层内存,然后再刷到磁盘的结构

HMaster会处理 HRegion 的分配或转移。如果我们HRegion的数据量太大的话,HMaster会对拆分后的Region重新分配RegionServer。(如果发现失效的HRegion,也会将失效的HRegion分配到正常的HRegionServer中) HMaster会处理元数据的变更和监控RegionServer的状态。

hbase如何建表以及建表要注意什么? RowKey是会按字典序排序的,我们HBase表会用RowKey来横向切分表,HRegion上有两个很重要的属性:start-key和end-key。 我们在定位HRegionServer的时候,实际上就是定位我们这个RowKey在不在这个HRegion的start-key和end-key范围之内,如果在,说明我们就找到了。 RowKey是以字典序排序的,如果我们对RowKey没有做任何处理,那就有可能存在热点数据的问题

1,对rowkey作hash或者加盐 2,建表时预分区策略 splitFile 3,一般建议region数最多不要超过集群的rs节点数,过多region数不但不能增加表访问性能,反而会增加master节点压力

谈谈HBASE事务的理解 https://lihuimintu.github.io/2019/04/29/hbase-mvcc/ hbase保证每行的事务 HBase 不支持跨行事务,目前只支持单行级别的 read uncommitted 和 read committed 隔离级别。 每个事务只会产生一个WAL单元。这样就可以保证WAL写入时候的原子性。 HBase 是一个强一致性数据库,不是“最终一致性”数据库,个人感觉并不是

当某台 RS fail 的时候,它管理的 Region failover 到其他 RS 时, 需要根据 WAL(Write-Ahead Logging)来 redo (redolog,有一种日志文件叫做重做日志文件), 这时候进行 redo 的 Region 应该是不可用的,所以 HBase 降低了可用性,提高了一致性。

hbase 写写并发控制 提供一个基于行的独占锁来保证对同一行写的独立性。 当一个线程同时更新同一个Region中的多行记录时,使用两阶段提交协议获取锁和释放锁 支持一个 Region 的多行。跨 Region 多行事务不支持 读写并发控制 MVCC机制 hbase通过mvcc支持到rc级别 如果多个线程写入同一行的不同列族,是不需要互斥的

多个线程写同一行的相同列族,也不需要互斥,即使是写相同的列,也完全可以通过HBase的MVCC机制来控制数据的一致性

当然,CAS操作(如checkAndPut)或increment操作,依然需要独占的行锁

Updated:

Leave a comment