区域管理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 ompaction0,这是配置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项目组魁魁语录:秋水共长天一色落霞与孤鹜齐飞江湖一哥版权所有 | |
|