HBase学习(一)——入门
2019-08-09 本文已影响20人
大数据阶梯之路
一、什么是HBase?特性
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,基于Hadoop,建立在HDFS上。HBase是为了解决HDFS上能存结构化的数据却不能处理这些数据的情况,实际上就是实现了HDFS的随机读写,比如当删除一个数据是对数据做一个标记,并未真正删除,当然用户就看不到被标记的数据,真正删除的时候是在合并文件的时候才识别删除标记把数据删除掉。
![](https://img.haomeiwen.com/i11783601/9f2a6c4b50004a9f.png)
- 海量存储
适合用来存储PB级别的海量数据 - 列式存储
指的是列族存储,列族下面可以有很多个列,列就相当于数据,列族在创建HBase表的时候就要指定好 - 方便扩展
由于是基于Hadoop建立在HDFS上,那么数据也是就跟之前提到的HDFS存储数据特点一样,多份存储,还支持横向扩展,扩展性体现在2个方面:一个是基于上层业务处理能力(RegionServer)的扩展,一个是基于存储能力(HDFS)的扩展。 -
稀疏性,一般数据库都是一行数据中如果某一列没数据就是赋值为null,然而HBase则是一行中某一列没数据就没数据,没有说赋值为null的说法。这样数据看起来就不是像传统数据库展示的那样整整齐齐了。对于传统数据库,插入列和删除列对整个数据库的改动是很大的,但对于非关系型数据库,插入列和删除列跟插入记录和删除记录类似。
image.png
二、HBase架构解析
![](https://img.haomeiwen.com/i11783601/401689693471fcf2.png)
一个HRegion大致可以当成一张表来看待,一个Store大致可以当成一个列族来看待,当表数据量很大的时候,会按数据把HRegion进行切分分配给不同的HRegionServer。使用HBase时需要有HDFS和ZK,就要启动hadoop和zookeeper组件。
-
HRegion
:HBase表的分片,是HBase分布式存储和负载均衡的最小单元,同一个Region只能拆分到同一个RegionServer里,不同的Region可以拆分到不同的RegionServer中。关于拆分操作,HBase是以Store的大小来判断是否拆分Region。 -
HLog
:修改记录日志 -
Mem Store
:内存存储,达到一定阈值时会flush到文件中 -
Store File
:对应一个列族,实际存储文件 -
HFile
:文件存储格式,存储在Store File中,是不定长的,固定的长度有Trailer和FileInfo这2块,Trailer指针指向其他数据块的起始点,FileInfo记录着文件的一些meta信息。
其中各组件在HBase中的作用
-
zookeeper
作为Master的的高可用,负责RegionServer的监控,当RegionServer有异常时,会通过回调的形式通知master情况。
作为元数据的入口,以便客户端查找某个数据,而且负责集群配置的维护工作,比如通过zookeeper来保证集群只有一个master运行,当master挂了,会通过竞争机制来产生新的master提供服务。 -
HMaster
给RegionServer分配Region
维护整个集群的负载均衡
维护集群的元数据信息
当Region失效了,会把Region分配给正常的RegionServer,当RegionServer失效时,会把Region和HLog给其他正常的RegionServer。注意:当RegionServer挂了并不代表数据就没了,数据是存在HDFS的,只要从HDFS再把数据拿出来就好。 -
HRegionServer
它是真正“干活”的节点,直接对接读写请求
管理着master为其分配的Region
处理来自客户端的读写请求
负责和HDFS进行交互,存储数据到HDFS
负责Region的拆分工作和Storefile的合并工作 -
HDFS
提供元数据和表数据的底层分布式存储服务
三、HBase数据结构
-
RowKey
相当于mysql数据库的主键,全局唯一的,用来检索记录,一般来说设计rowkey长度在70~100字节就足够满足需求了,在HBase中保存为字节数组,注意:HBase中的数据类型只有字节数组,但提供了一个HBaseUtils工具类帮助我们转换为我们需要的数据类型比如String等等。数据按照rowkey的字典序排序存储,在设计rowkey时要尽量将经常一起读写的行存储在一起(位置相关性)。
访问rowkey的3种方式:
①通过单个rowkey访问
②通过rowkey的正则
③全表扫描 -
Column Family
指的是列族,在创建表的时候就要指定,可以多个,列不能脱离列族而存在,列名都以列族作为前缀。 -
Cell
指的是由rowkey、column family、column、version唯一确定的单元,cell中的数据是没有类型的,都是字节码。 -
Time Stamp
指的是时间戳,用来确定版本的,HBase中每个cell都存在着同一份数据的多个版本,不用版本的数据按照时间戳倒序排序,所以最新的数据在最前面。 -
namespace
在命名空间下存放的是表,相当于mysql中的数据库名,如果没有指定则默认放在default命名空间里,HBase默认有default命令空间和hbase系统命名空间。
四、HBase读写原理
新版和旧版有区别,0.98版本前还有一张-ROOT-表,所以读步骤就加多一步,就是在寻找meta表前先去找-ROOT-表,从-ROOT-表获取meta表的位置。还有hbase读操作比写操作反而慢。
-
读流程
client先请求zookeeper集群获得hbase的meta表的存储位置,然后就去找meta表,meta表里存的是数据被分配在哪一个RegionServer中,然后再去对应的RegionServer找数据,读的时候是先读内存Mem Store中的数据,因为在这里的数据是最新的,没有才去硬盘读。读流程.png
-
写流程
cilent先请求zookeeper集群获得hbase的meta表的存储位置,然后去找对应的RegionServer中的meta表,返回meta表数据,之后发送写入数据请求,写入操作是先写入编译日志HLog中,再写入内存Mem Store中,最后反馈写入成功。写流程.png 三个条件会触发flush操作把数据从内存写入到HDFS
不过以下这些条件是可以通过配置文件hbase-default.xml来配置修改的
- 当一个HRegionServer里所有的Mem Store加起来达到这个堆内存的40%时,触发flush操作
- 当一个Mem Store的数据超过1小时的时候触发flush操作
- 当一个HRegion中的所有Mem Store加起来的数据超过128m的时候触发flush操作
还可以配置compact操作,当达到多少个小文件时或者达到多少天时就进行合并成一个新的大文件。合并是Store级别的列族合并。
附学习文章:
1、为什么出现了HBase?
2、一图了解HBase
3、hbase中storefile、hfile、store、region的关系