稀疏的,多维的,分布式的,持久的,排序的map

HBase数据模型

hadoop中列簇 hbase列簇_时间戳

  1. table:表,一个表中有多行数据
  2. row:行,有唯一标识rowkey,多个column family。一张表中所有row都是按照rowkey的字典序排序的。
  3. column:列,有column family 列簇 和qualifer 列组成,两者用: 相连。列簇下的列是可动态扩展的。在存储结构上,一个列簇就是一个HFile。
  4. timestamp:时间戳,每个cell在写入时都带有一个时间戳,resign级别的。
  5. cell:单元,由五元组(row,column,timestamp,type,value)组成,k-v结构。

HBase特性:

  1. 稀疏:存储是按照列簇存储的,列中允许有空值。其他的数据库中,空值一般需要填充null,而HBase不需要填充。也就是HBase在理论上允许无线扩展,对于百万列来讲,存在的大量空值不会占用空间。
  2. 排序:所有的KV在文件中都是按照rowkey的字典序排序的,先比较rowkey在比较column family以此比较。
  3. 分布式:
  4. 多维:key是row,column,timestamp,type构成的

行存储,列存储,列簇存储

  1. 行存储:将一行数据存储在一起,一行写完在写下一行,MySQL。在获取行数据时高效,但如果只查询某一列,这种方式引入大量无用的列信息,占内存。
  2. 列存储:将一列数据存在一起,不同列分开处理,HDFS。同一列具有相同的属性,所以列式存储具有高压缩性。
  3. 列簇存储:上述两者的综合,所有列簇存储在一起。

HBase体系结构

hadoop中列簇 hbase列簇_时间戳_02

  1. Client:HBase客户端访问数据之前,根据通过元数据表先定位数据在哪个RegionServer,再发送请求到RegionServer。
  2. ZooKeeper:协调管理分布式系统,主要有以下几个作用:
  1. 实现Master高可用,zk检测master是否宕机,若宕机再选举出一个新的master。
  2. 参与RegionServer的宕机恢复:zk通过心跳感知RS是否宕机,若宕机通知Master。
  3. 实现分布式表锁。
  1. Master:管理各种用户请求(建表 修改),管理集群中的RegionServer(负载,迁移),清理过期的日志文件(HLog HFile是否过期)
  2. RegionServer:响应用户的IO请求,由HLog,Region和BlockCache组成。
  1. HLog:HBase的随机写时,先写HLog,再写缓存,最后异步刷新到磁盘
  2. BlockCache:块缓存,由物理上相邻的多个KV数据组成,缓存策略LRUBlockCache和BucketCache策略
  3. Region:数据表的一个分片,当数据表大小超过阈值就水平切分,分成两个Region。Region是负载均衡的单位。
  1. HDFS:数据实际HDFS落盘,只支持顺序写,随机写需第三方插件

HBase优缺点:

优点

  1. 容量巨大,支持千亿行数据规模,传统的数据库MySQL如果单标超过亿行,读写速度下降。
  2. 良好的扩展性,HBase底层依赖HDFS系统,HDFS可以通过简单的增加节点进行扩展,HBase也可以增加RegionServer扩展。
  3. 稀疏:允许大量的列的值为空,并不占用任何存储空间。上百万列的数据,即使有大量空值也不占用额外的空间。
  4. 高性能:数据的写性能强劲,随机单点读及小范围读扫描也可以保证性能,大范围的读使用MapReduce能够高效扫描。
  5. 多版本:每个KV都是带时间戳的,更新操作实际上是插入,会保留所有版本。
  6. 支持过期:可以设置TTL,数据过期会自动清理。
  7. Hadoop原生支持。

缺点

  1. 本身不支持复杂的聚合操作,join,group by等,需要第三方组件,如Phoenix
  2. 本身不支持二级索引,需要组件,Phoenix
  3. 本身不支持全局跨行事务,需要组件,Phoenix

算法与数据结构

LSM树

Log-Structured-Merge-Tree,LSM树并不像B+树、红黑树一样是一颗严格的树状数据结构,它其实是一种存储结构,目前HBase,LevelDB,RocksDB这些NoSQL存储都是采用的LSM树。

LSM树的核心特点是利用顺序写来提高写性能,通过牺牲小部分读性能换来高性能写,使得LSM树成为非常流行的存储结构。

HBase的一个列簇就是一个LSM树。LSM分为内存部门和磁盘部分。内存部分采用跳跃链表维护一个有序的KV集合,磁盘部分有多个内部的KV有序文件。

先写入内存部分,超过一定阈值刷到磁盘部分(顺序读写),磁盘中的有序文件定期通过多路归并进行合并,

hadoop中列簇 hbase列簇_数据_03

如上图所示,LSM树有以下三个重要组成部分:

1) MemTable

MemTable是在内存中的数据结构,用于保存最近更新的数据,会按照Key有序地组织这些数据,LSM树对于具体如何组织有序地组织数据并没有明确的数据结构定义,例如Hbase使跳跃表来保证内存中key的有序。

因为数据暂时保存在内存中,内存并不是可靠存储,如果断电会丢失数据,因此通常会通过WAL(Write-ahead logging,预写式日志)的方式来保证数据的可靠性。

2) Immutable MemTable

当 MemTable达到一定大小后,会转化成Immutable MemTable。Immutable MemTable是将转MemTable变为SSTable的一种中间状态。写操作由新的MemTable处理,在转存过程中不阻塞数据更新操作。

3) SSTable(Sorted String Table)

有序键值对集合,是LSM树组在磁盘中的数据结构。为了加快SSTable的读取,可以通过建立key的索引以及布隆过滤器来加快key的查找。

跳跃链表

跳跃表的插入,删除,查找时间复杂度O(logn),平衡度是按照概率的,是非严格的平衡,跳跃链表在redis中也使用,此处不详述。。。

布隆过滤器

布隆过滤器占用小的空间可以给出,“可能存在”和“一定不存在”的判断,可以提前过滤掉很多不必要的数据库,节省IO。这里先不详述。。。

二级索引

HBase本身不支持二级索引,可以借助组件,也可以自行设计。

比如:学生信息,假设学号id和name分别对应mysql中的聚集索引和辅助索引。

HBase原生支持Region内部的多行操作原子性,若一次RPC的多个操作都落在同一个Region内,则操作是原子的,单显然这种情况不能保证。

  1. 局部二级索引,把region-A的索引数据也存在region-A内,这样能够保证索引数据和主表数据是原子的。额外增加一个列簇放索引数据。rowKey设置成:rowkey=startKey:name:id。读取的时候要考虑每个region是否包含对应数据。
  2. 全局二级索引,通过分布式事务协议保证跨region的原子性。读的性能更优。

事务

HBase支持region内部的事务,即保证同个region内部多个操作的acid。根本原因是cell的时间戳是region级别的,不同region间无法保证全局的时间戳顺序。

单行事务:一行数据下多个列簇,保证该行内的多个列簇的多个操作室原子的。

跨行事务。

设计分布式跨行事务系统需要考虑哪些:

  1. 一个全局的时间戳。不精确的时间戳无法评定众多并发事务的顺序,无法保证事务的隔离性 isolation
  2. 一个全局的锁检测服务。两个并发事务不能修改同行记录,避免死锁。这就需要一个全局的锁检测服务。
  3. 分布式系统中事务操作高吞吐,高并发。所以设计出来的分布式系统要具备扩展能力。
  4. 保证跨行事务的acid。

题目:

每天百亿数据存入HBase,如何保证数据的存储正确和在规定时间里全部录入完毕

百亿数据的话就是每秒百万量级的写入,所以实时写入不适用,应该批量导入。

保证数据的正确,这里要考虑rowkey的设计。

预建分区和列簇

HBase优化方案

预建分区,否则随着region的增加,region会进行分裂,增加IO开销。

开启布隆过滤器,提高查找速度。(布隆过滤器是列簇级别的)

rowkey的合理设计,能够保证相似的rowkey聚合,相异的分散。如果查询条件比较多,那么rowkey就应该支持多条件查询。如果是查最近插入的数据优先,那么可以让rawkey递减排序。

HBase和Hive对比

HBase KV形式存储,Hive是类似SQL的

HBase适用的场景是实时的,hive适用离线处理

HBase支持增删,hive只支持导入和查询