0%

HBase基础

1. HBase的存储形式

hbase的内部使用KeyValue的形式存储,其key是rowKey:family:column:logTime,value是其存储的内容。

其在region内大多以升序的形式排列,唯一的时logTime是以降序的形式进行排列。

所以,rowKey里越靠近左边的信息越容易被检索到。其设计时,要考虑把重要的信息放左边,不重要的信息放到右边。这样可以提高查询数据的速度。最重要的提高索引速度的就是设计合适的rowKey。

在做RowKey设计时,请先考虑业务是读比写多,还是读比写少,HBase本身是为写优化的,即便是这样,也可能会出现热点问题,而如果我们读比较多的话,除了考虑以上RowKey设计原则外,还可以考虑HBase的Coprocessor甚至elasticSearch结合的方法,无论哪种方式,都建议做实际业务场景下数据的压力测试以得到最优结果。

1.1 Hbase的存储结构

1.1.1 逻辑存储结构

- - 列族:info 列族:area
行键 时间戳 name / age country / city
Row1 t1 张三 / 11 中国 / 上海
Row2 t2 王二 / 20

在本图中,列簇(Column Family)对应的值就是 info 和 area ,列( Column 或者称为 Qualifier )对应的就是 name 、 age 、 country 和 city ,Row key 对应的就是 Row 1 和 Row 2,Cell 对应的就是具体的值。

  • Row key :表的主键,按照字典序排序。
  • 列簇:在 HBase 中,列簇将表进行横向切割。
  • 列:属于某一个列簇,在 HBase 中可以进行动态的添加。
  • Cell : 是指具体的 Value 。
  • Version :在这张图里面没有显示出来,这个是指版本号,用时间戳(TimeStamp )来表示。

在 HBase 中的 KEY 组成是这样的:

Row key CF(列簇) cloumn TimeStamp value
row 1 info name t1 张三

KEY 的组成是以 Row key 、CF(Column Family) 、Column 和 TimeStamp 组成的。

TimeStamp 在 HBase 中充当的作用就是版本号,因为在 HBase 中有着数据多版本的特性,所以同一个 KEY 可以有多个版本的 Value 值(可以通过配置来设置多少个版本)。查询的话是默认取回最新版本的那条数据,但是也可以进行查询多个版本号的数据

1.1.2 Region Server 和 Region 的关系

Region Server Region Server Region Server Region Server
RegionA RegionA RegionB RegionB
CFA CFB CFC CFD
  • 一个 Region Server 就是一个机器节点(服务器)
  • 一个 Region Server 包含着多个 Region
  • 一个 Region 包含着多个列簇 (CF)
  • 一个 Region Server 中可以有多张 Table,一张 Table 可以有多个 Region

1.1.3 Hbase读取数据的过程

Client 请求读取数据时,先转发到 ZK 集群,在 ZK 集群中寻找到相对应的 Region Server,再找到对应的 Region,先是查 MemStore,如果在 MemStore 中获取到数据,那么就会直接返回,否则就是再由 Region 找到对应的 Store File,从而查到具体的数据。

在整个架构中,HMaster 和 HRegion Server 可以是同一个节点上,可以有多个 HMaster 存在,但是只有一个 HMaster 在活跃。

在 Client 端会进行 rowkey-> HRegion 映射关系的缓存,降低下次寻址的压力。

1.2 HBase的存储机制

HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续存储在磁盘上。表中的每个单元格值都具有时间戳。总之,在一个HBase:

  • 表是行的集合。
  • 行是列族的集合。
  • 列族是列的集合。
  • 列是键值对的集合。

这里的列式存储或者说面向列,其实说的是列族存储,HBase是根据列族来存储数据的。列族下面可以有非常多的列,列族在创建表的时候就必须指定。

2.HBase中建立分区(表)

2.1 为什么要建立分区表/分区表存在的意义是什么:

  • 将大数据表的增加由无序变为有序

2.2 原理

在HBase中,每个表默认时都由一个Region存储原数据,但是若当数据慢慢增加时,就会将一个Region分裂成其他若干个不同的region。但是这种无序的分裂,会让后期的表扫描,表过滤操作很不方便(特别耗时)。正是着眼于未来表的改变,才有了为表创建分区的操作。
提前创建分区表为有序