HBase 数据模型,体系架构,组件功能说明等总结

阅读本文大概需要 5 分钟。长文总结...

以下是我对HBase 的小阶段总结 ,欢迎一起来交流。

HBase表特点

数据规模大,单表可容纳数十亿行,上百万列。

无模式,不像关系型数据库有严格的Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制。

稀疏,值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩。

面向列族,面向列族的存储和权限控制,支持列族独立查询。

数据多版本,利用时间戳来标识版本。

数据无类型,所有数据以字节数据形式存储。

1、HBase的rowkey的特点及设计原则是什么?

特点:唯一确定一行数据,字典排序,最大为 64kb。

三个原则:长度原则、散列原则、唯一原则。

2、HBase列族不能很好的支持几个?调优设置一般是在哪操作

3个以及以上,宽表和长表,根据具体的业务需求。

3、HBase的数据模型说一下,包括其中具体功能和特点

rowkey

确定一行数据

按照字典进行排序

最大支持64kb的数据。

column family :

一个列族包含多个列,也即是说Hbase 的列必属于某一个列族。定义表示需要预先定义列族。

可以动态的增加新的列,权限控制以及调优都是在这一层完成。

HBase 把同一列列族的数据保存(HDFS)在同一个目录下,由多个文件组成。

cell 单元格:

由行和列的坐标交叉决定。

单元格是有版本的。

单元格的内容是未解析的节点数组。

cell中的数据是没有类型的,全部是字节码形式存贮。

Timestamp 时间戳:

HBase 中每个 cell 存储单元对同一份数据有多个版本,根据唯一的时间戳来区分版本之间的差异。不同时间版本的数据按照倒序排序,最新时间的在前面。

时间戳的类型是 64 位整型。

时间戳可以在写如数据时自动生成。精确到毫秒,也可以由客户端显式的赋值。

Hlog (WAL):

Hlog 用来做 Hbase 数据的恢复机制,它既是一个简单的 HadoopSequenceFile 。

HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括 sequence number和timestamp,timestamp是”写入时间”,sequence number的起始值为0,或者是最近一次存入文件系统中sequence number。

HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。

HBase 存储半结构化或者非结构化的数据。

4、HBase的体系架构是什么样的?

5、HBase的体系架构中个功能模块具体负责什么?

Client:包含访问HBase的接口并维护cache来加快对HBase的访问

HMster:为Region server分配region;

负责Region server的负载均衡;

发现失效的Region server并重新分配其上的region;

管理用户对table的增删改操作;

Zookeeper:

保证任何时候,集群中只有一个master;

存贮所有Region的寻址入口。

实时监控Region ser ver的上线和下线信息。并实时通知Master

存储HBase的schema和table元数据。

RegionServer:

Region server维护region,处理对这些region的IO请求

Region server负责切分在运行过程中变得过大的region

Region:

HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据;每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region(裂变);

当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Regionserver 上。

Store:

memstore:写操作先写入memstore,当memstore中的数据达到某个阈值,hregionser ver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile;当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、majorcompaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的storefile

storefile:当一个region所有storefile的大小和超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionser ver服务器,实现负载均衡

客户端检索数据,先在memstore找,找不到再找storefile• – HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示

不同的HRegion可以分布在不同的 HRegion server上。

• – HRegion由一个或者多个Store组成,每个store保存一个columns family。

• – 每个Strore又由一个memStore和0至多个StoreFile组成。如图:StoreFile以HFile格式保存在HDFS上。

6、为什么这样一张完整的表被保存在多个Regionserver 上?

分布式问题一般都是规模的问题,这里的规模也可以了解为计算和存储的需求。解决单机的压力,更好的一种方式是增加节点,进行水平扩展,成本更低,这是需要考虑数据的分片和复制问题。从访问者(客户端)的角度,好需要解决数据的路由问题,即请求应该发送到那台机器上去处理。数据分片(解决单机的压力,提升整体的性能),副本(提高数据的容错和访问的吞吐量)。

HBase 数据分片以表进行,按照行为粒度,按照 rowkey 的范围进行拆分,每一个分片就是一个 Region 。以行为粒度就是这一行数据要么在这个机器上,要么在别的机器上,不会被切开的。HBase 的副本数是由 HDFS 来实现的,所以 HBase 的分片和副本是解耦的。一张表的数据和访问能够均匀的分布在整个集群中,从而得到最好的资源利用率和服务质量,即达到负载均衡。当集群进行扩容、缩容时,我们希望这种“均衡”能够自动保持。如果数据分布未能实现负载均衡,则负载较高的机器很容易称为整个系统的瓶颈,这台机器的响应慢,可能导致客户端的大部分线程都在等待这台机器返回,从而影响整体吞吐。所以,负载均衡是region划分和调度的重要目标。一张表拆分开的 Region 可以分不到多个 RS 上。一个 RS 也可以调度多张表的 Region。

有三层数据负载均衡的问题:

数据的逻辑分布:region 与 rowkey 的映射关系。

数据的物理分布:region 在 Rs 上的调度问题。

访问的分布:吞吐量分布在各个 rs 上,即 数据量与访问量之间的关系,涉及到热点问题。

可见,存在两层路由,第一层是 rowkey 找到 region ,第二层是 region 找到 Rs 。

一个region负责的rowkey范围是一个左闭右开区间。基于范围进行的分片方式,需要一个元数据表来记录一个表被划分为哪些region,每个region的起止rowkey是什么。这个元数据表就是meta表,在HBase1.x版本中表名是“hbase:meta”(在094或更老的版本中,是-ROOT-和.META.两个元数据表)。

我们从Put操作来简要的了解region的定位过程。

ZK上找meta表所在的RS(缓存)

到meta表上找rowkey所在的region及这个region所在的RS(缓存)

发Put请求给这个RS,RS根据region名字来执行写操作

如果RS发现这个region不在自己这里,抛异常,客户端重新路由

为了降低客户端对meta表的访问,客户端会缓存region location信息,当且仅当缓存不正确时,才需要访问meta表来获取最新的信息。

Hbase的数据分布与region调度问题,放大到整个分布式系统中,是任务的拆分与调度问题。

7、HBase中如何才会裂变?说一说具体过程和原因。

数据在更新时会首先写入WAL 日志和内存中,在内存中的数据是排序的,当 MemStore 累积到一定阈值的时候,就会创建一个新的 MemStore 并且将老的 MemStore 添加到Flush 队列中,有单独的线程 flush 到磁盘中,成为一个 StoreFile 。

StoreFile是可读的,一旦创建就没有办法修改了,所以之后进来的数据(不管是新增还是更新数据),都会经历内存到写到一个新的 StoreFile 的过程,但是随着 StoreFile 的数量一致积累到一定阈值,此时会触发Compact 操作,即把所有的小文件(StoreFile)里面的数据根据 row key进行版本合并和删除,生成一个大的 StoreFile, 单个StoreFile 的大小超过一定的阈值,会触发Split 操作,把当前的 Region 等分成两个 Region。新的两个 Region 会被分配到 Hsmater 分配到对应的 HRegionServer 上。

8、HBase强依赖与zookeeper吗?

使用zookeeper 来保证集群中只有一个 HMaster。

存储 region 的寻址入口

保存HBase 的schema,table meta信息。

监听 Rs 的健康状况,通知 HMaster

9、HBase的基本使用命令。

10、HBase支持where吗,如何解决?

HBase 仅支持两种查询方式:1.按指定RowKey获取唯一一条记录,get方法 2.按照指定RowKey的范围来获得,scan 方法。

其中,1、scan可以通过setCaching与setBatch方法提高速度(以空间换时间);2、scan可以通过setStartRow与setEndRow来限定范围。范围越小,性能越高。scan可以通过setFilter方法添加过滤器。

如果对您有帮助,欢迎点赞、关注、转发。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181202G1A2UM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券