HBase表格
数据规模大,单表可容纳数十亿行,上百万列;
无模式,不像关系型数据库有严格的Scheme,每行可以有任意多的列,列可以动态增加,不同行可以有不同的列,列的类型没有限制;
稀疏,值为空的列不占存储空间,表可以非常稀疏,但实际存储时,能进行压缩;
面向列族,面向列族的存储和权限控制,支持列族独立查询;
数据多版本,利用时间戳来标识版本;
数据无类型,所有数据以字节数据形式存储。
Hbase一张表可以分别存储在几个Region上,一个Region又分成了好多store,一个store又分成了Memstore和StoreFile,当Memstore满64MB后,会把数据flush到disk上而成为storefile,当storefile数量超过3(设置)时,会启动compaction过程将它们合并为一个storefile。这个过程中会删除一些timestamp过期的数据,比如update的数据。而当合并后的storefile大小大于hfile默认最大值时,会触发split动作,也就是说,当一个Region内的所有存储文件中最大的那个HFile大于hbase.hregion.max.filesize所设置的大小,则将一个Region切分成两个Region。
HBase表格的划分:
表格横向切分
HTable包含非常多行,每行通过RowKey唯一标记,行依照RowKey的字典序排列。表在行的方向上切割为多个HRegion;
表格纵向切分
每行包含一个RowKey和多个Column Family,数据依照Column Family进行物理分割。即不同Column Family的数据放在不同的Store中。一个Column Family放在一个Strore中。
HRegion由多个Store组成。一个Store由物理上存在的一个MemStrore(内存中)和多个StoreFile(HFile)中
二、设计原则:
(1)rowkey
a) rowkey是hbase的key-value存储中的key。通常使用用户要查询的字段作为rowkey ,查询结果作为value 。HBase中RowKey是依照字典序排列的
(2)Column Family的设计需遵循:
a) 不同Column Family的数据,在物理上是分开的,尽量避免一次请求须要拿到的Column分布在不同的Column Family中;
b) CF的数量尽量要少。原因是过多的columnfamily之间会互相影响
(3) column
对于column须要扩展的应用。column可以按普通的方式设计,可是对于列相对固定的应用,最好採用将一行记录封装到一个column中的方式。这样可以节省存储空间。封装的方式推荐protocolbuffer。
表格和regionserver组件的对应关系
HRegion
每个 HRegionServer 内部管理了一系列 HRegion ,他们可以分别属于不同的逻辑表,每个 HRegion 对应了逻辑表中的一个连续数据段。HRegionServer 只是管理表格,实现读写操作。Client 直接连接到 HRegionServer,并通信获取 HBase 中的数据。而 HRegion 则是真实存放 HBase 数据的地方,也就说 HRegion 是 HBase 可用性和分布式的基本单位。当表的大小超过预设值的时候,HBase会自动将表划分为不同的区域,每个区域就是一个HRegion,以主键(RowKey)来区分。一个HRegion会保存一个表中某段连续的数据,一张完整的表数据是保存在多个 HRegion 中的,这些 HRegion 可以在同一个HRegionServer 中,也可以来源于不同的 HRegionServer。
HStore
每个 HRegion 由多个HStore组成,每个 HStore 对应逻辑表在这个 HRegion 集合中的一个 Column Family,建议把具有相近 IO 特性的 Column 存储在同一个 Column Family 中,以实现高效读取 。HStore 由一个 Memstore 及一系列 HFile 组成,Memstore 存储于内存当中,而 HFiles 则是写入到 HDFS 中的持久性文件。用户写入的数据首先会放入 MemStore,当 MemStore大小到达预设值(可通过 hbase.hregion.memstore.flush.size 进行配置)后就会 Flush 成一个StoreFile(即 HFile)文件。
MemStore
MemStore 是一个缓存 (In Memory Sorted Buffer),当所有数据完成 WAL 日志写后,就会写入MemStore 中,由 MemStore 根据一定的算法将数据 Flush 到地层 HDFS 文件中(HFile),每个 HRegion 中的每个 Column Family 有一个自己的 MemStore。当用户从 HBase 中读取数据时,系统将尝试从 MemStore 中读取数据,如果没找到相应数据才会尝试从 HFile 中读取。当服务器宕机时,MemStore 中的数据有可能会丢失,此时 HBase 就会使用 WAL 中的记录对 MemStroe 中的数据进行恢复。
Storefile
MemStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
HFile
HFile 是最终保存 HBase 数据行的文件,一个 HFile 文件属于一张表中的某个列簇,当中的数据是按 RowKey、Column Family、Column 升序排序,对相同的Cell(即这三个值都一样),则按timestamp倒序排列。