HBase基本概念
HBase概念
Hbase是基于HDFS的数据库,主要用来提供海量数据的存储和实时、随机访问。
HBase的特点
很多HBase的特点都是由列式存储和底层基于HDFS引申出来的
- 海量存储
- 数据最终存储在HDFS上,可以存储大量数据
- 列式存储
- HBase的表基于列式存储
- 支持数据多版本
- 数据类型单一
- 所有在Hbase中存储的数据,都是以字节数组方式存储的
- 存储空间易扩展
- 底层依赖HDFS,存储空间不够,动态增加datanode即可
- 支持高并发随机读写(很复杂,在这不详述)
- 通过跳跃表、LSM(log sturcture tree)、布隆过滤器实现快速随机读写
- 跳跃表:LSM在内存中的实现,多层顺序链表。牺牲空间来实现快速查找。
- LSM:哈希表的存储实现,在磁盘中使用,通过索引堆管理哈希表的集合。
- 布隆过滤器:通过hash算法来实现存储和查找,每个block块中都有一个,占据空间小。通过布隆过滤器,可以快速判断出关键字可能存在当前空间和一定不存在当前空间。通过筛选掉一定不存在的空间,来实现加速查找。
- 通过跳跃表、LSM(log sturcture tree)、布隆过滤器实现快速随机读写
- 节省空间
- 列式存储,可以指定任意多的列,列数据为空的情况下不存储数据,节省空间
HBase表的数据模型
rowkey行键
- table的主键,rowkey可以是任意字符串(最终以字符数组存储),rowkey具有唯一性,表中不能有相同的rowkey
- rowkey的大小:一般大小为10-100bytes。太小容易造成前缀重复,太大浪费空间。最大长度是64KB
Column Family列族
- 列族数量:一个HBase表至少有一个列族,一般一个HBase表有两个列族。列族数量没有限制,官网建议1-3个
- 经常一起操作的列放在一个列族:一般讲经常一起操作的列,即从某种角度具有相关性的列放到一个列族,可以加快读取速度
- 列族数量和region中store数量的对应关系:有多少个列族就有多少个store,即列族数量和store数量是1:1的
列族不宜过多的原因
由于HBase的flush
和Compact
机制,HBase的列族不宜过多。
简单来说有三点:
- region分裂后查询效率可能下降
- 更耗内存
- 频繁IO
在 Hbase 的表中,每个列族对应 Region 中的一个Store,Region的大小达到阈值时会分裂,因此如果表中有多个列族,则可能出现以下现象:
-
一个Region中有多个Store,如果每个CF的数据量分布不均匀时,比如CF1为100万,CF2为1万,则 Region分裂时导致CF2在每个Region中的数据量太少,查询CF2时会横跨多个Region导致效率降低。
-
如果每个CF的数据分布均匀,比如CF1有50万,CF2有50万,CF3有50万,则Region分裂时导致每个CF 在Region的数据量偏少,查询某个CF时会导致横跨多个Region的概率增大。
-
多个CF代表有多个Store,也就是说有多个MemStore,也就导致内存的消耗量增大,使用效率下降。
-
Region 中的 缓存刷新 和 压缩 是基本操作,即一个CF出现缓存刷新或压缩操作,其它CF也会同时做一样的操作,当列族太多时就会导致IO频繁的问题。
Column列
- 一列必然属于某个列族
Cell单元格
- cell中的数据没有类型,最终以字节数组进行存储
- 通过rowkey+列族+列 可以确定一个cell
- 通过rowkey+列族+列+timestamp 可以确定一个cell的某一个版本的值
TimeStamp时间戳
- 同一个cell可以多次赋值,即有多个版本。timestamp可以看成是cell的版本号(version)
- HBase0.96之前version数量为3,HBase0.96之后默认值是1
HBase和Hive的区别
Hive
-
本质:hive本质上是个数仓工具。将已经在HDFS中存储的表文件和存储在MySQL上的元数据文件做双射关系,方便HQL查询管理。
-
用途:用于数据分析、清洗。适用于离线的数据分析和清洗,延迟较高
-
存储和执行:基于HDFS存储,默认使用MapReduce引擎
Hive存储的数据依旧在DataNode上,存储可能是
textfile
orc
等格式。编写的HQL语句终将是转换为MapReduce代码执行。
HBase
-
本质:HBase本质是一个面向列存储的非关系型数据库。
-
用途:用于存储结构化和非结构话的数据。
- 读写延迟低,适用于接入在线业务使用,单表可以存储大量数据(如上亿甚至十几亿的数据)
- 适用于单表非关系型数据的存储。
- 不适合做关联查询,类似JOIN等操作。
-
存储:基于HDFS存储。数据持久化存储的体现形式是
Hfile
,存放于DataNode
中,被ResionServer
以region
的形式进行管理。
总结:Hive与HBase
- Hive和Hbase是两种基于Hadoop的不同技术,Hive是一种类SQL的引擎,并且运行MapReduce任务
- Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。
- 这两种工具是可以同时使用的。Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到HBase,或者从HBase写回Hive。
HBase架构
HBase是一种主从架构
Client客户端
- Client是操作HBase集群的入口
- 对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成 DDL
- 对于表数据的读写操作,Client通过RPC与RegionServer交互,读写数据 DML
- Client类型操作HBase的方式:
- HBase shell(快速测试的时候用比较高效)
- Java编程接口(用的多)
- Thrift、Avro、Rest等等(使用的少)
ZooKeeper集群
- 作用
-
实现了HMaster的高可用,多HMaster间进行主备选举
-
保存了HBase的元数据信息meta表的元数据信息(默认保存在ZK的
/Hbase/meta-region-server
中),从而间接提供了HBase表中region的寻址入口的线索数据
-
对HMaster和HRegionServer实现了监控
-
HMaster
- HBase集群也是主从架构,HMaster是主的角色
- 主要负责Table表和Region的相关管理工作:
- 关于Table
- 管理Client对Table的增删改的操作
- 关于Region
- 在Region分裂后,负责新Region分配到指定的HRegionServer上
- 管理HRegionServer间的负载均衡,迁移region分布
- 当HRegionServer宕机后,负责其上的region的迁移
HRegionServer
- HBase集群中从的角色
- 作用
- 响应客户端的读写数据请求
- 负责管理一系列的Region
- 切分在运行过程中变大的region
Region
- HBase集群中分布式存储的最小单元
- 一个Region对应一个Table表的部分数据