N.1 HBaes****介绍
N.1.1HBase简介
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
配置环境变量
- HBase的配置文件
(1)hbase-env.sh修改内容:
export JAVA_HOME=/softWare/jdk1.8.0_144
export HBASE_MANAGES_ZK=false
(2)hbase-site.xml修改内容:
<property>
<name>hbase.rootdir</name>
<value>hdfs://bigData111:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>bigData111:2181,bigData1112:2181,bigData1113:2181</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/softWare/zookeeper-3.4.10/zkData</value>
</property>
<property>
<name>hbase.master.maxclockskew</name>
<value>180000</value>
</property>(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
- 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
- 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进程,电脑最好不要待机,会导致自动关闭进程,一旦出现了一次,要么重新安装要么按方法二处理。
版权归原作者 研发咨询顾问Link348 所有, 如有侵权,请联系我们删除。