原理 一、HBase物理存储机制 1.在HBase中,从行键的方向上将一个表划分为一个或者多个HRegion 2.每一个HRegion会存储在不同的节点(HRegionServer)上 3.因为HBase会对行键进行字典序排序,所以每一个HRegion所包含的数据是不重合的 4.每一个HRegion记录当前HRegion的起始行键和结束行键(范围锁定),这样做的目的是为了进行快速操作来避免整表查询 5.划分HRegion的目的是为了做到表的分布式存储,I并且能够有效的提高HBase的吞吐量 6.当某一个HRegion达到限定条件默认是10G,这个值可以调,范围1~20G)的时候,这个HRegion进行分裂,平均分为2个HRegion,其中一个HRegion会进行转移,转移到其他的HregionServer上 7. HBase在进行分布式存储的最小单位是HRegion,但是HBase存储的最小单位不是HRegion
8 HRegion中要包含1个到多个HStore,每一个列族对应一个HStore 9. HStore包含一个memStore(写缓存)以及0到多个HFile(StoreFile)
单独启动hmaster
[root@hadoop02 bin]# sh hbase-daemon.sh start master
[root@hadoop02 bin]# jps
3681 Jps
3593 HMaster
1579 QuorumPeerMain
二、HMaster 1.在HBase中不存在HMaster的单点故障,因为可以启动多个HMaster
2.HMaster存在2种状态: active(活跃)和backup(备份)。在HBase集群中,先在哪个节点 上启动HMaster,那么这个节点就是active HMaster,后启动的HMaster就是backup HMasterl 3.理论上,不限制HMaster的个数 4.当HBase启动的时候,会在zookeeper中注册/hbase节点。active HMaster 会在Zookeeper中注册一个临时节点/hbase/master节点,backup HMaster会在/hbase/backup-masters节点下注册临时节点
5.Active HMaster会监控Zookeeper中/hbase/backup-masters中的子节点的变化。如果/hbase/backup-masters中的子节点发生了变化,则说明有节点的加入或者移出 6.当Active HMaster宕机,那么Zookeeper中的临时节点也会消失,那么此时Zookeeper就直到Active节点挂掉,需要从Backup HMaster中选一个切换为Active状态 7. Active/Backup HMaster会向Zookeeper发送心跳维系这个节点的存活
8.Active HMaster默认是每隔180s发送一次心跳,实际开发中一般会将这个时间缩短为1min 9. Active HMaster和Backup HMaster要进行热备份,因此实际过程中,Backup HMaster的个数一般不超过2个 10. HMaster的职能: a.对表结构进行管理(表的创建、删除、修改- create/drop/alter -ddl) ,而对于表中数据的操作(put/get/scan/delete - dml)不经过HMaster b.管理HRegionServer【ddl】(zk管理【dml】—rs就是体现)
[zk: localhost:2181(CONNECTED) 2] ls /hbase
[replication, meta-region-server, rs, splitWAL, backup-masters, table-lock, region-in-transition, online-snapshot, master, running, recovering-regions, draining, namespace, hbaseid, table]
11.第一次读写流程: a.在0.96版本以前: b.在0.96版本开始: i、从0.96开始,为了提高读写效率减少访问次数,在客户端设置了缓存机制,存储HRegion所对应的HRegionServer。随着时间的延长,客户端的缓存会越来越多,读写效率也会越来越高 ii、这个过程中如果发生HRegion的分裂或者是客户端宕机,那么缓存机制就需要重新建立
12.元数据: a.表名、列族名、名称空间等信息 b.每一个表对应的HRegion c. HRegion所存在的HRegionServer
四、HRegionServer 1.HRegionServer不是存储HRegion而是管理HRegionr 2.在HBase官方文档中给出数据,每一个HRegionServer能够管理1000个HRegion
3.结构: a. WAL - Write Ahead Log-改名为HLog i.用于记录写操作。当HRegionServer收到写请求的时候,会先将操作记录到WAL中,然后再更新到memStore中。如果memStore满了,则冲刷到HFile中
ii.在HBase0.92版本之前,WAL是串行写,从0.92版本开始,WAL运行进行并行写
b. BlockCache i、在读取数据的时候,会把读取的数据放入读缓存中ii. BlockCache在进行缓存的时候采用的是"局部性"原理: 1)时间局部性:如果某一条数据被读取,那么这条数据再次被 读取的概率就比其他数据大,那么此时应该进行缓存 2)空间局部性:如果某一条数据被读取,那么与这条数据相邻的数据被读取的概率就比其他数据大,那么此时相邻的数据应该进行缓存。空间局部性在放的时候是以Data Block为单位向BlockCache中放
iii.采用局部性原理的目的是为了提高命中率 iv. BlockCache是维系在内存中,默认大小是128M v.BlockCache采取了LRU策略:当BlockCache满了之后,会清除最长时间不用/使用次数最少的数据
c. HRegion -是HBase中存储数据的基本结构 i、一个HRegion包含1个到多个HStore,HStore的数量由列族数量决定个,每一个列族对应一个HStore ii、每一个HStore中包含1个memStore以及0到多个storeFile/HFile iii. memStore本身是一个写缓存,是维系在内存中,最大不超过128M。数据在memStore中会进行排序:行键字典序->列族名字典序-〉列名字典序->时间戳倒序,也就意味着在HFile中数据是局部有序-每一个HFile应该是有序的
流程 一、写流程 1.HRegionServer接收到写请求的时候,先将这个写请求记录到wAL中,然后再更新到memStore中,并且在这个memStore中进行排序 2.当memStore达到条件的时候会进行冲刷,产生HFile: a.默认情况下,当memStore达到128M(通过 hbase.hregion.memstore.flush.size属性来调节,注意单位是字节)的时候,会讲行油冲刷
b.当WAL文件达到1G的时候,也会进行冲刷,并且此时会产生一个新的WAL文件 c.当一个HRegionServer中的所有的memStore的内存占到当前节点物理内存的35%的时候,也会进行冲刷,此时冲刷的时候,会先冲刷比较大的memStorel
3.在HBase提供了2种合并机制-针对HFile进行合并-默认的合并方式就是minor compact a. minor compact:将当前HStore中多个小的HFile合并成几个大的HFile b. major compact:将当前HStore中所有的HFile合并成一个HFile 4.在合并的时候,数据会进行整体的排序,而在排序过程中会去移除掉被标记为要删除的数据
5.Update: 数据无论在memStore中还是在HFile中,在进行更新的时候,都是进行追加写入,在合并的时候,会根据指定的版本,来舍弃过时的数据
Delete: 数据无论是memStore中还是在HFile中,在进行删除的时候,都是进行追加写入,在进行追加写入的时候,数据末尾会添加删除标记。在合并的时候,如果发现这个删除标记,则舍弃对应的数据 a. HFilev1: i.包含了6部分:
-
Data Block:数据块。每一个DataBlock中存储1个Magic-魔数(魔数本身是一个随机数字,作用是用于进行校验,保证这个数据没有被改变过)和多个KeyValue数据。小的DataBlock有利于查询,大的Data Block适用于遍历scan -
Meta Block:记录的元数据,但是这个信息在大多数的HFile中不存在 -
File Info:记录的HFile的描述信息 -
Data lndex:记录的是每一个Data Block的起始字节和结束字节 -
Meta lndex:记录的是每一个Meta Block的起始字节和结束字节 -
Trailer:固定4个字节大小,记录的File Info、Data lndex和Meta lndex的起始字节 ii.在读取HFile的时候,需要先读取Trailer,获取到Data Index的位置,然后从Data Index中去锁定每一个Data Block的位置,然后才能去读取Data Block
b. HFilev2版本中新添了Bloom Filter-布隆过滤器-HFile中的每一个行键都会经过布隆过滤器进行映射
二、HBase读流程 1.首先锁定对应的HRegionServer 2.先从BlockCache中读取,如果读不到,则读取memStore中的数据,如果也读不到,则从HFile读取 3.如果从HFile中读取,需要先筛选(范围+布隆过滤)符合条件的HFile4.在HFile中,会根据行键筛选出符合范围的Data Block 5.如果能够读取到,那么这条数据所在的Data Block会整体缓存到BlockCache中
注意:HBase是一个伪实时的数据库–-缓存 Redis cassandra 非MS ----CAP WNR
hbase调优 1.调整data block 2.适当关闭数据块缓存 3.开启布隆过滤器 4.开启数据压缩 5.设置scan缓存 6.显示的指定列 7.关闭ResultScanner 8.使用批量读 9.关闭wal日志 10.允许自动冲刷 11.提前创建HRegion 12.调整ZooKeeper Session的有效时长
phoenix安装使用(利用phoenix类sql去操作hbase)
1.sql语句类sql 2.不稳定 3.关闭不方便
|