HBase
一、为什么使用HBase?
最近打算用Hbase存储kafka消息队列的消息内容,防止消息丢失,方便后期补偿作用。
二、HBase是什么?
HBase是Hadoop DataBase的简写,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统/数据引擎,组成如下:
- 基于hadoop的HDFS作为文件存储
- 基于Hadoop MapReduce来处理HBASE中的海量数据
- 基于Zookeeper作为协同服务
偷大佬得概念图
三、HBase的特点有哪些?
- 存储数据量大
- 面向列
- 稀疏
- 没有固定格式的存储
- 数据多版本 (根据时间戳去判断数据的版本数据)
- 数据类型单一(只有String)
三、HBase由哪些组成?
-
名词解释
NameSpace:命名空间
Region:区域
Store:存储
Rowkey:数据唯一key
Column Family:列族
Column Qualifier:列
TimeStamp:时间戳
Cell:唯一确认的单元 -
HBase数据逻辑存放示意图
-
HBase数据物理存储形式
例:rowkey为rowkey_01的数据存储形式,其中每一行都是Cell(唯一确定单元)
-
HBase数据中如何确定一行数据?
HBase中确认一行数据的方式为 Rowkey+Column Famliy+Column +Timestamp -
HBase数据修改/新增的方式?怎样获取最新的数据?
HBase中进行增删改,都会新增一条记录,并且每次取值的时候都会取出TimeStamp最靠近现在时间的那一条记录 -
HBase与MySql的类似对比,方便理解:
四、HBase基础架构
zookeeper
- 监控master,保证只有一个master
- 存储所有region得寻址入口
- 监控Region Server得状态,并通知master
- 存储hbase中的元数据
Hmaster
- 为region server分配region
- 负责region server负载均衡
- hdfs得垃圾回收
- 处理schema得更新请求
region server
- 维护master给得region
- 负责处理client对这些region得读写请求,并和hdfs进行交互
- 负责region得切分
**region **
- hbase中分布式存储和负载均衡得最小单元
- region有两个重要属性就是StartKey和EndKey。表示这个Region维护的rowkey的范围
整体流程:
服务端->zk->master->region server(java中的一个进程)->hlog->memory store->store file->hfile->HDFS
五、HBase写流程
/put/table/rowkey/column family/column
注:
- 老版本存在-root-表,本意是为了防止meta表过大,做一层切分
- java代码步骤:①获取锁②更新时间戳③打开wal④添加wal,并不同步⑤写内存⑥释放锁⑦同步wal⑧修改数据
六、HBase读流程
- Client访问Zookeeper,查找-ROOT-表,获取.META.表信息;
- 从.META.表查找,获取存放目标数据的Region信息,从而找到对应的RegionServer;
- 通过RegionServer获取需要查找的数据;
- RegionServer的内存分为MemStore和BlockCache两部分,MemStore主要用于写数据,BlockCache主要用于读数据。读请求先到MemStore中查数据,查不到就到BlockCache中查,再查不到就会到StoreFile上读,并把读的结果放入BlockCache。
七、HBase读比写复杂的原因
- 读会读取磁盘和内存
- 每一个flush操作都会生成hfile,而BlockCache只会缓存Hfile中的内容
八、Memory store flush
刷写时机:
Region Server
- 堆内存的40%
- 堆内存的40%的95%(95%-100%是不阻塞刷新的)
- 存在内存1h(最后一个文件记录事件为起始时间)
Region
- 单个Region内存达到128m,单个region进行刷写
wal:
- 单个wal文件过大
- wal文件默认为32个
九、HFile合并
Compact(单个文件)/major compact(全局)
十、Rowkey设计原则
- 散列性 (生成随机数,hash,字符串反转,MD5)
- 唯一性
- 长度原则(生成70-100位)
- 最佳是高位业务逻辑表示+低位hash