配色: 字号:
04-HBase_区域管理
2022-09-15 | 阅:  转:  |  分享 
  
区域管理2018-05-04版本修改人修改记录修改时间V1.0王守奎编写2018/5/4目录区域管理3关闭区域3移动region到指定reg
ionserver5compact6assign上线11unassign下线12切割region12合并region13Balan
cer13Java-API区域管理14Compact15查看集群状态15压缩16预分区域16关闭写前日志17Cell信息18区域管
理表可以分成多个区域,区域包含列族,列族包含文件/hbase/data/namespace/table/regionname/co
lumnfamily/文件(文件,就是Store,就是HFile)。就像下面的内容:关闭区域功能语法如下:Closeasi
ngleregion.Askthemastertoclosearegionoutonthecluster
orif''SERVER_NAME''issupplied(提供),askthedesignatedhosting
regionservertoclosetheregiondirectly.Closingaregion,the
masterexpects''REGIONNAME''tobeafullyqualifiedregionname.
Whenaskingthehostingregionservertodirectlyclosearegion
,youpasstheregions''encodednameonly.Aregionnamelookslik
ethis:hbase>close_region''REGIONNAME''hbase>close_region''REG
IONNAME'',''SERVER_NAME''hbase>close_region''ENCODED_REGIONNAME''
hbase>close_region''ENCODED_REGIONNAME'',''SERVER_NAME''关闭指定区域,在hb
ase界面【端口16030】找,关闭后不能查询通过界面可以看到t1表的两个区域(region)2、也可以通过scan''hbase
:meta''命令看到t1表的两个区域3、关闭其中一个区域$hbase>close_region''ns1:t1,,1542163
956428.0b4e873f0ee795db462b1bdf8cc30a71.''4、测试$hbase>scan''ns1:t1''
//查表会报错$hbase>get''ns1:t1'',''row1775''//关闭的region中的记录不能get会报错通过界
面查找,在Master中显示一共两个regions,在RegionServers中只能看到在线的一个。移动region到指定r
egionserver大量region到一个regionServer上运行可能造成不均衡,所以需要移动。注:移动会打开关闭的reg
ion,但是移动不需要关闭region,可以直接移动查看表分区信息建议是在webUI查询,数据量大的时候不好查询。$hbase>s
can''hbase:meta''移动分区$hbase>move''0b4e873f0ee795db462b1bdf8cc30a7
1'',''datanode2,16020,1542163342093''注:0b4e873f0ee795db462b1bdf8cc3
0a71是ENCODED的对应值,regionName后面的编码1542163342093''是serverstartcode对应的
value或master的RegionServers列表ENCODED的值实际对应HDFS中的region文件名称语法解释Mov
earegion.Optionallyspecifytargetregionserverelsewechoos
eoneatrandom.NOTE:Youpasstheencodedregionname,notthe
regionnamesothiscommandisalittledifferenttotheothers.
Theencodedregionnameisthehashsuffixonregionnames:e.g.i
ftheregionnamewereTestTable,0094429456,1289497600452.527db22f
95c8a9e0116f0cc13c680396.thentheencodedregionnameportionis
527db22f95c8a9e0116f0cc13c680396Aservernameisitshost,portp
lusstartcode.Forexample:host187.example.com,60020,128949312175
8Examples:hbase>move''ENCODED_REGIONNAME''hbase>move''ENCODED_
REGIONNAME'',''SERVER_NAME''验证结果$hbase>scan''hbase:meta''查看元表,发现该re
gion移动到了datanode2下面,也可以通过ui验证。compactCompact作用当MemStore超过阀值的时候,就要
flush到HDFS上生成一个HFile。因此随着不断写入,HFile的数量将会越来越多,HFile数量过多会降低读性能。为了避免
对读性能的影响,可以对这些HFile进行compact操作,把多个HFile合并成一个HFile。compact操作需要对HBas
e的数据进行多次的重新读写,因此这个过程会产生大量的IO。可以看到compact操作的本质就是以IO操作换取后续的读性能的提高。C
ompact两种方式区别1、Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,
不做任何删除数据、多版本数据的清理工作。2、Major操作是对Region下的HStore下的所有StoreFile执行合并操作,
最终的结果是整理合并出一个文件。一般情况下都是做Minor合并,Major不少集群都是禁止,然后再集群负载较小时,进行手动Majo
r合并,既然Major合并是把所有HFile都合并成一个文件,可想对集群负载不可小觑。minor则只会选择数个HFile文件com
pact为一个HFile,minor的过程一般较快,而且IO相对较低。在日常任务时间,都会禁止mjaor操作,只在空闲的时段定时执
行。触发时机HBase中可以触发compaction的因素有很多,最常见的因素有这么三种:MemstoreFlush、后台线程
周期性检查、手动触发。1.MemstoreFlush:应该说compaction操作的源头就来自flush操作,mems
toreflush会产生HFile文件,文件越来越多就需要compact。因此在每次执行完Flush操作之后,都会对当前Stor
e中的文件数进行判断,一旦文件数#>,就会触发compaction。需要说明的是,compaction都是以Store为单位进
行的,而在Flush触发条件下,整个Region的所有Store都会执行compact,所以会在短时间内执行多次compactio
n。2.后台线程周期性检查:后台线程CompactionChecker定期触发检查是否需要执行compaction,检查周期为
:hbase.server.thread.wakefrequencyhbase.server.compactchecker.in
terval.multiplier。和flush不同的是,该线程优先检查文件数#是否大于,一旦大于就会触发compaction。如
果不满足,它会接着检查是否满足majorcompaction条件,简单来说,如果当前store中hfile的最早更新时间早于某个
值mcTime,就会触发majorcompaction,HBase预想通过这种机制定期删除过期数据。上文mcTime是一个浮动值
,浮动区间默认为[7-70.2,7+70.2],其中7为hbase.hregion.majorcompaction,0.2为h
base.hregion.majorcompaction.jitter,可见默认在7天左右就会执行一次majorcompacti
on。用户如果想禁用majorcompaction,只需要将参数hbase.hregion.majorcompaction设为0
3.手动触发:一般来讲,手动触发compaction通常是为了执行majorcompaction,原因有三,其一是因为很多业务
担心自动majorcompaction影响读写性能,因此会选择低峰期手动触发;其二也有可能是用户在执行完alter操作之后希望立
刻生效,执行手动触发majorcompaction;其三是HBase管理员发现硬盘容量不够的情况下手动触发majorcompa
ction删除大量过期数据;无论哪种触发动机,一旦手动触发,HBase会不做很多自动化检查,直接执行合并。可以请求compact的
地方有很多,包括在openregion、MemStoreflush等都会判断是否需要进行compact操作(单个HStore的M
emStoreflush之后,如果触发compact操作,则会对所属HRegion下的所有HStore分别进行compact)。
除此之外,HRegionServer.CompactionChecker负责定期101000s针对所有HRegion的HSt
ore检测是否需要进行compact操作。查看源码也可看到,有个函数:PublicbooleanneedsCompacti
on(finalCollectionstoreFiles,?finalList
filesCompacting){?intnumCandidates=storeFiles.size()-files
Compacting.size();?returnnumCandidates>=comConf.getMinFilesTo
Compact();}minFilesToCompact由hbase.hstore.compaction.min(老版本是:hb
ase.hstore.compactionThreshold)控制,默认值为3,即store下面的storeFiles数量减去
正在compaction的数量>=3是,需要做compaction。如果这个值为true,则进行minor合并。如果为fals
e,则再进一步判断是否需要执行majorcompact。主要是查看一下是否太久没有执行compact操作。具体判断过程:1)获
得compact时间间隔。hbase.hregion.majorcompaction(默认7天)为base基准时间,hbase.h
region.majorcompaction.jitter(默认5.0)为jitter,公式base+jitter-Math
.round(2jitterrandomNum)计算出一个会每次自动抖动的数值作为majorcompact的时间间隔
。之所以要一个自动抖动,就是避免在HRegionServer重启的时候大量的majorcompact出现造成大量的IO。2)所
有HFile最老(时间戳最小)的那个HFile的时间间隔大于这个majorcompact的时间间隔,则执行majorcompac
t。另外如果HRegion只有一个HFile,并且这个HFile的所有KeyValue的时间戳都没有超过TTL,则表示无须进行ma
jorcompact,会跳过这次majorcompact。当1或2成立都会分别对CompactSplitThread发送com
pact请求,不同的是,1会异步选择需要进行compact的HFile,2则会进行同步选择。majorcompaction触发m
ajorcompaction的可能条件有:major_compact命令、majorCompact()API、region
server自动运行(相关参数:hbase.hregion.majorcompaction默认为7天、hbase.hregion
.majorcompaction.jitter默认值为0.50防止regionserver在同一时间进行majorcom
paction)。hbase.hregion.majorcompaction.jitter参数的作用是:对参数hbase.hreg
ion.majoucompaction规定的值起到浮动的作用。配置一个datacube.hregion.majorc
ompaction
0,这是配置major的合并周期(默认为7天),很多集群配置成一天,
如果配置成0即关闭Major合并。手动触发majorcompaction#语法:#Compactallregionsin
atable:#hbase>major_compact''t1''#Compactanentireregion:#hbas
e>major_compact''r1''#Compactasinglecolumnfamilywithinareg
ion:#hbase>major_compact''r1'',''c1''#Compactasinglecolumnfami
lywithinatable:#hbase>major_compact''t1'',''c1''Minorcompactio
n当确定为需要MinorCompact时,便开始Region合并过程。(1)选出待执行Compact的storefiles。由于在
Store中的文件可能已经在进行Compacting,因此,这里取出未执行Compacting的文件,将其加入到Candidate
s中。(2)执行compactSelection算法,在Candidates中选出需要进行compact的文件,并封装成Compa
ctSelection对象当中(这里面还是很复杂的)。这一步主要是过滤掉过期的hfiles。过滤minVersion=0,并且s
torefile.maxTimeStamp+store.ttlv,都已经过期了,从而证明整个storefile都已经过期了。CompactSelection如果发现这样的storefile,会
优先选择出来,作为Min然后提交给Store进行处理。(3)判断fileToCompact队列中的文件是否超过了maxCompac
tSize,如果超过,则过滤掉该文件,避免对于大文件进行compaction。(这一步可以忽略,因为默认maxCompactSiz
e为Long.MaxValue,很少有文件大于这个值。(4)如果确定MinorCompaction方式执行,会检查经过过滤过的f
ileToCompact的大小是否满足minFilesToCompact最低标准(默认为3,即超过3个hfile文件则启动合并),
如果不满足,忽略本次操作。确定执行的MinorCompaction的操作时,会使用一个smart算法,从filesToCompa
ct当中选出匹配的storefiles。下面就是重点介绍下smart算法了:其实很简单,就是几个参数的问题。(具体参考:http
://blog.csdn.net/liyanyun/article/details/20134417http://blog.csd
n.net/liyanyun/article/details/20134417)hbase会将队列中的storefile按照文
件年龄排序(oldertoyounger),minorcompaction总是从olderstorefile开始选择。(
1)如果该文件小于hbase.hstore.compaction.min.size(为memestoreFlushSize)则一定
会被添加到合并队列中。(2)如果该文件大于hbase.hstore.compaction.max.size(Long.MAX_VA
LUE)则一定会被排除,这个值很大,一般不会有。(3)如果该文件的size小于它后面hbase.hstore.compactio
n.max(默认为10)个storefilesize之和乘以一个ratio(配置项是hbase.hstore.compac
tion.ratio,默认为1.2),则该storefile也将加入到minorcompaction中。当然,如果他后面不足
10个文件,那么也就是取他后面几个文件总和ratio了。如此,最终选择下来的文件就将进入Minor合并。assign上线Ass
ignaregion.Usewithcaution(谨慎).Ifregionalreadyassigned,t
hiscommandwilldoaforcereassign.Forexpertsonly.Examples:
hbase>assign''REGIONNAME''hbase>assign''ENCODED_REGIONNAME''等价于m
ove操作,随机选择服务器进行移动可以通过scan''hbase:meta''或者界面查看Assign之后regions信息如下:u
nassign下线Unassignaregion.Unassignwillcloseregionincurrent
locationandthenreopenitagain.Pass''true''toforcetheunas
signment(''force''willclearallin-memorystateinmasterbefore
thereassign.Ifresultsindoubleassignmentusehbck-fixtores
olve.Tobeusedbyexperts).Usewithcaution.Forexpertuseon
ly.Examples:hbase>unassign''REGIONNAME''hbase>unassign''REGI
ONNAME'',truehbase>unassign''ENCODED_REGIONNAME''hbase>unassig
n''ENCODED_REGIONNAME'',true逆assign,功能类似于assign,随机选择服务器进行移动,可能返回现
有的regionserver切割region语法:split''regionName'',''splitKey''按照指定行进行表的切
割$>hbase>scan''hbase:meta''$>hbase>split''ns1:t1'',''row187''//从row1
87行进行分割$>hbase>scan''hbase:meta''//如下图,分成了两个分区,也就是两个region合并reg
ion合并被split的区域语法如下:[encoded_regionname指ENCODED,name也可以]$>hbase>me
rge_region''encoded_regionname'',''encoded_regionname''[true暴力合并]$>
hbase>merge_region''encoded_regionname'',''encoded_regionname'',true
[实例,根据实际情况进行修改,注意最后的那个点]$>hbase>merge_region''ns1:t1,,1541826013
751.f5677c55ef9d04e2fbb85ab6dcab9286.'',''ns1:t1,row187,15418260137
51.ccf5e5f1ce57c7c8347d369a7c5cfe9a.''$>hbase>scan''hbase:meta''/
/如下图,不同的分区又合并在一起Balancer对regionserver集群的再平衡,将Region数量在集群中二次平衡。hba
se(main):059:0>help''balance_switch''//是否启用二次平衡开关Enable/Disable
balancer.Returnspreviousbalancerstate.Examples:hbase>balanc
e_switchtruehbase>balance_switchfalsehbase(main):060:0>help
''balancer''//执行二次平衡Triggertheclusterbalancer.Returnstrueif
balancerranandwasabletotelltheregionserverstounassigna
lltheregionstobalance(there-assignmentitselfisasync).O
therwisefalse(Willnotrunifregionsintransition).效果如下:原始reg
ions分布二次平衡后regions分布Java-API区域管理packagecom.bm.hbase;importjava.
io.IOException;importorg.apache.hadoop.conf.Configuration;import
org.apache.hadoop.hbase.ClusterStatus;importorg.apache.hadoop.h
base.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDes
criptor;importorg.apache.hadoop.hbase.HTableDescriptor;importor
g.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.cl
ient.Admin;importorg.apache.hadoop.hbase.client.Connection;impor
torg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apa
che.hadoop.hbase.io.compress.Compression.Algorithm;importorg.apa
che.hadoop.hbase.util.Bytes;importorg.junit.Before;importorg.ju
nit.Test;publicclassTestAdmin{privateConnectionconn;private
Adminadmin;@BeforepublicvoidiniConn()throwsIOException{Conf
igurationconf=HBaseConfiguration.create();conn=ConnectionFac
tory.createConnection(conf);admin=conn.getAdmin();}Compact@Test
//对表做compact操作publicvoidcompact()throwsIOException,Interrupt
edException{//minorcompactadmin.compact(TableName.valueOf("ns1:
t1"));admin.compact(TableName.valueOf("ns1:t1"),Bytes.toBytes("c
f1"));admin.compactRegion(Bytes.toBytes("ns1:t1,,1542163956428.0b
4e873f0ee795db462b1bdf8cc30a71."));admin.compactRegion(Bytes.toBy
tes("ns1:t1,,1542163956428.0b4e873f0ee795db462b1bdf8cc30a71."),B
ytes.toBytes("cf1"));//第二个参数指定是否为majarcompactadmin.compactRegion
Server(ServerName.valueOf("datanode3,16020,1542184626272"),true)
;}查看集群状态@Testpublicvoidstatus()throwsIOException{ClusterStat
usstatus=admin.getClusterStatus();status.getRegionsCount();}源码
助攻理解publicintgetRegionsCount(){intcount=0;if(liveServers
!=null&&!liveServers.isEmpty()){for(Map.EntryServerLoad>e:this.liveServers.entrySet()){count+=e.getValue
().getNumberOfRegions();}}returncount;}压缩Hbase建议压缩格式为snappy
或lzo,一般比较建议为snappy,以下为snappy的操作步骤,lzo为同样的操作步骤。首先需要在hadoop集群里安装sn
appy成功,需要本地依赖库的支持。具体的安装步骤参考hadoop压缩篇。安装完成可以通过如下的语句进行测试hbaseor
g.apache.hadoop.hbase.util.CompressionTesthdfs://namenode/data/h
ello.txtsnappy结果最后展示SUCCESS表示安装成功。@TestpublicvoidcreateTable
()throwsIOException{HTableDescriptordesc=newHTableDescript
or(TableName.valueOf("ns1:t9"));HColumnDescriptorf=newHColumn
Descriptor("cf1");//hbase支持压缩类型f.setCompressionType(Algorithm.SNA
PPY);desc.addFamily(f);admin.createTable(desc);}直接创建的语句:create''n
s1:t3'',{NAME=>''c'',COMPRESSION=>''SNAPPY''}预分区域@Test//建表的同时按
照给定的行键进行split分区操作publicvoidpreSplit()throwsIOException{Admin
admin=conn.getAdmin();HTableDescriptort=newHTableDescripto
r(TableName.valueOf("ns1:t8"));HColumnDescriptorf=newHColumnD
escriptor("cf1");t.addFamily(f);/Createsanewtablewiththe
specifiednumberofregions.Thestartkeyspecifiedwillbec
ometheendkeyofthefirstregionofthetableandtheendke
yspecifiedwillbecomethestartkeyofthelastregionofthet
able(thefirstregionhasanullstartkeyandthelastregio
nhasanullendkey).BigIntegermathwillbeusedtodivide
thekeyrangespecifiedintoenoughsegmentstomaketherequ
irednumberoftotalregions.Parameters:desctabledes
criptorfortablestartKeybeginningofkeyrangeendKeyend
ofkeyrangenumRegionsthetotalnumberofregionstocreate
/admin.createTable(t,Bytes.toBytes("row200"),Bytes.toBytes("row
800"),4);}关闭写前日志@Testpublicvoidput()throwsIOException{Table
t=conn.getTable(TableName.valueOf("ns1:t2"));Putput=newPut
(Bytes.toBytes("row1"));put.addColumn(Bytes.toBytes("cf1"),Bytes
.toBytes("no"),Bytes.toBytes("no001"));put.addColumn(Bytes.toByt
es("cf1"),Bytes.toBytes("name"),147111111L,Bytes.toBytes("tom")
);put.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("age"),Bytes
.toBytes(12));//如果业务场景对数据稳定性要求不高,可以关闭WAL时发生服务故障数据无法恢复put.setDurab
ility(Durability.SKIP_WAL);t.put(put);System.out.println("--skip
WAL---");}Cell信息通过JavaAPI获取cell中的信息。示例代码如下:@TestpublicvoidgetCellInfo()throwsIOException{Tabletable=conn.getTable(TableName.valueOf("ns1:t1"));Getget=newGet(Bytes.toBytes("row199"));get.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("name"));get.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("age"));get.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes("no"));get.setMaxVersions(4);Resultrs=table.get(get);Listcells=rs.listCells();for(Cellcell:cells){Stringrowkey=Bytes.toString(CellUtil.cloneRow(cell));Stringfamily=Bytes.toString(CellUtil.cloneFamily(cell));Stringcol=Bytes.toString(CellUtil.cloneQualifier(cell));longts=cell.getTimestamp();Stringvalue=null;if(StringUtils.equals(col,"name")){value=Bytes.toString(CellUtil.cloneValue(cell));}else{value=Bytes.toInt(CellUtil.cloneValue(cell))+"";}System.out.println(rowkey+"-"+family+":"+col+"-"+ts+"="+value);}}4A项目组4A项目组魁魁语录:秋水共长天一色落霞与孤鹜齐飞江湖一哥版权所有
献花(0)
+1
(本文系王守奎的图...原创)