Hbase是一款很热门的分布式 k-v数据库,很多互联网公司都在使用。
Hbase有很好的
扩展性:基于Hadoop分布式系统,可以活跃的增加和剑减少节点
容量巨大:Hadoop可扩展,增加硬件就可以不断的存储很多数据
稀疏性:列簇中的列可以为空,空值不占用存储空间,
高性能:数据写性能很强,随机小量读取性能也不多,大量读取不建议使用。
多版本:同一个rowkey的数据可以保存多个版本,在创建表时可以进行设置。
支持过期:通过设置国旗时间,hbase自动清除数据。
缺点:
不支持复杂的聚合运算。不支持二级索引。原生不支持跨行事务。
从逻辑视图方面来看,hbase也是由表的形式进行组织,表中也包含了行和列。
hbase的逻辑视图基本由以下几个方面组成
table | 表,包含多行数据 |
row | 一个rowkey对应一行数据,并且所有的row都按照字典序进行由小到大的排列。 |
column | 列,在hbase通常被叫做column family(列簇),在创建表的时候就需要指定。列簇下可以创建很多的qualifier(列名),理论上可以扩展到上百万列。两者通过 : 相连,如 col1:name col2:age 列簇中的列名可以完全不同,查询时只查询列名相同的数据,其余找不到的列名,返回值为null,但是与传统数据库不同的是,hbase空值不会占用资源。 |
timestamp | 时间戳。hbase中插入数据都会指定时间戳,根据建表时的设置,对数据进行版本数量控制。用户在查询时,一般返回的是时间戳最大(最新)的数据,但是历史数据也可以查询。 |
cell | 单元格,hbase最基本组成部分。cell是一个kv的存储结构。key的部分包括 row(rowkey,唯一标识) column(列簇+qualifier timestamp(时间戳) type(数据操作类型,包括Put/delete) value部分就是对应的值。 那么hbase中的每一个值,都为一个cell。 |
Hbase本质上来说是一个Map系统,不过是一个分布式的,稀疏的,持久性的,多维的,排序的Map。那么这么多限制词都是什么意思。
多维 | hbase 的map中的key是通过多个值进行组成的。也就是cell的key的组成。 |
稀疏 | hbase中列簇下的列名可以无限扩展,传统数据库中,空值会被填充null值,但是hbase中不会,hbase数据查询时可以理解为,查看列簇下是否有对应的列,没有则返回空。若将这些列以行式数据库的形式展现,那么会有很多的列是没有值的。 比如。 rowkey:1 col:age=>10。 rowkey:2 col:name =>json 那么这个在查询age时,只有rowkey为1 的会返回对应值。但是实际存储时。rowkey=2的并没有存储age的列名。所以不存在的列名不会占用空间。数据组成也就很稀疏。 |
排序 | hbase中的数据都是按照字段需进行排列的。在内存中有序,在磁盘中也有序。在排序过程中,首先比较rowkey,其次是column(列簇+列名),之后比较timestamp。除了时间戳是大的在前,区域的都是小的在前。 比较顺序: rowkey>clolumn>timestamp |
分布式 | 组成hbase的各部分分布在集群不同的机器上。 |
从物理视图来看,hbase中的数据是按照列簇存储的,不同列簇的数据存储在不同的目录中。那么与行式和列式有什么区别。
行式存储 | 数据一行为一个整体,在获取一行数据时效率很高,但是读取指定列对应的值时,会读取每行数据在进行截取适合处理OLTP。 |
列式存储 | 数据按照列集中存储,在查找某一列数据时很高效,遍历对应的数据即可。但是获取一行数据时,需要多次读取,然后将列的数据进行合并。但是因为列式存储的数据格式基本相同,这样的数据压缩比会更高。 |
列簇式存储 | 列簇中存储的数据可以任务时一行数据,在读取时,将列簇中的数据遍历读取。但是列簇之间存储时列式进行存储,不同列簇存储在不同的文件中,也就是列式存储。这样可以将经常访问的数据存储在同一个列簇中。 |
hbase与众多大数据组件加高方式类似,都是采用主从架构的方式。数据存储在用内存和hdfs存储。hbase由以下几个部分组成
hbase客户端:提供shell接口,java API,Thrift/Rest API以及Mapreduce编程接口。客户端在访问数据之前,首先通过元数据表定位目标数据所在的regionserver,之后再回发送请求。元数据会被魂存在客户端本地,当元数据发生变化,会重新获取。
zookeeper:主要用于协调管理分布式程序。通过zookeeper实现hbaseMaster的高可用,管理系统核心元数据,比如regionserver数量,元数据表hbase:meta所在的regionserver等。参与regionserver宕机恢复,实现分布式锁(hbase DDL操作需要加锁)。
master:负责hbase系统的管理,处理用户的各种管理请求(建表,合并,权限等),管理所有regionsever(负载均衡,region迁移,宕机恢复),清理过期日志(Hlog)
regionserver:主要用来响应用户的数据请求,有wal(HLOG),BlockCache(块缓存)以及多个region组成。
WAL:用于实现数据的高可靠性,数据写入时首先写入到Hlog中,作为行为记录(操作日志),之后写入到缓存,最后写入到Hfile。还用于主从之间数据复制。
BlockCache:块缓存,客户端读取的数据通常会将数据缓存在系统内存中。blockcache对象是一系列的Block(64k)组成,由物理上的多个kv数据组成。利用了空间局限性和时间局限性原理。前者表示当前kv值附近的数据也可能被访问,所以缓存的不是单条数据,而是Block块。后者表示当前数据可能最近还会访问,所以保存在内存中一段时间。
region:数据表的分片,是负载均衡的基本单位。region存储的数据量达到阈值时,会进行分裂,这样一个表就可以由多个region组成。一个表的region通常会分布在不同的regionserver上,一个regionserver管理众多的region,这些数据可能不来自同一个表。
一个region有一个或多个store组成,store数量取决于列簇数量,一个store对应一个列簇。
每个store由一个MemStore和一个或多个Hfile组成。Memstore为写缓存,写入数据达到阈值会异步将数据写入Hfile中,Hfile随着时间越来越多,达到一定熟量会进行Compact(合并)。将多个Hfile合并成一个文件。
HDFS :hbase中的HLog日志,用户数据都会存储在hdfs上。
本文所写借鉴《Hbase原理与实践》,感兴趣可以读一读这本书,微信读书可以免费阅读。