一.HBase概况

HBase是一个构建在HDFS上的分布式列存储系统;
HBase是基于Google BigTable模型开发的,典型的key/value系统;
HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;
从逻辑上讲,HBase将数据按照表、行和列进行存储。
与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算和存储能力。
Hbase表的特点
大:一个表可以有数十亿行,上百万列;
无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
面向列:面向列(族)的存储和权限控制,列(族)独立检索;
稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;
数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
数据类型单一:Hbase中的数据都是字符串,没有类型。

和传统数据库对比:

1、传统数据库遇到的问题:

  1)数据量很大的时候无法存储;
  2)没有很好的备份机制;
  3)数据达到一定数量开始缓慢,很大的话基本无法支撑;

2、HBASE优势:

  1)线性扩展,随着数据量增多可以通过节点扩展进行支撑;
  2)数据存储在hdfs上,备份机制健全;
  3)通过zookeeper协调查找数据,访问速度快。

HBase逻辑视图:

 

hbase 存储文本 hbase如何存储数据_hbase 存储文本

•表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族

•行:每个HBase表都由若干行组成,每个行由行键(row key)来标识。

•列族:一个HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元

•列限定符:列族里的数据通过列限定符(或列)来定位

•单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]

•时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引

二.HBase原理

hbase 存储文本 hbase如何存储数据_数据_02

Client:

使用HBase RPC机制与HMaster和HRegionServer进行通信
Client与HMaster进行管理类操作
Client与HRegionServer进行数据读写类操作

Zookeeper:

Zookeeper Quorum存储-ROOT-表地址、HMaster地址
HRegionServer把自己以Ephedral方式注册到Zookeeper中,HMaster随时感知各个HRegionServer的健康状况
Zookeeper避免HMaster单点问

HMaster:

HMaster没有单点问题,HBase可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行
主要负责Table和Region的管理工作:
1. 管理用户对表的增删改查操作
2. 管理HRegionServer的负载均衡,调整Region分布
3. Region Split后,负责新Region的分布
4. 在HRegionServer停机后,负责失效HRegionServer上Region迁移

HRegionServer:

HBase中最核心的模块,主要负责响应用户I/O请求,向HDFS文件系统中读写

HStore:

HBase存储的核心。由MemStore和StoreFile组成。MemStore是Stored Memory Buffer。
HLog:

引入HLog原因:在分布式系统环境中,无法避免系统出错或者宕机,一旦HRegionServer意外退出,MemStore中的内存数据就会丢失,引入HLog就是防止这种情况。

•主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡

•Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求

•客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据

•客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小

三.HBase的功能组件

•HBase的实现包括三个主要的功能组件:

–(1)库函数:链接到每个客户端

–(2)一个Master主服务器

–(3)许多个Region服务器

•主服务器Master负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡

•Region服务器负责存储和维护分配给自己的Region,处理来自客户端的读写请求

•客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据

•客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小

•开始只有一个Region,后来不断分裂(如下图)

•Region拆分操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件

 

hbase 存储文本 hbase如何存储数据_HBase_03

•元数据表,又名.META.表,存储了Region和Region服务器的映射关系

•当HBase表很大时, .META.表也会被分裂成多个Region

•根数据表,又名-ROOT-表,记录所有元数据的具体位置

•-ROOT-表只有唯一一个Region,名字是在程序中被写死的

•Zookeeper文件记录了-ROOT-表的位置

hbase 存储文本 hbase如何存储数据_数据_04

层次

名称

作用

第一层

Zookeeper文件

记录了-ROOT-表的位置信息

第二层

-ROOT-表

记录了.META.表的Region位置信息

-ROOT-表只能有一个Region。通过-ROOT-表,就可以访问.META.表中的数据

第三层

.META.表

记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息

•为了加快访问速度,.META.表的全部Region都会被保存在内存中

•假设.META.表的每行(一个映射条目)在内存中大约占用1KB,并且每个Region限制为128MB,那么,上面的三层结构可以保存的用户数据表的Region数目的计算方法是:

•(-ROOT-表能够寻址的.META.表的Region个数)×(每个.META.表的 Region可以寻址的用户数据表的Region个数)

•一个-ROOT-表最多只能有一个Region,也就是最多只能有128MB,按照每行(一个映射条目)占用1KB内存计算,128MB空间可以容纳128MB/1KB=217行,也就是说,一个-ROOT-表可以寻址217个.META.表的Region。

•同理,每个.META.表的 Region可以寻址的用户数据表的Region个数是128MB/1KB=217。

•最终,三层结构可以保存的Region数目是(128MB/1KB) × (128MB/1KB) = 234个Region

 

hbase 存储文本 hbase如何存储数据_数据_05

客户端访问数据时的“三级寻址”

•为了加速寻址,客户端会缓存位置信息,同时,需要解决缓存失效问题

•寻址过程客户端只需要询问Zookeeper服务器,不需要连接Master服务器

 

四.HBASE系统构架

hbase 存储文本 hbase如何存储数据_数据_06

•1. 客户端

–客户端包含访问HBase的接口,同时在缓存中维护着已经访问过的Region位置信息,用来加快后续数据访问过程

•2. Zookeeper服务器

–Zookeeper可以帮助选举出一个Master作为集群的总管,并保证在任何时刻总有唯一一个Master在运行,这就避免了Master的“单点失效”问题

hbase 存储文本 hbase如何存储数据_客户端_07

•3. Master

•主服务器Master主要负责表和Region的管理工作:

–管理用户对表的增加、删除、修改、查询等操作

–实现不同Region服务器之间的负载均衡

–在Region分裂或合并后,负责重新调整Region的分布

–对发生故障失效的Region服务器上的Region进行迁移

•4. Region服务器

–Region服务器是HBase中最核心的模块,负责维护分配给自己的Region,并响应用户的读写请求

四.Region服务器机制

hbase 存储文本 hbase如何存储数据_服务器_08

图中 Region服务器向HDFS文件系统中读写数据

1. 用户读写数据过程

•用户写入数据时,被分配到相应Region服务器去执行

•用户数据首先被写入到MemStore和Hlog中

•只有当操作写入Hlog之后,commit()调用才会将其返回给客户端

•当用户读取数据时,Region服务器会首先访问MemStore缓存,如果找不到,再去磁盘上面的StoreFile中寻找

2. 缓存的刷新

•系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记

•每次刷写都生成一个新的StoreFile文件,因此,每个Store包含多个StoreFile文件

•每个Region服务器都有一个自己的HLog 文件,每次启动都检查该文件,确认最近一次执行缓存刷新操作之后是否发生新的写入操作;如果发现更新,则先写入MemStore,再刷写到StoreFile,最后删除旧的Hlog文件,开始为用户提供服务

3. StoreFile的合并

•每次刷写都生成一个新的StoreFile,数量太多,影响查找速度

•调用Store.compact()把多个合并成一个

•合并操作比较耗费资源,只有数量达到一个阈值才启动合并

•Store是Region服务器的核心

•多个StoreFile合并成一个

•单个StoreFile过大时,又触发分裂操作,1个父Region被分裂成两个子Region

hbase 存储文本 hbase如何存储数据_hbase 存储文本_09

五.安装和配置Hbase

解压安装包hbase-1.1.2-bin.tar.gz至路径 /usr/local:

sudo tar -zxf ~/下载/hbase-1.1.2-bin.tar.gz -C /usr/local

将解压的文件名hbase-1.1.2改为hbase:

sudo mv /usr/local/hbase-1.1.2 /usr/local/hbase
编辑~/.bashrc文件
vi ~/.bashrc
如果没有引入过PATH在~/.bashrc文件尾行添加如下内容:
export PATH=$PATH:/usr/local/hbase/bin
编辑完成后,再执行source命令使上述配置在当前终端立即生效,命令如下:
source ~/.bashrc
添加HBase权限
cd /usr/local
sudo chown -R hadoop ./hbase       #将hbase下的所有文件的所有者改为hadoop,hadoop是当前用户的用户名。

HBase安装时有三种模式:单机模式、伪分布式模式和分布式模式。部署比较复杂 ,网上教程多,我是用伪分布式部署的

四.创建Hbase

先启动hadoop

cd /usr/local/hadoop
./sbin/start-all.sh

输入jps命令查看是否启动成功:

jps

如果少了以下其中一个进程,说明启动失败。

2375 SecondaryNameNode
2169 DataNode
2667 NodeManager
2972 Jps
2045 NameNode
2541 ResourceManager