Flume

Hbase

Hbase是Apache提供的一个基于hadoop,分布式,可扩展,菲关系型的数据库,不支持sql,hbase底层是基于键值对来存储的,存储数据采用的是列存储思想,

Hbase细节

Hbase适合存储稀疏的数据,结构化,非结构化。Hbase中如果想删除一个表,必须先禁用这个表,在建立表的时候如果不指定名称空间,默认在default下,hbase基于hadoop存储也就是基于HDFS存储,hbase提供了完整的增删改查的功能,其中的改并不是真的改,在每添加一条数据后面都会加一个时间戳,读取数据返回最新的时间戳,时间戳称为数据的版本号,在不指定的情况下默认只返回一个版本的数据,如果需要多个版本需要建表时指定保留版本。

Hbase的六大特点:

1.    
表大,一个表可以有数亿行,上百万列。

2.    
无模式,列可以动态增加,同一表中,不同行可以有截然不同的列。

3.    
面向列,hbase是面向列的存储和权限控制,列族独立索引。

4.    
稀疏,表可以设计的非常稀疏,空列并不占用空间。

5.    
数据类型单一,hbase中没有类型,都是字符串

6.    
数据多版本,每个单元的数据可以有多个版本,默认情况下的版本号自动分配,是单元格插入的时间戳。

行键-Rowkey

等价关系型数据库中的主键,行键不需要指定,在添加数据时候指定,行键默认是按照字典序排序。

列簇

在hbase中,不关注列,关注的是列族,建表时不需要指定列,但需要指定列族,列可以动态增删的,一个列族就相当于一个数据库的一个表,一个列族可以有多个或0个列。,没张表中至少包含一个列族。

名称空间

类似数据库中的databases,需要指定,如果不指定默认在default下

单元格

行键+列族+列+时间戳锁定一个单元格,每一个单元格都包含一个时间戳。

Hbase的基本结构

将表按照行键方向来切分。切分出来的每一个部分是HRegion,一个表中至少有一个HRegion,而每一个HRegion都分配给一个HRegionServer去管理。因为行键是有序的,所有每个HRegion之间数据是不会交叉的,HRegion管理数据而不是存储数据,数据最终落地到HDFS上,HRegionServer是管理HRegion。,当HRegion达到一定限度时候默认是10G,会分裂成俩个HRegion,另一个交给另一个HRegionServer去管理,数据不会变动。

一个HRegion包含一个到多个HStore,HStore个数由列族决定,

每个Hstore包含一个memStore,和0个或多个HFile,hbase最终是存储到Hfile上,最终落地到HDFS上

Zookeeper在hbase中的作用:

当hbase启动时候,会在zookeeper上建立一个临时节点/hbase,当Active Hmaster启动的时候会在zookeeper上建立一个临时节点/hbase/active-Hmaster.,Hmaster会通过心跳机制去维持临时节点,一旦Active Hmaster宕机,对应的心跳就没了 临时节点也就消失了,zookeeper就知道从哪个Backup HMaster 重新找一个切换为Active

当Backup
HMaster启动的时候也会在/hbase/backup Master创建一个临时节点,HRegion启动时也会在zookeeper上创建一个临时节点。

Zookeeper相当于中间人

HMaster

在Hbase中HMaster的个数不受限制,可以任意启动多个HMaster,实际过程中HMaster的个数一般不超过3个。哪个HMaster先启动谁就是Active,Active HMaster会监控/hbase/backup-masters,监控这个子节点下的个数是否发生变化,每次同步消息都会监控这个节点。

HMaster的职责:

负责管理从节点gionServer,负责HBase中的ddl(表结构操作)如果是dml(表数据操作)操作不经过HMaster。

第一次读写过程

在HBase0.96之前

在HBase0.96之后

HRegionServer:

HRegionServer是管理HRegion的每一个HRgionServer能管理1000HRegion,每一个HRegion能管理10G数据,HRegionServer包含了一个WAL和一个BlockCache以及0个或者多个HRegion。

WAL写日志:

当HRegionServe收到写请求时候,会把请求记录到WAL上记录成功后再更新到memstore,这样做的目的是为了防止数据丢失,WAL达到一定程度后会产生一个新的WAL,旧的就会变成一个oldWAL,会被定时清理掉,在hbase0.94前WAL只能串行写,0.94后加入了NIO通道,允许并行写。

Block
Cache。块缓存。

本身就是一个读缓存,维系在内存中,缓存的原理:

时间局部性。如果一条数据被读取过,那么HBase认为这条高于其他的几率,会把这条数据放在读缓存中

空间局部性:如果一条数据被读取过,那么就会认为这条数据的相邻的数据机会大于其他数据,就会把相邻的数据放到读缓存中。

块缓存默认大小是128M,在实际过程中如果scan偏多建议关掉块缓存,如果get多的话建议使用块缓存。

写流程

写请求过来以后,首先考虑写到哪一个管理数据的HRegion,找到对应的HRegionServer,将这个请求写到WAL中,然后将数据写到memstore(默认是128M),将数据写到memstore后会进行排序(行键字典序-列族名字典序-列名字典序-时间戳倒序。)当memstore达到一定条件后会冲刷一个新的HFile,单个HFile是有序的,如果进行多次冲刷,那么所有 的HFile是局部有序的。(memstore的冲刷条件:1.用满自动冲刷2.默认WAL达到1G的话memstore也会冲刷产生一个新的WAL,3.当HRegionServer上所有的memstore内存之和达到物理内存的35%,就会冲刷最大的memstore。)

最终HFile会落地到HDFS上

DataBlock:存储数据

DataBlock是HBase中的最小存储单元

DataBlock默认情况下是64KB。小的DataBlock更利于查询(get);大的DataBlock更利于遍历(scan)

读缓存的空间局部性是以DataBlock为单位缓存

每一个DataBlock由一个Magic和多个KeyValue组成

Magic:魔数。本质上是一个随机数,作用是用于校验

KeyValue:键值对。用于真正存储数据

MetaBlock:存储元数据。只会出现在.meta.文件中

FileInfo:文件信息。对当前HFile的描述

DataIndex:记录每一个DataBlock在文件中起始字节

MetaIndex:记录每一个MetaBlock在文件中起始字节

Trailer:在文件末尾,固定4个字节,前2个字节记录DataIndex的位置,后2个字节记录MetaIndex的位置

HFile的第二个版本中,新添了一个布隆过滤器:

读取流程

当HBase收到读取请求的时候,会先锁定唯一的HRegion,HRegion会由某一个HRegionServer管理,所以相当于锁定了唯一的HRegionServer

先试图从BlockCache中读取数据;如果读不到,那么试图读取memStore;如果memStore也没有读到, 那么就得读取HFile

在读取HFile的时候,会先根据行健范围筛选掉不符合范围的HFile;根据范围筛选完成之后,会再利用布隆过滤器来进行二次筛选

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值