一、HBase
1、HBase特点
Hbase是构建在HDFS上的分布式数据库,提供 高可靠性 、 高性能 、 列存储 、 可伸缩 、 实时读写 的分布式数据库系统。HBase主要用于大数据领域,MySQL 是行式存储,HBase 是列式存储。
HBase 是一种构建在 HBase 之上的分布式、面向列的存储系统,需要实时读写、随机访问超大规模数据集时,可以使用HBase。
HDFS不支持小文件,不支持并发写,不支持文件随机修改,查询效率也低 。HBase 却是一个支持百万级别高并发写入,支持实时查询,适合存储稀疏数据的分布式数据库系统。
(1)海量存储、扩展性强、高可靠性
· 海量存储:
HBase 单表可以有百亿行、百万列,可以在横向和纵向两个维度插入数据,具有很大的弹性。
- 当关系型数据库的单个表的记录在亿级时,查询和写入的性能都会呈现指数级下降,这种庞大的数据量对传统数据库来说是一种灾难,而HBase 在限定某个列的情况下对于单表存储百亿甚至更多的数据都没有性能问题;
- HBase 采用 LSM 树作为内部数据存储结构,这种结构会周期性地将较小文件合并成大文件,以减少对磁盘的访问。
· 扩展性强:
依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点就可以了,可以通过增加服务器来对集群的存储进行扩容;
- HBase工作在 HDFS 之上,理所当然地支持分布式表,也继承了 HDFS 的可扩展性。HBase
的扩展是横向的,横向扩展是指在扩展时不需要提升服务器本身的性能,只需添加服务器到现有集群即可。- HBase表根据 Region大小进行分区,分别存在集群中不同的节点上,当添加新的节点时,集群就重新调整,在新的节点启动 HBase 服务器,动态地实现扩展。这里需要指出,HBase 的扩展是热扩展,即在不停止现有服务的前提下,可以随时添加或者减少节点。
· 高可靠性
HBase运行在 HDFS 上,HDFS 的多副本存储可以让它在岀现故障时自动恢复,同时 HBase 内部也提供 WAL 和 Replication 机制。
- WAL(Write-Ahead-Log)预写日志,是在 HBase服务器处理数据插入和删除的过程中用来记录操作内容的日志,保证了数据写入时不会因集群异常而导致写入数据的丢失;而 Replication 机制是基于日志操作来做数据同步的。
- 当集群中单个节点出现故障时,协调服务组件ZooKeeper通知集群的主节点,将故障节点的 HLog 中的日志信息分发到各从节点进行数据恢复。
(2)列式存储、稀疏性、数据多版本、数据类型单一
· 列式存储:
-HBase表的数据是基于列族进行存储的,列族是在列的方向上的划分,每个列族是单独存储的,且支持基于列的独立检索。
· 稀疏性:
主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的,在很大程度上节省了存储开销。
· 数据多版本:
表中数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳
· 数据类型单一:
所有的数据在HBase中是以字节数组进行存储
·(3)高并发:支持高并发的读写请求
·启动时,需要提前启动HDFS及 ZooKeeper集群
2、架构原理
HMaster -> HRegionServer -> Region
rowkey行键 -> Column Family列族 -> Column列 -> cell单元格 -> Timestamp时间戳
·(1)Client客户端 :Client是操作HBase集群的入口
管理类 操作请求,如表的增删改操纵,Client通过RPC与HMaster通信完成;
表数据 读写操作请求,Client通过RPC与RegionServer交互,读写数据;
Client类型:HBase shell、Java编程接口、Thrift、Avro、Rest等等;
·(2)ZooKeeper集群:
- 实现了HMaster的高可用,多HMaster间进行主备选举;
- 保存HBase元数据信息meta表, 元数据region的寻址入口 ;
- 对HMaster和HRegionServer实现了监控,上下线;
·(3)HMaster:region的分配维护,表的请求相应
关于Table:响应Client对Table的增删改请求的操作
关于Region:
- 新Region分配到指定的HRegionServer上;
- 维护HRegionServer间的负载均衡 ;
- HRegionServer宕机后,负责 region 迁移;
·(4)HRegionServer,表的读写,region的
- 响应客户端的读写数据请求;
- 负责管理master为其分配的Region;
- Region的拆分,storefile合并;
- 与HDFS底层交互,存储数据;
·(5)Region:HBase集群中分布式存储的最小单元
Region是HBase集群中分布式存储的最小单元,一个Region对应一个Table表的部分数据。
memstore是一块 内存区域,写入的数据会先写入memstore进行缓冲,然后再把数据刷到磁盘;
StoreFile是HFile的抽象对象,如果说到StoreFile就等于HFile,每次memstore刷写数据到磁盘,就生成对应的一个新的HFile文件出来
一个HRegionServer会负责管理很多个region ,一个region包含很多个store,一个列族就划分成一个store,一个store里面只有一个memstore,有很多个 StoreFile ,最后数据是以很多个 HFile 这种数据结构的文件保存在HDFS上。
3、读写过程
Hbase读数据
- 1、客户端首先与zk进行连接,从zk找到包含meta表的HRegionServer,连接此包含HRegionServer,读取meta表中的数据;
- 2、根据要查询信息,先找到数据对应的region信息,在找到这个region对应的regionServer,然后发送请求
- 3、查找并定位到对应的region,
- 4、先从memstore查找数据—如果没有从BlockCache上读取----如果也没有再到StoreFile上进行读取。
- 5、从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端。
Hbase写数据
- 1、客户端首先与zk进行连接,从zk找到zk找到meta表的region位置,即包含meta表的HRegionServer,连接此包含HRegionServer,读取meta表中的数据;
- 2、根据要查询信息,先找到数据对应的region信息,在找到这个region对应的regionServer,然后发送请求
- 3、查找并定位到对应的region,
- 4、写数据时,把数据分别写到HLog 和memstore各一份进行缓冲,
- 5、flush:memstore达到阈值后,把数据刷到磁盘生成多个storeFile文件。
- Region中任意一个memstore达到128MB
- Region中所有Memstore的大小总和达到block.multiplier * flush.size
- Region Server中HLog数量达到上限
- 6、compact:
- 小合并:小的store file合并成相对较大的store file&