N.1 HBaes介绍

N.1.1 HBase简介

1)HBase是一个分布式的、面向列的开源数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

(1)关系型数据库:

————————————————————————

————————————————————————

(2)非关系型数据库:

————————————————————————

————————————————————————

2)行式存储倾向于结构固定,列式存储倾向于结构弱化。

3)行式存储一行数据只需一份主键,列式存储把一行拆多行数据每行都有主键。

4)面向列的存储和权限控制,列(簇)独立检索。

5)稀疏:对于为空(null)的列,并不占用存储空间,因此,表的设计的非常的稀疏。

N.2 HBase架构

1)首先我们要知道HBase储存底层就是HDFS存储。

(这里的单词前面H表示Hadoop的意思,也可以省略)

2)一个HRegionServer可以包含多个HRegion,每个HRegionServer维护一个HLog,和多个HRegion。RegionServer运行于DataNode上,数量可以与DatNode数量一致。

(1)HMater(只能有一个active)类似于NameNode;

(2)HRegionServer类似于DataNode;

(3)HRegion是一张分区表,类似DataNode的数据块的切片;

(4)Store是分区表的某一些字段,即数据块的部分列簇;

(5)HFile就是Store里面的数据,storeFile是对HFile的包装,可以简单认为HFile是表的列簇

行数据和块索等引组成。

(6)Hlog和MemStore,是给用户读写数据用的。

————————————————————————

————————————————————————

N.2.1 HMaster

1)功能:

(1)监控HRegionServer

(2)处理HRegionServer故障转移,迁移HRegionServer

(3)处理元数据的变更

(4)管理用户对Table的增、删、改、查操作

(5)在空闲时间进行数据的负载均衡,管理HRegionServer的负载均衡,调整Region分布

(6)通过Zookeeper发布自己的位置给客户端

(7)HMaster没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行

N.2.2 HRegionServer

1)功能:

(1)HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成。每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效。

(2)负责存储HBase的实际数据

(3)处理分配给它的HRegion

(4)刷新缓存到HDFS

(5)维护HLog

(6)执行压缩

(7)负责处理HRegion分片

2)组件:

(1) Write-Ahead logs

HBase的修改记录,当对HBase写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解 决这个问题,数据操作等先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

(2) HRegion(和split类似)

HBase表的分片,HBase表会数据过多会被切分成不同的HRegion并存储在HRegionServer中,在一个HRegionServer中可以有多个不同的HRegion。

(3) Store(column family)

HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles

一个Store对应HBase表中的一个列簇(列簇有多个列组成, 表如果有很多个字段(列),就可能分成好多个列簇)。

(4)HLog

每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时, 也会写一份日志到HLog文件中(注意,日志不是那些真正的数据,记入了一些行为记录。HLog文件定期会滚动(多个小日志)出新的

(5) MemStore & StoreFiles

[1] MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当日志信息保存在 Write-Ahead logs中之后,HRegsionServer会在内存中存储键值对。

HStore存储是HBase存储的核心了,其中由两部分组成,一部分是MemStore,一部分是StoreFiles(即HFile,可以类似认为一个字段的所有数据,也可能是多个字段,主要看多少数据) MemStore是Sorted Memory Buffer,

[2] StoreFiles

用户写入的数据先log,后MemStore,当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,保证了HBase I/O的高性能。(所以如果是写比较多的话,就使用一个Store好,即列簇少点,这样内存刷新落盘的次数比较少。如果是读多的话可以使用多个Store,即列簇多点,因为这样可以准确定位,避免全部扫描)。

compact机制则是把flush出来的小文件合并成大的Storefile文件。当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前HRegion Split拆成2个HRegion被HMaster分配到相应的HRegionServer上,使得原先1个HRegion的压力得以分流到2个HRegion上

————————————————————————

————————————————————————

(6)HFile

这是在磁盘上保存原始数据的实际的物理文件,

是实际的存储文件。HFile存储在StoreFile中,一对一关系,相当于包装了一下。

可以简单认为HFile是表的几行数据。storefile包装的一行数据。

Hfile的结构:dataBlock的大小是64KB;

————————————————————————

————————————————————————

N.2.3 Compact

1)Compact的作用:

在Memstore超过一定的阈值的时候,就要新开一个进程将Memstore flush到storefile中,新的Memstore继续写入接受到的数据,当storefile越来越多时,就会降低读的性能,为了提高读的性能,可以对这些storefile进行compact操作,形多个storefile合并成一个大的storefile,那么compact就需要对HBase的数据进行多次的重新读写,这将产生大量的IO操作,所以Compact操作就是以IO操作来换取后面读的性能。当storefile数量超过3时,会启动compaction过程将它们合并为⼀个storefile

2)Compaction 分类:

在完成 Compaction 后,HFile 文件数量减少,文件大小减小,能够显著提高读数据的效率。其中 (1)Compaction 方式又分为两种:

[1] MinorCompaction小合并

只对部分的StoreFile(HFile)做合并成一个StoreFile(HFile),对TTL(TimeToLive存活时间)过期数据设置过期清理,不会对文件内容进行清除操作工作。

[2] MajorCompaction大合并

是对所有StoreFile(HFile)合并为一个大文件,并且清除删除、过期、多余版本的数据在企业中,MajorCompaction 时间会持续比较长,整个过程会消耗大量系统资源,对上层业务有比较大的影响,一般也是配置了一个datacube.hregion.majorcompaction=0,这是配置major的合并周期(默认为7天),很多集群配置成一天,如果配置成0即关闭Major合并。

N.2.4 HBase数据恢复原理

0)HLog的整个生命历程可以使用下面一张图来表示

————————————————————————

————————————————————————

1)第一步 HLog滚动

HBase后台启动了一个线程会每隔一段时间(由参数’hbase.regionserver.logroll.period’决定,默认1小时)进行日志滚动,即新生成一个新的日志文件。可见,HLog日志文件并不是一个大文件,而是会产生很多小文件,最早的部分日志完全可以被删掉。而删除数据最好是一个文件整体删除,因此设计了日志滚动机制(滚动出多个日志),方便日志的整体删除。

2)Hlog回滚机制(数据恢复)

HMaster首先会处理遗留的 HLog文件,将其中不同HRegion的Log数据进行拆分,然后再将失效的HRegion重新分配,领取 到这些HRegion的HRegionServer在Load HRegion的过程中,会发现有历史HLog需要处理,重新将HLog中的数据加载到MemStore中,然后flush到StoreFiles,完成数据恢复

3)第二步 HLog失效

(1)上文提到,很多日志在之后会因为失效进而可以被删除,并且删除操作是以文件为单元执行的。那怎么判断一个日志文件里面的数据失效了呢?首先从原理上讲一旦数据从Memstore中落盘,对应的日志就可以被删除,因此一个文件所有数据失效,只需要看该文件中最大sequenceID对应的数据是否已经落盘就可以,HBase会在每次执行flush的时候纪录对应的最大的sequenceid(不同HRegion的sequenceid相互独立),如果前者小于后者,则可以认为该日志文件失效(前者小于后者是操作成功的标志,如果不成功,重新进行任务,直到前者小于后者,该日志失效。

(2)可以”类似”的认为sequenceID相当于文本的偏移量一样,文本最后的偏移量一定是最大的, 如果写完后把实际的偏移量与最大的比较下,若实际偏移量等于最大偏移量的说明写成功了。一旦判断失效就会将该文件从Write-Ahead logs文件夹移动到OldWrite-Ahead logs文件夹。

4)第三步 HLog删除

HMaster后台会启动一个线程每隔一段时间(由参数’hbase.master.cleaner.interval’,默认1分钟)会检查一次文件夹OldWALs下的所有失效日志文件,确认是否可以被删除,确认之后执行删除操作。

那问题来了,刚才不是已经确认可以被删除了吗?这里基于两点考虑, 到达两次失效失效,HLog会进行删除。

(1)对于使用HLog进行主从复制的业务来说,HLog失效确认并不完整,需要继续确认是否该HLog还在应用于主从复制;

(2)对于没有执行主从复制的业务来讲,HBase依然提供了一个过期的TTL(由参数’hbase.master.logcleaner.ttl’决定,默认10分钟),也就是说OldWALs里面的文件最多依然再保存10分钟。

N.3 HBase部署

0)前提环境

安装 Java、SSH 和 HadoopHDFS 以后。

如果hbase单机安装是可以不安装hadoop的,但是如果要分布式安装,就需要安装haoop.

1)HBase的解压

解压HBase到指定目录:

tar -zxvf /softWare/hbase-1.3.1-bin.tar.gz -C /softWare

配置环境变量

2) HBase的配置文件

(1)hbase-env.sh修改内容:

export JAVA_HOME=/softWare/jdk1.8.0_144

export HBASE_MANAGES_ZK=false

(2)hbase-site.xml修改内容:

hbase.rootdir

hdfs://bigData111:9000/hbase

hbase.cluster.distributed

true

hbase.master.port

16000

hbase.zookeeper.quorum

bigData111:2181,bigData1112:2181,bigData1113:2181

hbase.zookeeper.property.dataDir

/softWare/zookeeper-3.4.10/zkData

hbase.master.maxclockskew

180000

(3)conf/regionserver文件添加域名:

bigdata111

bigdata112

bigdata113

3)配置环境变量

vi /etc/profile

export HBASE_HOME=/softWare/hbase-1.3.1

export PATH=$HBASE_HOME/bin:$PATH

source /etc/profile

4) HBase远程scp到其他集群

scp -r /softWare/hbase-1.3.1/ bigdata112:/softWare/

scp -r /softWare/hbase-1.3.1/ bigdata113:/softWare/

5)HBase服务的启动

(1)启动方式1:

bin/hbase-daemon.sh start master

bin/hbase-daemon.sh start regionserver

尖叫提示:如果集群之间的节点时间不同步,会导致regionserver无法启动,抛出ClockOutOfSyncException异常。

(2)启动方式2:

start-hbase.sh

对应的停止服务:

stop-hbase.sh

6)查看Hbse页面

http://bigData111:16010查看能否进入hbase页面

http://bjigData111:50070查看是否生成目录hbase

7) Zookeeper中hbase的节点的存储信息(此步骤可略)

(1)rs:regionserver节点信息,命令 ls /hbase/rs

(2)table-lock:hbase的除meta以外的所有表,ls /hbase/table-lock

(3)Table:hbase的所有的表,ls /hbase/table

(4)注:HBase运行了一段时出现自动停止进程,情况如下:

[1] 时间没有同步(解决:将时间同步起来)

[2] zookeeper异常

(5)解决:删除zookeeper的HBase节点、删除hdfs的 /HBse的目录,

删除每个HBase的每一个log日志,重新启动

(6)特别注意,开启HBase进程,电脑最好不要待机,会导致自动关闭进程,一旦出现了一次,要么重新安装要么按方法二处理。