HBase面试题(二)

读请求过程

  • meta表是hbase系统自带的一个表。里面存储了hbase用户表的元信息。
  • 元信息为meta表内记录一的行数据,是用户表一个region的start key 到endkey的范围。
  • meta表存储在regionserver里。 具体存储在哪个regionserver里?zookeeper知道。

过程:

  1. 客户端到zookeeper询问meta表在哪
  2. 客户端到meta所在的节点(regionserver)读取meta表的数据
  3. 客户端找到region 获取region和regionserver的对应关系,直接到regionserver读取region数据

写请求过程

  1. Client先访问zookeeper,找到Meta表,并获取Meta表元数据。确定当前将要写入的数据所对应的HRegion和
    HRegionServer服务器。
  2. Client向该HRegionServer服务器发起写入数据请求。
  3. Client先把数据写入到HLog,以防止数据丢失,然后将数据写入到Memstore。
  4. Memstore达到阈值,会把Memstore中的数据flush到Storefile中
  5. 当Storefile越来越多,达到一定数量时,会触发Compact合并操作,将多个小文件合并成一个大文件。
  6. Storefile越来越大,Region也会越来越大,达到阈值后,会触发Split操作,变成两个文件。

说明:hbasez 支持数据修改(伪修改),实际上是相同rowkey数据的添加。hbase只显示最后一次的添加

region的分配过程

前提:一个region只能分配给一个region server

  1. master记录了当前有哪些可用的region server。以及当前哪些region分配给了哪些region
    server,哪些region还没有分配。
  2. 当需要分配的新的region,并且有一个region server上有可用空间时,master就给这个region
    server发送一个装载请求,把region分配给这个region server。
  3. region server得到请求后,就开始对此region提供服务。

region server上线

前提:master使用zookeeper来跟踪region server状态。

  1. 当某个region server启动时,首先在zookeeper上的/hbase/rs目录下建立代表自己的znode。
  2. master订阅了/hbase/rs目录上的变更消息,当/hbase/rs目录下的文件出现新增或删除操作时,master可以得到来自zookeeper的实时通知。因此一旦region
    server上线,master能马上得到消息

region server下线

前提:master使用zookeeper来跟踪region server状态。

  1. 当region server下线时,它和zookeeper的会话断开。
  2. zookeeper而自动释放代表这台server的文件上的独占锁(znode)
  3. zookeeper将变化发送给master
  4. master 将挂掉的region server的region分配给其它还活着的regionserver

Hmaster的上线

前提:hbase集群中可以设置多个Hmaster,真正对外提供服务的只有一个

  1. 从zookeeper上获取唯一 一个代表active master的锁,用来阻止其它master成为真正的master。
  2. 扫描zookeeper上的/hbase/rs节点,获得当前可用的region server列表。
  3. master和每个region server通信,获得当前已分配的region和region server的对应关系。
  4. master扫描.META.表,计算得到当前还未分配的region,将他们放入待分配region列表。

Hmaster下线后的影响

master只维护表和region的元数据,不参与表数据IO的过程,所以master下线短时间内对整个hbase集群没有影响。表的数据读写还可以正常进行。

  • 无法创建删除表
  • 无法修改表的schema
  • 无法进行region server的负载均衡(对象region)
  • 无法处理region server 上下线
  • 无法进行storeFile的 合并(region的split可以正常进行)

当hmaster下线后,启动Zookeeper的选举机制,选出新的Hmaster,新的Hmaster上线,执行上线流程。

flush机制

  • 全局的memstore的flush机制默认为堆总大小(多个memstore 多个region)的40%,超过该大小会触发flush到磁盘的操作,会阻塞客户端读写,flush将所有的memstore全部flush.
  • 单个的memstore默认为数据达到128M1h或者数据为堆大小 0.95倍将会flush.
  • memstore默认将会先提前flush 5M.(先flush一小部分,等后面数据达到阈值在flush后 面的数据) 这样会比一次flush效率高

hbase不建议配置过多列族:过多的列族会消耗大量的内存,同时数据在flush时消耗磁盘IO. 一个regionserver续写操作可用堆内存的80%,读取占用40% ,写入占用40%。这两个参数直接影响hbase读写性能。

HBase的基本介绍

  • Hbase是建立在hdfs之上的一个数据库
  • 支持的数据类型:byte[]
  • 不支持join等SQL复杂操作
  • 依靠横向扩展,一个表可以有上十亿行,上百万列
  • 面向列(族)的存储和权限控制
  • 对于为空(null)的列,并不占用存储空间,是一个稀疏表。

HBASE的适用场景

海量数据、精确查询、快速返回

  • 海量数据:数据量的背景
  • 精确查询:业务场景
  • 快速返回:业务对时效性的要求

Hbase和Hadoop之间的关系

HDFS:

  • 作用:海量数据存储
  • 适合一次性扫描大量数据
  • 适合一次写入多次读取
  • 不适合频繁更新的数据

HBASE:

  • 适用一次扫描少量数据
  • 适合多次写入多次读取
  • 支持数据更新和删除

Hbase与RDBMS的关系

RDBMS :

  • 支持SQL查询
  • 支持事务
  • 支持Join

HBASE :

  • 不支持SQL查询
  • 不支持事务
  • 不支持Join

Hbase详细架构

Client:

  • 访问数据的入口,
  • 包含访问hbase的API接口,
  • 维护着一些cache来加快对hbase的访问

Zookeeper:

  • zookeeper的选举机制保证任何时候,集群中只有一个master
  • 实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master
  • 存储Hbase的schema
  • 存储所有Region的寻址入口

Master:

  • 为Region server分配region
  • 负责region server的负载均衡
  • 发现失效的region server并重新分配其上的region
  • 处理schema(元数据)更新请求
  • Hmaster短时间下线,hbase集群依然可用,长时间不行。

Region server:

  • Region server维护Master分配给它的region,处理对这些region的IO请求

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

Row Key

  • 最大长度是 64KB
  • 完全可以自行设计
  • Hbase会对表中的数据按照rowkey(字典序)排序

列族Column Family

  • 列族是表的schema的一部分,而列不是。
  • (schema包含表名和列族)
  • 每个列都所属于某一个列族。
  • 一个列族可以包含多个列。
  • 一个列族与列的关系是一对多。

时间戳

  • 时间戳标记一个数据的不同版本
  • 时间戳可以由hbase在数据写入时自动 赋值
  • hbase支持工程师自己定义时间戳
  • 每个 cell中,不同版本的数据按照时间倒序排序

hbase本身提供数据回收机制

  • 保存数据的最后n个版本
  • 保存最近一段时间内的版本

什么是Cell

  • 存储数据的最小单位
  • 由{row key, column( = + ), version} 唯一确定的单元确定一个精确的数据

什么是VersionNum

  • VersionNum是数据的版本号
  • VersionNum的默认值为系统时间戳

hbase物理存储

在这里插入图片描述

  • 一个regionserver内部可以有多个region,这多个region可能来自多个表或一个表
  • 一个region只能属于一个regionserver.
  • 一个regionserver只有一个HLog
  • 一个region里面可以有多个store
  • 一个store里面只有一个memstore与0个或多个storeFile
  • storeFile的数据类型为HFile

region的切分

  • region按大小分割(默认10G)
  • 每个表一开始只有一个region,随着数据的增加,一个region逐渐变大,达到 10G,进行分裂,等分成两个region.

Memstore与storefile

  • 一个region由多个store组成
  • 每个store包含一个列族的所有数据
  • Store包括位于内存的memstore和位于硬盘的 storefile
  • 客户端检索数据时,先在memstore找,找不到再找storefile

HLog(WAL log)

每个Region Server维护一个Hlog,而不是每个Region对应一个Hlog.

Hlog的切分机制

  • 当数据写入hlog以后,hbase发生异常。关闭当前的hlog文件
  • 当日志的大小达到HDFS数据块的0.95倍的时候,关闭当前日志,生成新的日志
  • 每隔一小时生成一个新的日志文件

HBase的特征:

  • 海量存储

Hbase适合存储PB级别的海量数据,在几十到百毫秒内返回数据。

  • 列式存储

列族理论上可以很多,但实际上建议不要超过6个

  • 极易扩展

处理能力(RegionServer)的扩展,是基于存储的扩展(HDFS)
hbase在最初设计的时候就考虑了扩展性。

  • 高并发

在并发的情况下,Hbase的单个IO延迟下降并不多

  • 稀疏

在列数据为空的情况下,是不会占用存储空间的。

compact机制

  • 默认3个小的storeFile文件达到三个,合并成大的Storefile文件

split机制

  • 默认一个HFile达到10Gb的时候就会进行切分

hbase预分区的优点

  • 增加数据读写效率:数据分布在多台regionserver节点
  • 负载均衡,防止数据倾斜:当数据时离散的发送时,预分区可以解决数据倾斜
  • 方便集群调度region: 分布在多个节点便于调度
  • 优化Map数量

rowKey的获取方式

  • 通过rowkey直接查找
  • 通过startkey endkey 范围查找
  • 全表扫描

rowkey的长度原则

  • 最大64K,建议在保证业务需求的前提下越短越好,最好不要超过16个字节.

rowkey散列原则

  • 建议将rowkey的高位(左边)作为散列字段, 低位(右边)放时间字段,这样将提高数据均衡分布在每个
    RegionServer,以实现负载均衡的几率。

若不按照此原则:

  • 让时间戳作为高位,数据将按照时间的顺序进行存储会引发热点问题

什么是热点问题

  • 当有一点时间业务数据爆炸增长时,这个阶段的数据将存储在少数的节点上。

如何解决热点问题

原则:将分散的数据,放在rowkey的高位

  • 哈希(随机数):将哈希值放在高位
  • 反转:反转固定长度或者数字格式的数据(时间戳反转手机号反转订单号反转
  • 加盐:本质时是加随机数,并且放在高位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值