阿里妹导读:2006 年10 月Google 发布三架马车之一的《Bigtable:A Distributed Storage System for Strctured Data》论文以后,Powerset 公司就宣布 HBase 在 Hadoop 项目中成立,做为子项目存在。后来,在2010 年左右逐渐成为 Apache 旗下的一个顶级项目。多是实际应用中包装得太好,不少人对于 HBase 的认识止步于 NoSQL 。今天,蚂蚁金服的南俊从基础开始讲起,但愿有助于加强你们在实际业务中对 HBase 的理解。数据库
HBase 名称的由来是因为其做为 Hadoop Database 存在的,用来存储非结构化、半结构化数据。数组
要想知道 HBase 的用途,就须要看一看其在 Apache 的 Hadoop 生态系统中的位置,能够看到 HBase 是构建在 HDFS 之上的,这是因为 HBase 内部管理的文件所有都是存储在 HDFS 当中的。同时,MapReduce 这个计算框架在 HBase 之上又提供了高性能的计算能力来处理海量数据。此外还有一些像 Pig、Hive 用来提供高层语言的支持。还有 Sqoop 用来完成传统数据库到 HBase 之间的数据迁移。相似衍生出来的新技术还有不少,有兴趣的同窗能够本身去了解一下。缓存
Google 的三架马车 BigTable、GFS、MapReduce 如今在开源社区中都能找到对应的实现。HBase 就是 Bigtable 的开源实现,固然这句话不是彻底正确,由于二者之间仍是有些差别的。可是主要仍是基于 BigTable 这个数据模型开发的,所以也是具备 Key-Value 特征的,同时也就具备 Bigtable 稀疏的、面向列的这些特性。服务器
也是因为 HBase 利用 HDFS 做为它的文件系统,所以它也具备 HDFS 的高可靠性和可伸缩性。和 Hadoop 同样,HBase 也是依照横向扩展,经过不断地经过添加廉价的服务器来增长计算和存储的能力。BigTable 利用 Chubby 来进行协同服务,HBase 则是利用 Zookeeper 来对整个分布式系统进行协调服务。正是由于经过HDFS 的高可靠可伸缩性,以及应用了 Bigtable 的稀疏的面向列的这些高效的数据组织形式。因此 HBase 才能如此地适合大数据随机和实时读写。负载均衡
这里介绍一下 HBase 的一些基本概念:框架
RowKey(行键),顾名思义也就是咱们在关系型数据库中常见的主键,它是Unique 的,在 HBase 中这个主键能够是任意的字符串,其最大长度是64K,在内部存储中会被存储为字节数组,HBase 表中的数据是按照 RowKey 的字典序排列的,例如不少索引的实现,包括地理空间索引很大程度就是依赖这个特性。分布式
不过也要注意一个点,现实当中指望排序是一、二、三、4...10,而在 HBase 中1 后面紧跟的会是10。所以,在设计行键的时候必定要充分地利用字典序这个特性,将一下常常读取的行存储到一块儿或者靠近,减小Scan 的耗时,提升读取的效率。这里必定要说的一点是,行键设计真的很重要,例如作组合行键时将时间排前面,致使写热点(曾经踩过的坑,记忆犹新)。oop
Column Family(列族),它是由若干列构成,是表 Schema 的一部分,因此须要在建立表的时候就指定好。但也不是所表建立完以后就不能更改列族,只是成本会比较大,所以不建议更改。HBase 中可容许定义的列族个数最多就20多个。列族不只仅可以帮助咱们构建数据的语义边界,还能有助于咱们设置某些特性,好比能够指定某个列族内数据的压缩形式。一个列族包含的全部列在物理存储上都是在同一个底层的存储文件当中。性能
Column (列),通常都是从属于某个列族,跟列族不同,列的数量通常的没有强限制的,一个列族当中能够有数百万个列,并且这些列均可以动态添加的。这也是咱们常说的 HBase 面向列的优势,不像传统的关系型数据库,调整一下 Schema 都须要担忧对于生产的影响。大数据
Version Number(版本号),HBase 中每一列的值或者说是每一个单元格的值都是具备版本号的,默认使用的系统当前的时间戳,精确到毫秒。固然也能够是用户本身显式地设置,咱们是经过时间戳来识别不一样的版本,所以若是要本身设置的话,也要保证版本号的惟一性。用户也能够指定保存指定单元格的最后 N 个版本,或者某个时间段的版本,这个是能够在配置中配置的。一个单元格里面是数据是按照版本号降序的。也就是说最后写入的值会被最早读取。
Cell(单元格),一个单元格就是由前面说的行键、列标示、版本号惟一肯定的,这里说的列标示包括列族和列名。Cell 中的数据是没有类型的,所有都是字节码。
因为 HBase 表的一个单元格是由多维决定的,我这里尝试用一个二维的电子表格来展现。能够结合前面说的 HBase 的基本概念来理解。能够看到经过二维表格来展现一个成绩表,中间有不少单元格是空的,总体看起来很稀疏,须要说明的是在 HBase 的实际存储中这些空的单元格并不占存储。
物理视图比较复杂,下面以图来展现一个 HBase 表从宏观到微观到物理存储。尽可能以最简单到方式展现物理视图的几个层次。
一个 Region 是由一个或多个 Store 组成。每个 Store 其实就是一个列族。每一个
Store 又是由一个 memStore 和 0 个或者多个 storeFile 组成。memStore 是存储在内存中,storeFile 是存储在 HDFS 中,有时候也称做 HFile。数据都会先写入memStore,一旦 memStore 超过给的的最大值以后,HBase 就会将memStore 持久化为 storeFile。
一个 HBase 集群通常由一个 Master 和多个 RegionServer 组成。
原文连接 本文为云栖社区原创内容,未经容许不得转载。