HBASE表结构、优缺点及设计思想

HBASE表结构、优缺点及设计思想

        • HBASE来源
        • hbase的设计思想
        • HBASE特点
        • hbase的表结构
        • hbase的优缺点

HBASE来源

HBASE由 DOUG CUTTING开发,最终来自于google。最初是Google面临 海量网页数据 提出的解决方案。来源于google的一篇论文: bigdata。可以参考这篇文章:Hbase的产生背景

hbase的设计思想

hbase是随机快速查询的。(随机(近)实时查询的)
hbase 是分布式nosql数据库,数据量很大的数据库。
原理:构建索引。
跳表结构 ,创建多层索引的, 布隆过滤器
hbase 默认创建二层索引, 最上层的索引 ,无论多大都不会切分的。
hbase对zk的依赖性极强

    1)选主
    2)寻址机制
        最上层索引表的存储hbase节点位置
        查询时:zk--->最上层索引表--->hbase节点--->需要的数据。

HBASE特点

hbase可以实现 海量数据 的快速随机查询。是一个分布式数据库
hbase表的特点:

  • 表大 :
    一个表可以有上十亿行,上百万列。
  • 面向列:
    hbase是面向列的,严格说是面向列族的,一个列族存储在一个物理文件中。
  • 稀疏
    hbase的底层数据存储:所有的数据存储的都是字节(byte[ ])。
    稀疏存储:每一行只存储自己有的列,null值不参与存储。
  • 无模式
    hbase是无严格模式的。 (表结构决定的)
	有严格模式,分为读模式和写模式
	
    读模式:数据读取的时候,进行数据校验。  eg:hive 中 load 时
    写模式: 数据写入的时候,进行数据校验。 eg:mysql 存数据时

hbase数据库的特点:

  • 1)不能支持join 
    
  • 2)所有的数据 ,底层存储的时候,以 byte[] 进行存储
    

1、HBASE是面向列的。
hive : 传统关系型数据库,是面向行的方式的。(一行数据,一定是存在一个文件中的)
hbase的存储数据, 以列为切分方向的。

面向行:一行数据,在存储的时候,是不会被拆分的,一行数据,是物理文件存储的最小的单元了。
面向列:以列为单位进行存储的。表中的一列,会存储在一个物理文件中。

实际是hbase不是完全面向列的,是面向列族的。

面向列的优势:
	1)便于压缩
	2)便于查询,提升查询效率

2、HBASE是nosql数据库

  • 1)nosql:
    1、非关系型数据库
    2、不支持标准sql,hbase中提供全新的shell
  • 2)not only sql
    1、不仅仅是sql
    2、通过第三方工具,可以实现支持标准sql(例如phoenix)

注意:
hbase表中的数据也是存储在hdfs上的。 表中的数据会被HBASE加工成hbase能够识别的结构,进行存储。 HBASE查询的时候,也是执行计算引擎 mr。

hbase的表结构

传统关系型数据库,是二维表。
传统关系型数据库的表结构: 表名–字段–类型–分区–分桶等
hbase是四维表,eg:
HBASE表结构、优缺点及设计思想_第1张图片

  • 1)行键 row key,是一行的唯一标识 (表数据的一部分)
    相同行键的数据,认为是同一行的数据。不同行的数据,行键一定不同。
    因此行键具有唯一性
    hbase中表,创建索引的时候,按照行健进行索引。hbase中的行健默认会按照字典顺序进行升序排序,便于创建索引。
  • 2)列族(列簇): column family。列族是表结构的一部分(schema)
    列簇:一个或多个列。(一个列族会存储一个物理文件)
	每一个列,都是属于某一个列族的。列不是独立存在的,而是依附列族的。
	每一个列族下有多个列,每一行同一个列族下的列都是不一样的。
  • 生产经验:
    实际生产环境中,一般每一个表列族个数不要超过3个。

  • 一般而言:

    • 1、同一个列族下,存储的列具有相同的IO属性的列数据。
    • 2、hbase是面向列族存储的。一个列族对应一个物理文件。
    • 3、相同的IO属性:经常在一起,进行读写访问的列。
      相同IO属性是由业务决定的,例如name,age,sex等查询时会放在一起同时查询,目的是为了方便查询。
    • 4、业务是经常变化的,所以一般是少设计一些列族,将尽量多的字段放在同一个列族下,生产上一般是一个或2个列族。
  • 3)列 column
    列属于表数据的一部分。
    在插入数据的时候,根据数据指定列名(列值)。
    每一个列都会有属于指定的列族。
    要想定位一个列,首先要指定一个列族。info01:address 和 info02:address 不是一列。

  • 4)数据版本(时间戳):version
    version是每一个单元格的一个标识。通常情况下,用系统时间戳进行标识。(也可以手动指定时间戳)。
    每一个列存储的数据,是可以存储多个版本的。
    存储每一个列数据的时候,默认添加一个时间戳信息, 这个时间戳信息就是数据版本。
    默认每一列只存储一个版本的,即最新版本。

  • 5)单元格 cell
    每一个列的一个值,对应一个单元格。
    每一列的每一个值(带时间戳)存储在一个单元格中的。
    HBASE定位一个单元格的方式:表名–>行键–>列簇–>列–>时间戳

hbase的优缺点

① 它介于 NoSQL 和 RDBMS 之间,仅能通过主键(rowkey)和主键的 range 来检索数据
② HBase 查询数据功能很简单,不支持 join 等复杂操作
③ 不支持复杂的事务,只支持行级事务(可通过 hive 支持来实现多表 join 等复杂操作)。
④ HBase 中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
⑤ 主要用来存储结构化和半结构化的松散数据。

你可能感兴趣的:(HBASE)