HBase的安装、命令操作和基础编程
JunLeon——go big or go home

目录
前言:
学习HBase这个组件,可能很多人都有这个这个疑惑:HDFS和MySQL等都可做数据的持久化存储,那为什么还要学习这个HBase呢?而HBase的最终数据还是存储在HDFS中,那为什么还要使用HBase呢?HBase和HDFS又有什么关系呢?
HBase作为Hadoop的分布式数据库,基于Google发行的三篇论文之一——《BigData》研发的Hadoop生态组件之一。那我们为啥要用HBase呢?HBase在HDFS之上提供了高并发的随机写和支持实时查询,这是HDFS不具备的。
HDFS是分布式文件存储系统,HBase是分布式数据库,两者其实没有什么可比性。可能很多人对MySQL比较熟悉,MySQL的数据持久化就是将数据落地磁盘存储。简单理解就是可以把HBase当做是MySQL,把HDFS当做是硬盘。HBase只是一个NoSQL数据库,把数据存在HDFS上。
一、HBase的概述
1.什么是HBase?
HBase是高可靠性、高性能、面向列、可伸缩的分布式存储系统,是基于HDFS的分布式数据库,也是一种非关系型数据库。分布式数据库HBase是Hadoop生态系统的组件之一。HBase的运行依赖于Hadoop HDFS文件系统提供数据的持久化,依赖于Zookeeper提供集群的的同步与协调。HBase使用Zookeeper服务来进行节点管理以及表数据的定位。
2.HBase的特点
(1)大:一个表可以有上亿行,上百万列。
(2)面向列:面向列表(簇)的存储和权限控制,列(簇)独立检索。
(3)稀疏:对于为空(NULL)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
(4)无模式:每一行都有一个可以排序的主键和任意多的列,列可以根据需要动态增加,同一张表中不同的行可以有截然不同的列。
(5)数据多版本:每个单元中的数据可以有多个版本,默认情况下,版本号自动分配,版本号就是单元格插入时的时间戳。
(6)数据类型单一:HBase中的数据都是字符串,没有类型。
3.HBase组成部分及数据模型
(1)HBase架构的组件及其作用
HBase采用Master/slaves的主从服务器架构,由一个HMaster服务器和多个HRegionServer服务器组成。HBase采用Master/Slave架构,主要角色包括Master服务器(HMaster,管理节点)、Region服务器(HRegionServer,数据节点)、ZooKeeper服务器以及客户端。

1.HMaster HMaster
HMaster HMaster是主节点,它主要负责HRegionServer的管理以及元数据的更改,包括以下内容:新HRegionServer的注册、表的增删改查、HRegionServer的负载均衡,Region(表的分区,存储在Region服务器上)的分布调整、Region分裂以及分裂后的Region分配,HRegionServer失效后的Region迁移等。
HMaster采用主备模式部署,集群启动时,通过竞争获得主HMaster角色。主HMaster只能有一个,备HMaster进程在集群运行期间处于休眠状态,不干涉任何集群事务。当主用Master故障时,备用Master将取代主用Master对外提供服务。
2.HRegionServer
HRegionServer是HBase的从节点,它负责提供表数据读写等服务,是数据存储和计算单元。HRegionServer一般与HDFS集群的DataNode部署在一起,实现数据的存储功能。一台HRegionServer管理多个Region对象和一个HLog文件。
一个Region由一个或多个Store组成。每个Store存储该Region一个列族的数据。一个Store包含一个MemStore缓存以及若干StoreFile文件,MemStore缓存客户端向Region插入的数据,当HRegionServer中的MemStore大小达到配置的容量上限时,RegionServer会将MemStore中的数据刷新(Flush)到HDFS中。MemStore的数据刷新到HDFS后成为HFile,HFile定义了StoreFile在文件系统中的存储格式,它是当前HBase系统中StoreFile的具体实现。随着数据的插入,一个Store会产生多个StoreFile,当StoreFile的个数达到配置的最大值时,RegionServer会将多个StoreFile合并为一个大的StoreFile。
HLog日志是一种预写式日志(Write Ahead Log),用户更新数据时需要先写入HLog再写入MemStore,MemStore中的数据被刷新到StoreFile之后才会在HLog中清除对应的记录,这样的设计保证了当HRegionServer故障时,用户写入的数据不丢失,一台HRegionServer的所有Region共享同一个HLog。
3.ZooKeeper
ZooKeeper为HBase集群各进程提供分布式协作服务。各HRegionServer将自己的信息注册到ZooKeeper中,HMaster据此感知各个HRegionServer的健康状态。
HBase还通过ZooKeeper实现HMaster的高可用。ZooKeeper存储HBase的如下信息:HBase元数据、HMaster地址。当HMaster主节点出现故障时,HMaster备用节点会通过ZooKeeper获取主HMaster存储的整个HBase集群状态信息,接管HMaster主节点的工作。
4.Client
客户端通过HBase的元数据找到所需数据所在的HRegionServer进行访问(HBase的元数据存储在ZooKeeper中,因此客户端在做读取操作时不需要与HMaster进行通信,这样的设计减少了HMaster的负担),客户端会在缓存中维护访问过的Region位置信息,下次访问时就可以跳过向ZooKeeper寻址的过程。如果缓存中位置信息所指向的HRegionServer失效或Region已被迁移到其他服务器,客户端在查找不到该Region的情况下,会重新查询元数据以获取该Region的新地址。除了读取HRegionServer的信息外,客户端还可以与HMaster通信做表的修改。
(2)HBase的数据模型
HBase中,数据存储在由行和列组成的表中,HBase的表是稀疏的,多维映射的。HBase用键值对的方式存储数据。每个值都是未经解释的字符串,通过行键、列族、列限定符、时间戳等信息进行定位。
1.表(Table)
HBase采取表的形式存储数据,表由行和列组成。
2.行(Row)
HBase中的行由行键(RowKey)和若干列组成。行是通过行键按字典顺序进行排序的,因此行键的设计非常重要,好的行键设计可以将内容相关的行排列到相邻位置,方便查找和读取。以存储网页内容为例,将URL作为行键,如org.apache.www、org.apache.mail,可以将相邻子网页存储在相邻的位置。
3.列族(Column Family)
一个表在水平方向上由一个或多个列族组成。一个列族可以由任意多个列组成,列族在表创建时就需要预先设定好。
列族是Region的物理存储单元。同一个Region下面的多个列族,位于不同的Store下面。
列族信息是表级别的配置。同一个表的多个Region,都拥有相同的列族信息(例如,都有两个列族,且不同Region的同一个列族配置信息相同)。不是每一行下的列族或列中都存储了信息,因此说HBase的表是稀疏的。
4.列限定符(Column Qualifier)
列族中添加不同的列限定符可以对数据进行划分定位,列限定符以列族名作为前缀,用“:”连接后缀。例如以“content”为列族,那么列限定符则可以是“content:xxxx”。列限定符是列族下的一个标签,可以在写入数据时任意添加,支持动态扩展,无需预先定义列的数量和类型。
5.单元格(Cell)
一个单元格保存了一个值的多个版本,单元格通过行键、列族和列限定符进行定位,每个版本对应一个时间戳。
6.时间戳(TimeStamp)
HBase每个值都会带一个时间戳,时间戳标识了这个值的版本。默认情况下,在一个值发生变化(写入、更新、删除)时,所在的HRegionServer会自动为其创建一个时间戳。用户也可以在值发生变化时自定义时间戳。如果一个值有多个版本,在用户查询时默认返回最新的版本。HBase保存的版本数可以自定义,当超过设置的版本数时,新的版本会替换掉最早的版本。
(3)表和Region
一个HBase集群中维护着多张表,每张表可能包含非常多的行,在单台机器上无法全部存储,HBase会将一张数据表按行键的值范围横向划分为多个子表,实现分布式存储,如图5-1所示。这些子表,在HBase中被称作“Region”,Region是HBase分布式存储的基本单元。每一个Region都关联一个行键值的范围,即一个使用StartKey和EndKey描述的区间。事实上,每一个Region仅仅记录StartKey就可以了,因为它的EndKey就是下一个Region的StartKey。
每张表最开始值包含一个Region,随着表中数据的不断增大,Region中的行数超过一定阈值时就会分裂为两个新的Region。
Region分为元数据Region以及用户Region(User Region)两类。用户Region用于存储普通数据,元数据Region包括.META.表和-ROOT-表,用于存储Region的位置信息。.META.表记录了每一个用户Region的路由信息,用户可以通过.META.表查询到要访问的Region所在的HRegionServer,从而与其建立通信进行数据操作。.META.表的路由信息存储在-ROOT-表中,-ROOT-表不可被分割,只有一个Region。用户可以通过访问ZooKeeper服务器来获得-ROOT-表的位置。Region的划分如下图:

从HBase0.96.0开始,-ROOT-表的设置已被移除,.META.表改名为hbase:meta,hbase:meta的位置信息直接保存在ZooKeeper中。
4.HBase的读写流程
1.HBase的读流程
HBase的读流程如下: ·
客户端发起请求,与ZooKeeper服务器通信获取hbase:meta所在的HRegion Server,记为HRegionServer A;
访问HRegionServer A中的hbase:meta,hbase:meta中记载着各个User Region信息(行键范围,所在RegionServer等),通过行键查找hbase:meta获取所要读取的Region所在HRegionServer,记为HRegionServer B;
请求发送到HRegionServer B,HRegionServer B先查询MemStore,如果未查询到目标数据,则在HFile中查找; ·
&nbs

本文深入介绍了HBase的原理与特性,包括其分布式架构、数据模型、读写流程和Compaction过程。在HadoopHA集群上详细阐述了HBase的安装配置步骤,如下载HBase、配置环境变量、启动集群等。此外,还展示了HBase的Shell命令操作,如创建表、查询数据等,并给出了HBase Java API编程示例,包括数据的增删改查操作。
最低0.47元/天 解锁文章
3672





