1、Hbase是一个非关系型分布式数据库(NoSQL)--BigTable(参考的是谷歌)
2、高可靠(采用主从架构,使用zookeeper管理)、高性能(分布式并行处理)、面向列、可伸缩(可新增子节点)
3、采用HDFS作为文件存储系统(也可以采用其它的文件存储系统,没集成MR计算的功能)
4、Hbase擅长查询数据(这里的查询是指将指定的数据按数据库的格式拿出显示,不包括统计即count,sum这样的计算操作,Hasee是可以做计算的只是不擅长,且需要和MR做集成),随机读取速度快。
5、能够处理结构化和非结构化的数据
Hbase建表的时候不需要指定数据类型,也不需要指定字段名称
表
行(row):行由行键(rowkey)唯一标识(一行的每一个列限定符(字段)都有一个rowkey标识)
列族(column family):行的数据按列分进行切分cf(多列组成一个cf)
列限定符(column qualifier):列里面的数据定位通过列限定符(相当于字段)
单元(cell):行键、列族、列限制定符一起确定一个单元(列限定符,value)
时间版本(vesion):单元值有时间版本(如果一张表中有多个列族,每个列族中的版本数可以不一样),用时间戳来标识,默认只指定一个
client:
1、客户端整个集群的入口
2、使用HBase RPC机制与HMaster和HRegionserver通信
3、与HMaster通信进行管理类的操作
4、与HRegionserver通信进行读写类操作
5、包含访问HBase的接口,并维护cache来加快对HBase的访问,与HRegionsercer交互
Region:由表中多行组成(按照rowkey的范围,StartKey和EndKey划分---只记录StartKey)Region;每一张表创建的时候只有一个region,当表中的数据不断增加到超过某一个给定的阈值后,开始分裂,分裂为多个region;region管理多个store(一个列族就有一个store)
-------region分裂后会由Hmaster进行负载均衡。
Store:包括内存的中Memstore和磁盘中的Storefile(Hfile--hdfs中的存储文件)(有多少个列族就有多少个store)
-------在进行写入操作的时候,Hbase先将数据写入到memstore中,当memstore的数据量某个设定的阈值时,Hregionserver会启动一个flashcache进程写入storefile,每次写入操作都会形成一个单独的storefile(Hfile)
storefiel:当单独的storefile的数量增长到一定的阈值后,系统会进行合并,包括版本合并和删除,从而形成更大的storefile
Hregionserver:
1、管理多个region和多个Hlog(这边只是管理,并不是将region中的真实数据存储在Hregionserver中,真实的数据是存储在HDFS上的,因此当Hregionserver挂掉后,只用将这个管理者更换掉就行,并不用去管HDFS上的数据)
2、处理用户的读写请求---Hregionsever和region进行交互处理
Hmaster:主备模式
1、管理所有的RegionServer(新RegionServer的注册、Failover(故障处理))
2、新表创建时的Region的分配
3、运行期间的负载均衡保障
4、RegionServer Failover(故障)后Region接管。
1、ZooKeeper是一个分布式应用程序协调服务。
2、Hmaster的高可靠(解决Hmaster的单点故障问题)
--在Hbase中可以创建多个Hmastr节点,只有一成为Active角色,来管理Hbase,当主Hmaster(Active角色Hmaster)宕掉后,会从备Hmaster中选出新的Active角色的Hmaster继续管理Hbase。
--1、zk提供分布式锁的服务实现HmasterActive角色的创建(当主Hmaster宕掉后,所有的其它Master都尝试在zk中写入一个对应的节点,该节点只能被一个Master创建成功,创建成功的Maser进程就是主Master(Active角色Master))。
--2、事件监听机制,通过事件监听机制确定主HMaster是否宕掉,如果宕掉,就会删除该节点并通知其它备Master。
1、寻址
client--->zk (得到meta表的元数据)--->Regionserver(找到到meta表)--->meta表(获取写入数据的region的地址(region的RowKey范围,region所属的Regionserver))
2、写入数据
2.1先将写入得数据进行分组
region分组(将数据按照相同的region进行分组)--->regionserver分组--->HBase自身封装的RPC框架往多个RegionServer发送请求,并行操作(并行发送数据,相同的regionserver的数据会一起发送)
2.2数据到达具体的regionserver下的具体的region,开始写入数据
先将数据写入到memstore中(同时写入到Hlog中来保证数据的安全),当memstore的数据量某个设定的阈值时,Hregionserver会启动一个flashcache进程写入storefile,每次写入操作都会形成一个单独的storefile(Hfile)
3、补充
3.1写入数据的锁
锁概念:Hbase不保证原子性(原子性:一个事务要么同时成功,要么同时失败),但是提供了一个region行锁来保证数据的安全性
写入数据锁流程:获取Region操作锁-->获取行锁--->写入MemStore--->释放行锁--->写入Hlog--->释放Region锁
3.2 产生Hfile(storeFile)的情况
01、当写入MemStore的数据达到阈值时
02、当写入MemStore的数据没有达到阈值但是内存不够时
03、当停止Hbase时(执行stop-hbase.sh)
04、当memstore挂掉,从Hlog中恢复数据的时
3.3关于Split
当集群中的region中数据到达一定的阈值,region就会进行分裂
01、分裂的region会暂停一些读写服务
02、分裂的形式并不是真分裂,而是创建一个新的region
3.4 Compaction
01、包括两大类删除需要删除的数据(删除版本过期的数据、有效期的过期的数据、已经执行delete的数据)和数据整理(删除数据后Hfile的整理合并)
02、minor(小合并):部分HFILE,只处理TTL过期的数据,由Hbase内部执行
03、major(合并):是将store中所有的HFILE进行合并为一个大的HFIEL,然后进行切分为一个标准的HFILE文件,时间会很长,大合并会执行删除操作。
1、get与scan的区别
get:获取一行行中的数据(可以看做特殊的scan)
scan:获取多行数据
2、scanner介绍
scanner:扫描器,分为RegionScanner 、StoreScanner 、MemStoreScanner和StoreFileScanner
一个region-->一个RegionScanner
一个Store-->一个StoreScanner
一个MemStore-->一个MemStoreScanner
一个StoreFile--->一个StoreFileScanner
读取数据时会分配多个scanner进行循环读取数据,一行(唯一的一个roukey)中的一个主族由一个scanner负责读取数据,当一个scanner读取完数据后由下一个scanner读取下一主族的数据,读取完的scanner会循环利用,进入到scanner列表中准备下读取数据。
所有的scanner查找的主族中的数据都是并行查找的,只是读取数据的时候是串行读取的;如果所有的数据都读取完成那么scanner会关闭。
1、什么是Hbase的热点问题?
Hbase中的读写很大一部分都只在一个HergionServer中,热点问题产生的原因是由于设计的rowkey不合理
解决方案参考:https://blog.csdn.net/WYpersist/article/details/79954419