Hbase入门必看

hbase是一个开源的,分布式的,版本化的,非关系型数据库,hbase依赖于HDFS存储

hbase的特点

一个表可以有数十亿行,上百万列
无模式:每行数据都有一个唯一的主键和任意多的列,列可以动态的增加
稀疏:关于null的列不存储
数据多版本:每个cell中的数据可以有多个版本
缺点:不支持小文件,不支持并发写,不支持随机修改,查询效率低

数据结构

rowkey
决定了一行数据的唯一标识(一行里可以有多个列)
rowkey是按照字典顺序排序的
rowkey最多只能存储64K的字节数据
rowkey的设计:https://blog.csdn.net/qq_43755771/article/details/90720805

column family
hbase中每个列都要归属于一个列族,列族必须为表的模式定义的一部分,定义表的时候就要先给出
列名以列族作为前缀,每个列族可以有多个成员
新的列族成员(列)可以按需添加
同一个列族里面的数据存储在同一个目录下,由几个文件保存
目前为止hbase的列族建议不超过3个(一般情况就就一个列族)

timestamp
hbase每个cell存储单元对同一份数据有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同的版本数据按照时间倒序
最新的数据版本在最前面
时间戳的类型是64位整数
时间戳可以由hbase写入时自动复制,就是精确到毫秒的系统时间
时间戳也可以由客户赋值,如果应用需要避免版本冲突,就不生成唯一的时间戳

cell
由rowkey,列族:列名 version 来确定唯一的单元
单元格式有版本的(时间戳就是版本)
单元格的内容是未解析的字节数组,cell中没有类型,全是字节码形式存在

hbase与关系型数据库的对比

关系型数据
数据按行存储
没有索引的查询会使用大量IO
建立索引和视图需要大量的时间和资源

列式数据库
数据按列存储
数据即使索引
大量降低查询涉及的IO,因为只访问查询涉及的列

hbase 和 HDFS的对比

两者都可以扩展,都有良好的容错性
HDFS适合批处理场景
不支持随机查找
不支持数据增量处理
不支持数据更新

体系结构

在这里插入图片描述
client
负责与hmaster(进行管理类操作)和hregionserver进行通讯(数据读写操作)

zookeeper
监控hm的状态,主备选举。hr以临时节点的注册到zk中,hm监控hr的状态。zk中
记录了root表的位置

hmaster
管理用户对表的增删改查
管理hregionserver的负载均衡,调整region分布
在region split后,调整region的分配
一旦hregionserver宕机,负责失效的hregionserver中的region进行迁移

region
当表大小超过设置值的时候(默认是10G)hbase回将表自动的划分不同的区域,每个区域包含所有行的一个子集
对用来说,每个表就是一堆数据的集合,靠主键区分。从物理上说,一张表被切成了多个块,每个块就是一个region
我们用表名+开始/结束主键,来区分每一个region,一个region会保存一个表里面一段连续的数据,从开始主键开始
到结束主键结束。也就是说一张表是保存在多个region上面。

hregionserver
所有的数据库数据保存在HDFS上,用户通过hregionserver获取这些数据,一台机器运行hregionserver,每个region由一个hregionserver去维护。hregionsever内部管理了一系列的hregion对象,每个hregion对象对应一个region。
region由多个store组成,每个store对应了一个列族的存储。列族是一个集中的存储单元。
每个store两部分组成:memstore,storefile
为什么要有memstore?
1)由于HDFS是不可被修改的,为了让数据顺序的存储而提高读取效率,而这个时候Hbase就使用了B+树的结构来进行数据存储,数据会先在Memstore中整理成B+树,最后在刷新数据到HFile上,而读取的时候专门存在一个缓存BlockCache,这个blockCache如果开启了,就会先读blockcache,如果读不到内容,才会到Hfile+MemStore中去读取
2)优化数据的存储,比如一个数据添加后马上就删除了,这样刷新数据的时候就可以不把这种的数据刷新到HDFS上

hfile
storefile以hfile的形式存在HDFS上
hfile是数据存储的实际载体,我们创建的表,列,数据,都存储在hfile中hfile由一个一个的块组成的,在hbase中一个块大小默认为64Kb,由列族上的blocksize属性定义的
compact和split
在写memstore的时候会写日志,以防数据丢失。这种机制是wal log(预写日志)
每个hregionserver上有一个hlog,hlog会定期滚动出新的

Hbase如何读取数据?

“三表查询” root→meta→region
root表:就是meta表的索引,root表的位置信息存在ZK上,root表不会再拆分
meta表:存的是region的索引信息
region 0-9999

Hbase如何写数据?

用户预写完日志后写入的数据会先放入memstore中memstore达到一定大小的时候会flush到磁盘就形成了storefile
在这里插入图片描述
storefile是0个到多个,当storefile的数量达到阀值时会进行合并(两种)将多个storefiles合并成一个。合并之后storefile会越来越大,达到一定阈值后(默认10G),会触发split操作,同时把当前的region分成两个region,父region下线,新的region会被分配到hregionserver上去管理(数据的分流)

Hbase的优化

https://blog.csdn.net/qq_43755771/article/details/90720367

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值