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;根据范围筛选完成之后,会再利用布隆过滤器来进行二次筛选