HBase简介及数据模型

时间:2021-11-14 05:42:14

HBase简介

  HBase是一个构建在HDFS上的分布式列存储系统;
  HBase是基于Google BigTable模型开发的,典型的key/value系统;
  HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;
  从逻辑上讲,HBase将数据按照表、行和列进行存储;
  与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。

HBase的优势

  将随机读写转化为顺序读写,适应高并发写入;
  均衡效果好,读写性能和机器数保持线性相关;
  行中没有保存数据的列,不占存储空间;
  分布式特性:基于HDFS、ZK,一致性,可用性,分区容忍性,大数据存储,易扩展。

Hbase表的特点

  大:一个表可以有数十亿行,上百万列;
  无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
  面向列:面向列(族)的存储和权限控制,列(族)独立检索;
  稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
  数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
  数据类型单一:Hbase中的数据都是字符串,没有类型。

HBase VS RDBMS

  HBase中的数据都是字符串类型(String);
  HBase只有普通的增删改查等操作,没有表之间的关联查询;
  HBase是基于列式存储,而RDBMS是基于行式存储的;
  HBase适合存储大量数据,查询效率极高。

HBase数据模型

  应用程序是以表的方式在HBase存储数据的。表是由行和列构成的,所有的列是从属于某一个列族的。行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组。
  表的行键也是一段字节数组,所以任何东西都可以保存进去,不论是字符串或者数字。HBase的表是按key排序的,排序方式之针对字节的。所有的表都必须要有主键-key。

逻辑视图如下:

Row Key(行键) Time Stamp ColumnFamily contents(列族contents) ColumnFamily anchor(列族anchor)
com.cnn.www t1 anchor:cnnsi.com = “CNN”
com.cnn.www t2 anchor:my.look.ca = “CNN.com”
com.cnn.www t3 contents:html = “…”

Hbase基本概念

1.行键(RowKey)

  RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要。
  行键是字节数组, 任何字符串都可以作为行键;
  表中的行根据行键进行排序,数据按照Row key的字节序(byte order)排序存储;
  所有对表的访问都要通过行键 (单个RowKey访问,或RowKey范围访问,或全表扫描)

2.列族(ColumnFamily)

  Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
  列族必须在表定义时给出;
  每个CF可以有一个或多个列成员(ColumnQualifier),列成员不需要在表定义时给出,新的列族成员可以随后按需、动态加入;
  数据按列族分开存储,HBase所谓的列式存储就是根据列族分开存储(每个列族对应一个Store),这种设计非常适合于数据分析的情形。

3.列(Column)

  Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加

4.时间戳(TimeStamp)

  每个Cell可能又多个版本,它们之间用时间戳区分

5.单元格(Cell)

  Cell 由行键,列族:限定符,时间戳唯一决定;
  Cell中的数据是没有类型的,全部以字节码形式存贮;

6.区域(Region)

  HBase自动把表水平(按Row)划分成多个区域(region),每个region会保存一个表里面某段连续的数据;
  每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region;
  当table中的行不断增多,就会有越来越多的region。这样一张完整的表被保存在多个Region 上;
  HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元表示不同的HRegion可以分布在不同的HRegionServer上。但一个HRegion不会拆分到多个server上。