Hbase/Hadoop Database
是什么
概念/定义
Hbase是一个分布式,可扩展,支持海量数据存储的noSQL数据库
优点
支持大量的数据存储
易拓展
自动切片,自动故
障转移
可以使用Java API编程
缺点
没有高级查询语句
延迟较MySql等关系型数据库大
需要分布式运行,需要一定的机器数量
名词解释
namespace 类似于mysql database
rowkey:每条数据的唯一标识,hbase中的数据按照rowkey字典序排序的(1 10 100 101 11 20 21)
region:hbase分布式存储的基础,,建表时由split语句可以各region所包含startkey和stopkey,进而划分为不同的region分到不同的服务器中。
列簇:一组列的集合,同一个表中,拥有相同数量的列簇,列簇中可以拥有不同数量的列,列簇中列的宽度是动态的,在插入数据时指定。
store:每个region的每个列簇存储成为一个store,作为基础文件单元
version :Hbase对数据的修改实际上是put(时间戳,new val),这个修改不会删除旧值,而是将新值的数据加入到表中,建立列簇时可以指定version的值,Hbase最多保存该值数量的最新历史数据。
cell:由rowkey,列簇,列名,时间戳 唯一确定的单元
为什么
架构/原理/数据结构
Region Server
1.负责客户端的数据操作请求(DML)
2.region split,store file, compact
Master
1.监听Region Server服务器状态
2.在其故障时启动故障转移机制:在其他服务器上创建新的region,将元数据与实际存储在HDFS上的数据关联
3.负责Region Server的负载均衡
4.负责表结构的操作(DDL)
HDFS
为Hbase提供底层的数据存储服务,为Hbase提供高可用的支持
Zookeeper
1.Master的高可用
2.Region Server 的状态监听
元数据
hbase:meta这个表中存储了所有表的元数据,包括所有region所在的服务器,region的名称,以及时间戳。
flush触发条件
以下触发条件都会触发flush,但flush的最小单位是region,即每次触发flush都会flush该region的所有Store的MemStore,所以region的列簇不适合设置过多,工作中一般指定为1-2个
1.MemStore存储数据达到128M
2.region中所有的MemStore数据大小达到512M
3.RegionServer所有region的所有MemStore的数据总大小达到java_heap * 40% * 95%,此时会将当前RegionServer下的所有Region根据其所有MemStore占用大小排序,优先flush占用空间大的region
4.region距离上次flush已经达到一个小时
5.当WAL文件数量已经达到32个时
6.手动flush
标记删除
Hbase数据存储于HDFS上,并不能像关系型数据库一样随意删改,实际上的删除只是标记删除,使该值不可见,等到下次major Compact时才会真正的删除。
考虑:标记删除一个范围内的数据,然后又添加了该范围内的数据,新增数据会被删除吗?
Compact
Minor Compact
触发条件:小文件数达到3个时,会触发文件的合并
合并过程:合并时只是单纯的将多个小文件合并成一个大文件,不会删除或过滤过期版本。
合并结果:出现多个大文件
Major Compact
触发条件:7天一次
合并过程:将StoreFile的所有文件合并成一个大文件,会删除或过滤过期版本
合并结果:StoreFile下只有一个文件
Region Split
默认创建表时只有一个Region,而一个Region只能存在于一个RegionServer上,是不支持分布式的。Hbase的RegionServer会在Region数据达到一定时,自动切分,分裂Region,再由Master分配到不同的Server上。
0.9-2.0
分裂标准:min(10G(默认), memStore flush.size * RegionNum^2) RegionNum是该服务器下的该表的Region个数
写流程
StoreFile
Hbase保存在HDFS上具体存储数据的物理文件,每个store每次flush内存区都会产生一个,以Hfile格式保存
MemStore
写入的缓存,写入数据时先存入MemStore内存区,并在区中排序,触发flush后将区中数据落盘
WAL
Write-Ahead logfile,预写日志。为了防止MemStore内存区中的数据丢失,写入时会先数据将写到预写日志,内存区flush完成后会删除预写日志中的相应内容。也便于故障转移后的恢复。
流程
1)Client先访问Zookeeper,获取hbase:meta表位于哪个RegionServer。
2)访问对应的RegionServer,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个RegionServer中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问(当触发负载平衡或故障转移后,需要重新缓存meta表)。
3)与目标RegionServer进行通讯;
4)将数据顺序写入(追加)到WAL;
5)将数据写入对应的MemStore,数据会在MemStore进行排序;
6)向客户端发送ack;
7)等达到MemStore的刷写时机后,将数据刷写到HFile。
读流程
1.向zk发起请求,找到meta表所在regionserver
2.zk返回meta所在的regionserver
3.向meta所在的regionserver请求读取meta
4.将读取到meta表缓存在内存中,方便下次读取,并