HBase学习(一)——入门

一、什么是HBase?特性

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,基于Hadoop,建立在HDFS上。HBase是为了解决HDFS上能存结构化的数据却不能处理这些数据的情况,实际上就是实现了HDFS的随机读写,比如当删除一个数据是对数据做一个标记,并未真正删除,当然用户就看不到被标记的数据,真正删除的时候是在合并文件的时候才识别删除标记把数据删除掉。

大数据组件图.png

  • 海量存储
    适合用来存储PB级别的海量数据
  • 列式存储
    指的是列族存储,列族下面可以有很多个列,列就相当于数据,列族在创建HBase表的时候就要指定好
  • 方便扩展
    由于是基于Hadoop建立在HDFS上,那么数据也是就跟之前提到的HDFS存储数据特点一样,多份存储,还支持横向扩展,扩展性体现在2个方面:一个是基于上层业务处理能力(RegionServer)的扩展,一个是基于存储能力(HDFS)的扩展。
  • 稀疏性,一般数据库都是一行数据中如果某一列没数据就是赋值为null,然而HBase则是一行中某一列没数据就没数据,没有说赋值为null的说法。这样数据看起来就不是像传统数据库展示的那样整整齐齐了。对于传统数据库,插入列和删除列对整个数据库的改动是很大的,但对于非关系型数据库,插入列和删除列跟插入记录和删除记录类似。
    image.png

二、HBase架构解析

图很重要.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的逻辑结构

有store实际存储的,列族其实就是多个列的分类,每一条记录都有一个rowkey,是唯一的,region相当于是表的切片,分块切分存储
image.png

hbase的物理结构

hbase如何实现在hdfs上随机读写,快速写呢,当修改操作时实际上也是新增一条最新的记录,当时间戳大于旧数据时间戳的话,则返回时间戳大的那条记录;当删除操作时实际上是把那条记录打个标记,类型改为Delete,则不返回这条记录,但这条件记录还是存在的
image.png

hbase基础架构

Master管DML操作,对数据做get、put、delete操作,Region Server管DDL操作,对表做create、delete、alter操作
image.png

其中各组件在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的正则
    ③全表扫描

  • Region
    相当于mysql中的数据表,hbase创建表时只需要表名和列族即可,不需要声明表字段,这就意味着往hbase写入数据时,字段可以动态的指定,比mysql数据库相比起来就很灵活了。

  • Row
    hbase表的每行数据都是由一个RowKey和多个Column组成,hbase数据是有按照字典序顺序存储的,而且在查询检索数据时必定要指定rowkey,所以优良的设计rowkey就显得十分重要了。

  • Column Family
    指的是列族,在创建表的时候就要指定,可以多个,列不能脱离列族而存在,列名都以列族作为前缀。

  • Time Stamp
    时间戳,用于标识数据的版本,每天数据写入时如果不指定时间戳,则系统会按照写入hbase的时间把该条数据的这个timestamp填充上,这个timestamp很重要,决定该条数据是否是最新的

  • namespace
    相当于mysql中的数据库名,hbase默认提供了2个Name Space,一个是hbase,用来存放hbase内置的表;一个是default,用来提供给用户的表存放。

  • Cell
    由{rowkey,列族,列限定符,timestamp}组成的唯一单元,cell中的数据是没有数据类型的,都是统一的字节码存储,不过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的关系

你可能感兴趣的:(HBase学习(一)——入门)