HBase知识点

1. HBase简介

1.1 定义

Apache HBase™是Hadoop数据库,这是一个分布式,可扩展的大数据NoSQL数据库。

1.2 架构图

在这里插入图片描述
角色作用:
1)HMaster

  • HMaster是所有Region Server的管理者
  • 为region server 分配region;
  • 负责region server的负载均衡,region分裂完成监控;
  • 处理schema更新请求,数据表的创建,更新;
  • HDFS上的垃圾文件回收;
  • 发现失效的region server并重新分配上面的region;

2)HRegionServer

  • 切分过大的region,合并region;
  • 维护master分配的给的region,并处理这些io请求;
  • 负责数据的读写功能,如果hmaster挂了,不影响数据的读写操作。

3)Zookeeper

  • Hbase启动的时候将hbase系统表加载到zk cluster,zk cluster获取当前表上有的regionserver信息;
  • HRegionServer向zookeeper注册,提供是否还在线的信息;
  • 实现Hmaster的高可用,避免单点故障;

4)WAL

  • 由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写入Write-Ahead logfile的文件中,然后再写入到Memstore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

5)MemStore

  • 写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile。

6)StoreFile

  • 保存实际数据的物理文件,StoreFile以HFile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在StoreFile上是有序的。

1.3 数据模型

HBase数据存储结构中主要包括:表、行、列族、列限定符、单元格和时间戳。
HBase的逻辑数据模型:
HBase的逻辑数据模型
HBase的物理存储模型:
在这里插入图片描述
1)Name Space

  • 命名空间,类似于关系型数据库的DataBase概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase的内置表,default表示用户默认使用的命名空间。

2. HBase 的读写流程

2.1. HBase的写流程

在这里插入图片描述

  • 1.Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。

  • 2.访问对应的 Region Server,获取 hbase:meta 表,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。

  • 3.与目标 Region Server 进行通讯;

  • 4.把数据分别写到Hlog和memstore各一份

    • 当memstore达到阈值后把数据刷成一个storefile文件,当compact后,逐渐形成越来越大的storefile后触发spilt,把当前的StoreFile分成两个,这里相当于把一个大的region分割成两个region
    • 若MemStore中的数据有丢失,则可以从HLog上恢复,当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile,这里同时进行版本的合并和数据删除
  • 5.写完成
    也可参考下图
    在这里插入图片描述

2.2. HBase的读流程

在这里插入图片描述

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

3. HBase RowKey的设计

3.1. HBase RowKey的设计原则

Hbase中Rowkey可以唯一标识一行记录,在Hbase查询的时候,有以下几种方式:

  • 通过get方式,指定rowkey获取唯一一条记录

  • 通过scan方式,设置StartRow和EndRow参数进行范围匹配

  • 全表扫描,即直接扫描整张表中所有行记录

1)Rowkey长度原则

Rowkey是一个二进制码流,可以是任意字符串,最大长度 64kb ,实际应用中一般为10-100bytes,以 byte[] 形式保存,一般设计成定长。

建议越短越好,不要超过16个字节,原因如下:

  • 数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
  • MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。
  • 目前操作系统都是64位系统,内存8字节对齐,控制在16个字节,8字节的整数倍利用了操作系统的最佳特性。

2)rowkey散列原则

如果rowkey按照时间戳的方式递增,不要将时间放在二进制码的前面,建议将rowkey的高位作为散列字段,由程序随机生成,低位放时间字段,这样将提高数据均衡分布在每个RegionServer,以实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。

3)rowkey唯一原则

必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的,因此,设计rowkey的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。

3.2. 热点问题及解决方案

什么是热点?

HBase中的行是按照rowkey的字典顺序排序的,这种设计优化了scan操作,可以将相关的行以及会被一起读取的行存取在临近位置,便于scan。然而糟糕的rowkey设计是热点的源头。 热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。 设计良好的数据访问模式以使集群被充分,均衡的利用。

为了避免写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应该被写入集群的多个region,而不是一个。

热点解决办法及优缺点:

  • 盐析:在rowkey的前面增加随机数,具体就是给rowkey分配一个随机前缀以使得它和之前的rowkey的开头不同。分配的前缀种类数量应该和你想使用数据分散到不同的region的数量一致。加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。
  • 哈希:哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据
  • 反转:第三种防止热点的方法时反转固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样可以有效的随机rowkey,但是牺牲了rowkey的有序性。反转rowkey的例子以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,这样的就避免了以手机号那样比较固定开头导致热点问题
  • 时间戳反转:一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用 Long.Max_Value - timestamp 追加到key的末尾,例如 [key][reverse_timestamp] , [key] 的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。比如需要保存一个用户的操作记录,按照操作时间倒序排序,在设计rowkey的时候,可以这样设计[userId反转][Long.Max_Value -timestamp],在查询用户的所有操作记录数据的时候,直接指定反转后的userId,startRow是[userId反转][000000000000],stopRow是[userId反转][Long.Max_Value - timestamp]如果需要查询某段时间的操作记录,startRow是[user反转][Long.Max_Value - 起始时间],stopRow是[userId反转][Long.Max_Value - 结束时间]
  • 建表时进行预分区处理: 默认情况下,在创建Hbase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个Region写数据,知道这个Region足够大了才进行切分。我们通过预先创建一些空的Regions,这样当数据写入Hbase时,会按照region分区情况,在集群内做数据的负载均衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值