⑴ hbase scan的startRow和endRow
举一个场数扮罩景,安全领域的溯源分析,查询维度包括ip,时间戳,端口,协议,可能根据前两的维度的一个或者几个进行原始日志查询,我们可以把原始日志存储到hbase中,而前面提到的几个维度可以分别作为key的一部分。
首先我们应该考虑的是rowkey的设置,第一:散列或者反转,保证数据会随机分布到不同的region当中。第二:预分区,先对数据做一个基本的统计,比如我们预分十个区,我们可以统计一下每个区的startrow和endrow,这样保证每个区的数据相当,另外这样的好处是当我们根据rowkey查询的时候,可以保证直接定位到某个分区。我们线上的数据就是采用薯闹的第二种方式。
然后我们应该考虑rowkey的组成。分两种情况,第一种情况:维度不是特别多,我们完全可以把各个维度分别作为rowkey的一部分,比如上文提到的需求,就是采用的这种方式,因为一共四个维度,相对来说比较少。第二种情况:维度过多,如果都作为rowkey的一部分的话长度太大,此时建议考虑二级索引,举个例子:比如对于上面提到的四个维度,如果现在进行扩展,ip,端口,协议需要定位到源和目的,这样的话,整个维度提升到了七个,此时就建议采用二级索引。
目前我们已经确定了hbase存储,并且采用预分区的方式并且采用rowkey进行过滤查询,那么现在考虑rowkey的设计。从技术角度考虑,预分区的方式时间戳不能作为第一部分,这样一定会出现数据倾斜的现象;从业务角度考虑,我们定位日志的时候,首先需要定位ip,然后是端口,最后才是协议,也就是说我们的用户去定位日志的时候,如果定位到端口,那必须先定位ip,如果定位协议的话,必须先定位ip和端口。
综上所述,我们的rowkey设计为ip+timestamp+port+prot
设计搞定之后,我们再考虑查询的问题。我们知缺此道对于hbase的查询,最快的方式就是get,这样的话,可以迅速定位到一条数据。而get查询其实就是scan的特殊情况,只是startRow和endRow一样。所以此时我们可以采用scan+startRow+endRow的方式进行操作。
e.g
这样的话就可以吧该范围的数据查出来,当然我们可以再在内存中进行过滤
当着startRow和endRow需要注意一些情况。
请参考:https://www.cnblogs.com/llphhl/p/5719119.html
⑵ HBase是什么呢,都有哪些特点呢
Hbase是一种NoSQL数据库,这意味着它不像传统的RDBMS数据库那样支持SQL作为查询语言。Hbase是一种分布式存储的数据库,技术上来讲,它更像是分布式存储而不是分布式数据库,它缺少很多RDBMS系统的特性,比如列类型,辅助索引,触发器,和高级查询语言等待
那Hbase有什么特性呢?如下:
强读写一致,但是不是“最终一致性”的数据存储,这使得它非常适合高速的计算聚合
自动分片,通过Region分散在集群中,当行数增长的时候,Region也会自动的切分和再分配
自动的故障转移
Hadoop/HDFS集成,和HDFS开箱即用,不用太麻烦的衔接
丰富的“简洁,高效”API,Thrift/REST API,Java API
块缓存,布隆过滤器,可以高效的列查询优化
操作管理,Hbase提供了内置的web界面来操作,还可以监控JMX指标
什么时候用Hbase?
Hbase不适合解决所有的问题:
首先数据库量要足够多,如果有十亿及百亿行数据,那么Hbase是一个很好的选项,如果只有几百万行甚至不到的数据量,RDBMS是一个很好的选择。因为数据量小的话,真正能工作的机器量少,剩余的机器都处于空闲的状态
其次,如果你不需要辅助索引,静态类型的列,事务等特性,一个已经用RDBMS的系统想要切换到Hbase,则需要重新设计系统。
最后,保证硬件资源足够,每个HDFS集群在少于5个节点的时候,都不能表现的很好。因为HDFS默认的复制数量是3,再加上一个NameNode。
Hbase在单机环境也能运行,但是请在开发环境的时候使用。
内部应用
存储业务数据:车辆GPS信息,司机点位信息,用户操作信息,设备访问信息。。。
存储日志数据:架构监控数据(登录日志,中间件访问日志,推送日志,短信邮件发送记录。。。),业务操作日志信息
存储业务附件:UDFS系统存储图像,视频,文档等附件信息
不过在公司使用的时候,一般不使用原生的Hbase API,使用原生的API会导致访问不可监控,影响系统稳定性,以致于版本升级的不可控。
HFile
HFile是Hbase在HDFS中存储数据的格式,它包含多层的索引,这样在Hbase检索数据的时候就不用完全的加载整个文件。索引的大小(keys的大小,数据量的大小)影响block的大小,在大数据集的情况下,block的大小设置为每个RegionServer 1GB也是常见的。
探讨数据库的数据存储方式,其实就是探讨数据如何在磁盘上进行有效的组织。因为我们通常以如何高效读取和消费数据为目的,而不是数据存储本身。
Hfile生成方式
起初,HFile中并没有任何Block,数据还存在于MemStore中。
Flush发生时,创建HFile Writer,第一个空的Data Block出现,初始化后的Data Block中为Header部分预留了空间,Header部分用来存放一个Data Block的元数据信息。
而后,位于MemStore中的KeyValues被一个个append到位于内存中的第一个Data Block中:
注:如果配置了Data Block Encoding,则会在Append KeyValue的时候进行同步编码,编码后的数据不再是单纯的KeyValue模式。Data Block Encoding是HBase为了降低KeyValue结构性膨胀而提供的内部编码机制。
⑶ hbase存在哪些问题
Hbase 近几年发展迅速,应用面越来越广,但是它存在的问题不容忽视。
原生HBase不支持索引专,而属NoSql数据库都把索引的支持作为基础功能来处理。查询方式单一,只支持基于主键的数据读写和范围查询,对非主键列的数据筛选只能通过过滤器的低效处理方式来完成,如果用户从客户端建立索引,则需要自己维护索引表,HBase也不支持跨行或跨表事务,操作冲突导致失败时数据回滚这些复杂逻辑都需要用户自己完成!
⑷ 銆怘Base銆慔Base 鑷鍔ㄦ媶鍒嗗拰棰勫垎鍖
[TOC]
HBase 涓锛岃〃浼氳鍒掑垎涓1...n 涓 Region锛岃鎵樼″湪 RegionServer 涓銆
Region 浜屼釜閲嶈佺殑灞炴э細StartKey 涓 EndKey 琛ㄧず杩欎釜 Region 缁存姢鐨 RowKey 鑼冨洿锛屽綋璇/鍐欐暟鎹鏃讹紝濡傛灉 RowKey 钀藉湪鏌愪釜 start-end key 鑼冨洿鍐咃紝閭d箞灏变細瀹氫綅鍒扮洰鏍噐egion骞朵笖璇/鍐欏埌鐩稿叧鐨勬暟鎹銆
榛樿わ紝HBase 鍦ㄥ垱寤鸿〃鐨勬椂鍊欙紝浼氳嚜鍔ㄤ负琛ㄥ垎閰嶄竴涓 Region锛屾e勪簬娣锋矊鏃舵湡锛宻tart-end key 鏃犺竟鐣岋紝鎵鏈 RowKey 閮藉線杩欎釜 Region閲屽垎閰嶃
褰撴暟鎹瓒婃潵瓒婂氾紝Region 鐨 size 瓒婃潵瓒婂ぇ鏃讹紝杈惧埌榛樿ょ殑闃堝兼椂锛堟牴鎹涓嶅悓鐨勬媶鍒嗙瓥鐣ユ湁涓嶅悓鐨勯槇鍊硷級锛孒Base 涓璇 Region 灏嗕細杩涜 split锛屼細鎵惧埌涓涓 MidKey 灏 Region 涓鍒嗕负浜岋紝鎴愪负 2 涓 Region銆傝 MidKey 鍒欎负杩欎簩涓 Region 鐨勪复鐣岋紝宸︿负 N 鏃犱笅鐣岋紝鍙充负 M 鏃犱笂鐣屻< MidKey 琚鍒嗛厤鍒 N 鍖猴紝> MidKey 鍒欎細琚鍒嗛厤鍒 M 鍖恒
闅忕潃鏁版嵁閲忚繘涓姝ユ墿澶э紝鍒嗚傜殑涓や釜 Region 杈惧埌涓寸晫鍚庡皢閲嶅嶅墠闈㈢殑杩囩▼锛屽垎瑁傚嚭鏇村氱殑 Region銆
Region 鐨勫垎鍓叉搷浣滄槸涓嶅彲瑙佺殑锛孧aster 涓嶄細鍙備笌鍏朵腑銆俁egionServer 鎷嗗垎 Region鐨勬ラゆ槸锛氬厛灏嗚 Region 涓嬬嚎锛岀劧鍚庢媶鍒嗭紝灏嗗叾瀛 Region 鍔犲叆鍒 META 鍏冧俊鎭涓锛屽啀灏嗕粬浠鍔犲叆鍒板師鏈鐨 RegionServer 涓锛屾渶鍚庢眹鎶 Master銆
鎵ц split 鐨勭嚎绋嬫槸 CompactSplitThread銆
鍦 2.0.5 鐗堟湰涓锛孒Base 鎻愪緵浜 7 绉嶈嚜鍔ㄦ媶鍒嗙瓥鐣ワ細
浠栦滑涔嬮棿鐨勭户鎵垮叧绯诲備笅锛
鏈変笁绉嶉厤缃鏂规硶锛
0.94.0 涔嬪墠鐨勯粯璁ゆ媶鍒嗙瓥鐣ワ紝杩欑嶇瓥鐣ラ潪甯哥畝鍗曪紝鍙瑕 Region 涓鐨勪换浣曚竴涓 StoreFile 鐨勫ぇ灏忚揪鍒颁簡 hbase.hregion.max.filesize 鎵瀹氫箟鐨勫ぇ灏 锛屽氨杩涜屾媶鍒嗐
1锛夌浉鍏冲弬鏁帮細
hbase.hregion.max.filesize
2锛夐儴鍒嗘簮鐮 锛
鎷嗗垎鐨勯槇鍊煎ぇ灏忓彲鍦ㄥ垱寤鸿〃鐨勬椂鍊欒剧疆锛屽傛灉娌℃湁璁剧疆锛屽氨鍙 hbase.hregion.max.filesize 杩欎釜閰嶇疆瀹氫箟鐨勫硷紝濡傛灉杩欎釜閰嶇疆涔熸病鏈夊畾涔夛紝鍙栭粯璁ゅ 10G銆
3锛夋媶鍒嗘晥鏋滐細
缁忚繃杩欑嶇瓥鐣ョ殑鎷嗗垎鍚庯紝Region 鐨勫ぇ灏忔槸鍧囧寑鐨勶紝渚嬪備竴涓 10G 鐨凴egion锛屾媶鍒嗕负涓や釜 Region 鍚庯紝杩欎袱涓鏂扮殑 Region 鐨勫ぇ灏忔槸鐩稿樊涓嶅ぇ鐨勶紝鐞嗘兂鐘舵佹槸姣忎釜閮芥槸5G銆
**ConstantSizeRegionSplitPolicy **鍒囧垎绛栫暐瀵逛簬澶ц〃鍜屽皬琛ㄦ病鏈夋槑鏄剧殑鍖哄垎锛岄槇鍊硷紙hbase.hregion.max.filesize锛夛細
4锛夊垱寤鸿〃鏃堕厤缃锛
璇ョ瓥鐣ョ户鎵胯嚜 ConstantSizeRegionSplitPolicy锛屾槸 0.94.0 鍒 2.0.0 鐗堟湰鐨勯粯璁ょ瓥鐣ワ紝鍏 浼樺寲浜嗗師鏉 ConstantSizeRegionSplitPolicy 鍙鏄鍗曚竴鎸夌収 Region 鏂囦欢澶у皬鐨勬媶鍒嗙瓥鐣ワ紝澧炲姞浜嗗瑰綋鍓嶈〃鐨勫垎鐗囨暟浣滀负鍒ゆ柇鍥犲瓙 銆傚綋Region涓鏌愪釜 Store Size 杈惧埌 sizeToCheck 闃鍊兼椂杩涜屾媶鍒嗭紝sizeToCheck 璁$畻濡備笅锛
濡傛灉琛ㄧ殑鍒嗙墖鏁颁负 0 鎴栬呭ぇ浜 100锛屽垯鍒囧垎澶у皬杩樻槸浠ヨ剧疆鐨勫崟涓 Region 鏂囦欢澶у皬涓烘爣鍑嗐傚傛灉鍒嗙墖鏁板湪 1~99 涔嬮棿锛屽垯鐢 min(鍗曚竴 Region 澶у皬锛 Region 澧炲姞绛栫暐鐨勫垵濮嬪寲澶у皬 * 褰撳墠 Table Region 鏁扮殑3娆℃柟) 鍐冲畾 銆
Region 澧炲姞绛栫暐鐨勫垵濮嬪寲澶у皬璁$畻濡備笅锛
1锛夌浉鍏冲弬鏁帮細
hbase.hregion.max.filesize
hbase.increasing.policy.initial.size
hbase.hregion.memstore.flush.size
2锛夐儴鍒嗘簮鐮侊細
鍦ㄩ粯璁ゆ儏鍐碉紝浣跨敤 绛栫暐鎷嗗垎 Region 鐨勮繃绋嬫槸:
3锛夋媶鍒嗘晥鏋滐細
鍜 ConstantSizeRegionSplitPolicy 涓鏍凤紝涔熸槸鍧囧寑鎷嗗垎銆
涓嶅悓鐨勬槸锛 鍒囧垎绛栫暐寮ヨˉ浜咰onstantSizeRegionSplitPolicy 鐨勭煭鏉匡紝鑳藉熻嚜閫傚簲澶ц〃鍜屽皬琛锛屽苟涓斿湪澶ч泦缇ゆ潯浠朵笅瀵逛簬寰堝氬ぇ琛ㄦ潵璇磋〃鐜板緢浼樼銆
浣嗗苟涓嶅畬缇庯紝杩欑嶇瓥鐣ヤ笅寰堝氬皬琛ㄤ細鍦ㄥぇ闆嗙兢涓浜х敓澶ч噺灏 Region锛屽垎鏁e湪鏁翠釜闆嗙兢涓銆傝屼笖鍦ㄥ彂鐢 Region 杩佺Щ鏃朵篃鍙鑳戒細瑙﹀彂 Region 鍒嗚傘
4锛夊垱寤鸿〃鏃堕厤缃锛
2.0 鐗堟湰榛樿ゅ垏鍒嗙瓥鐣ャ係teppingSplitPolicy 鏄疘 鐨勫瓙绫伙紝鍏跺 Region 鎷嗗垎鏂囦欢澶у皬鍋氫簡浼樺寲锛屽傛灉鍙鏈1涓 Region 鐨勬儏鍐典笅锛岄偅绗1娆$殑鎷嗗垎灏辨槸 256M锛屽悗缁鍒欐寜閰嶇疆鐨勬媶鍒嗘枃浠跺ぇ灏忥紙10G锛夊仛涓烘媶鍒嗘爣鍑嗐
1锛夌浉鍏冲弬鏁帮細
鍚 銆
2锛夊叏閮ㄦ簮鐮侊細
瀹冪殑婧愮爜鍙鏈変竴涓鏂规硶锛屼紭鍖栦簡 getSizeToCheck 鏂规硶锛屽叾浠栭兘鏄缁ф壙 鑷狪 绫汇
3锛夋媶鍒嗘晥鏋滐細
鍦 绛栫暐涓锛岄拡瀵瑰ぇ琛ㄧ殑鎷嗗垎琛ㄧ幇寰堜笉閿欙紝浣嗘槸閽堝瑰皬琛ㄤ細浜х敓杩囧氱殑 Region锛孲teppingSplitPolicy 鍒欏皢灏忚〃鐨 Region 鎺у埗鍦ㄤ竴涓鍚堢悊鐨勮寖鍥达紝瀵瑰ぇ琛ㄧ殑鎷嗗垎涔熶笉褰卞搷銆
4锛夊垱寤鸿〃鏃堕厤缃锛
KeyPrefixRegionSplitPolicy 鏄 鐨勫瓙绫伙紝璇ョ瓥鐣ラ櫎浜嗗叿澶囧叾鐖剁被鑷鍔ㄨ皟鏁 Region 鎷嗗垎闃堝煎ぇ灏忋侀傚簲澶у皬琛ㄧ殑鐗圭偣澶栵紝澧炲姞浜嗗规媶鍒嗙偣(splitPoint锛屾媶鍒嗙偣灏辨槸 Region 琚鎷嗗垎澶勭殑 RowKey)鐨勫畾涔夛紝鍙浠ヤ繚璇佹湁鐩稿悓鍓嶇紑鐨 RowKey涓嶄細琚鎷嗗垎鍒颁袱涓涓嶅悓鐨 Region 閲岄潰銆
1锛夌浉鍏冲弬鏁帮細
鍦 鐨勯厤缃涔嬩笂澧炲姞浜嗕竴涓鍙傛暟銆
KeyPrefixRegionSplitPolicy.prefix_length
2锛夐儴鍒嗘簮鐮侊細
鍏堜粠鐖剁被鑾峰彇鎷嗗垎鐐癸紝濡傛灉璁剧疆浜 prefixLength > 0锛屽氨浠庣埗绫绘媶鍒嗙偣涓鎴鍙栭渶瑕佺殑鍓嶇紑浣滀负鏂扮殑鎷嗗垎鐐硅繑鍥炪
3锛夋媶鍒嗘晥鏋滐細
KeyPrefixRegionSplitPolicy 锛圫teppingSplitPolicy銆丏銆丅usyRegionSplitPolicy (HBase-2.x Only)锛夋寜鐓 RowKey 鐨勫墠缂鍘绘媶鍒 Region锛屼絾鏄浠涔堟椂鍊欐媶鍒嗭紝鍘 Region 瀹归噺鐨勬渶澶у兼槸澶氬皯杩樻槸闇瑕佷娇鐢 鐨勬柟娉曞幓璁$畻 銆
濡傛灉鎵鏈夋暟鎹閮藉彧鏈変竴涓や釜鍓嶇紑锛岄偅涔堥噰鐢ㄩ粯璁ょ殑绛栫暐杈冨ソ銆 濡傛灉鍓嶇紑鍒掑垎鐨勬瘮杈冪粏锛屾煡璇㈠氨姣旇緝瀹规槗鍙戠敓璺 Region 鏌ヨ㈢殑鎯呭喌锛屾ゆ椂閲囩敤KeyPrefixRegionSplitPolicy 杈冨ソ銆
鎵浠ヨ繖涓绛栫暐閫傜敤鐨勫満鏅鏄锛
4锛夊垱寤鸿〃鏃堕厤缃锛
缁ф壙鑷 锛屼篃鏄鏍规嵁 RowKey 鍓嶇紑鏉ヨ繘琛屾媶鍒嗙殑銆備笉鍚屽氨鏄锛欿eyPrefixRegionSplitPolicy 鏄鏍规嵁 RowKey 鐨勫浐瀹氬墠鍑犱綅瀛楃︽潵杩涜屽垽鏂锛岃 D 鏄鏍规嵁鍒嗛殧绗︽潵鍒ゆ柇鐨勩
1锛夌浉鍏冲弬鏁帮細
鍦 鐨勯厤缃涔嬩笂澧炲姞浜嗕竴涓鍙傛暟銆
D.delimiter
2锛夐儴鍒嗘簮鐮侊細
鍏堟壘鍒板垎闅旂︿笅鏍囦綅缃锛岀劧鍚庝粠鐖剁被鐨勬媶鍒嗙偣鎴鍙栧嚭鏉ャ
3锛夋媶鍒嗘晥鏋滐細
D 鏍规嵁 RowKey 涓鎸囧畾鍒嗛殧瀛楃﹀仛涓烘媶鍒嗭紝鏄惧緱鏇村姞鐏垫椿锛屽 RowKey 鐨勫间负鈥渦serid_eventtype_eventid鈥濓紝userId 涓嶆槸瀹氶暱鐨勶紝鍒 D 鍙浠ュ彇 RowKey 鍊间腑浠庡乏寰鍙充笖绗涓涓鍒嗛殧瀛楃︿覆涔嬪墠鐨勫瓧绗﹀仛涓烘媶鍒嗕覆锛屽湪璇ョず渚嬩腑灏辨槸鈥渦serid鈥濄
4锛夊垱寤鸿〃鏃堕厤缃锛
涔嬪墠鐨勭瓥鐣ラ兘鏈鑰冭檻 Region 鐑鐐归棶棰橈紝鑰冭檻鏌愪簺 Region 鍙鑳借棰戠箒璁块棶锛岃礋鑽峰緢澶э紝BusyRegionSplitPolicy 绛栫暐鍚屾牱缁ф壙鑷 锛屼絾涓昏侀拡瀵 Region 闂棰橈紝鏄鍦 2.x 涓鏂板炲姞鐨勬媶鍒嗙瓥鐣ャ
1锛夌浉鍏冲弬鏁帮細
鍦 鐨勯厤缃涔嬩笂澧炲姞浜嗗備笅鍙傛暟锛
hbase.busy.policy.blockedRequests
hbase.busy.policy.minAge
hbase.busy.policy.aggWindow
2锛夐儴鍒嗘簮鐮侊細
鍦ㄥ垽鏂鏄鍚﹂渶瑕佽繘琛屾媶鍒嗙殑鏃跺欙紝鍏堣皟鐢ㄧ埗绫荤殑 shouldSplit 鏂规硶妫楠岋紝濡傛灉闇瑕佸垯鐩存帴杩斿洖 true锛屽惁鍒欓渶瑕佸垽鏂褰撳墠鏃堕棿鏄鍚︽瘮寮濮嬫椂闂村ぇ浜 minAge 鍊硷紝濡傛灉鏄鐨勶紝鍒欒$畻璇锋眰闃诲炵巼 blockedReqRate锛屽傛灉闃诲炵巼澶т簬璁惧畾鐨勯槇鍊硷紝鍒欒繘琛屾媶鍒嗐
闃诲炵巼鐨勮$畻濡備笅锛
涓昏佺殑璁$畻閫昏緫鏄锛氳锋眰鐨勮闃诲炵巼(aggBlockedRate) = curTime - prevTime 鏃堕棿鍐呮柊澧炵殑闃诲炶锋眰 / 杩欐垫椂闂寸殑鎬昏锋眰銆
3锛夋媶鍒嗘晥鏋滐細
濡傛灉绯荤粺甯稿父浼氬嚭鐜扮儹鐐 Region锛屽張瀵规ц兘鏈夊緢楂樼殑杩芥眰锛岄偅涔堣繖绉嶇瓥鐣ュ彲鑳戒細姣旇緝閫傚悎銆
瀹冧細閫氳繃鎷嗗垎鐑鐐 Region 鏉ョ紦瑙g儹鐐 Region 鐨勫帇鍔涳紝浣嗘槸鏍规嵁鐑鐐规潵鎷嗗垎Region 涔熶細甯︽潵寰堝氫笉纭瀹氭у洜绱狅紝鍥犱负涓嶈兘纭瀹氫笅涓涓琚鎷嗗垎鐨 Region 鏄鍝涓銆
4锛夊垱寤鸿〃鏃堕厤缃锛
DisabledRegionSplitPolicy 灏辨槸涓嶄娇鐢 Region 鎷嗗垎绛栫暐锛屽皢鎵鏈夌殑鏁版嵁閮藉啓鍒板悓涓涓 Region 涓銆
1锛夊叏閮ㄦ簮鐮侊細
婧愮爜寰堢畝鍗曪紝灏辨槸鐩存帴杩斿洖 false銆
2锛夋媶鍒嗘晥鏋滐細
杩欎釜绛栫暐鏋佸皯浣跨敤銆
鍗充娇鍦ㄥ缓琛ㄧ殑鏃跺欏悎鐞嗙殑杩涜屼簡棰勬媶鍒嗭紝杩樻病鏈夊啓鍏ョ殑鏁版嵁鐨勬椂鍊欏氨宸茬粡鎵嬪姩鍒嗗ソ浜 Region锛屼絾鏄闅忕潃鏁版嵁鐨勬寔缁鍐欏叆锛屾垜棰勫厛鍒嗗ソ鐨 Region 鐨勫ぇ灏忎篃浼氳揪鍒伴槇鍊硷紝閭f椂鍊欒繕鏄瑕佷緷闈 HBase 鐨勮嚜鍔ㄦ媶鍒嗙瓥鐣ュ幓鎷嗗垎 Region銆
浣嗚繖绉嶇瓥鐣ヤ篃鏈夊畠鐨勭敤閫旓細
鍋囧傛湁涓鎵归潤鎬佹暟鎹锛屼竴娆″瓨鍏ヤ互鍚庝笉浼氬啀鍔犲叆鏂版暟鎹锛屼笖杩欐壒鏁版嵁涓昏佹槸鐢ㄤ簬鏌ヨ锛屼负浜嗘ц兘濂戒竴浜涳紝鍙浠ュ厛杩涜岄勫垎鍖哄悗锛屽悇涓 Region 鏁版嵁閲忕浉宸涓嶅氾紝鐒跺悗璁剧疆鎷嗗垎绛栫暐涓虹佹㈡媶鍒嗭紝鏈鍚庡煎叆鏁版嵁鍗冲彲銆
3锛夊垱寤鸿〃鏃堕厤缃锛
宸茬粡鏈夎嚜鍔ㄥ垎鍖轰簡锛屼负浠涔堣繕闇瑕侀勫垎鍖猴紵
HBase 鍦ㄥ垱寤鸿〃鐨勬椂鍊欙紝浼氳嚜鍔ㄤ负琛ㄥ垎閰嶄竴涓猂egion锛屽綋涓涓 Region 杈惧埌鎷嗗垎鏉′欢鏃讹紙shouldSplit 涓 true锛夛紝HBase 涓璇 Region 灏嗕細杩涜 split锛屽垎瑁備负2涓 Region锛屼互姝ょ被鎺ㄣ傝〃鍦ㄨ繘琛 split 鐨勬椂鍊欙紝浼氳楄垂寰堝氱殑璧勬簮锛屾湁澶ч噺鐨 io 鎿嶄綔锛岄戠箒鐨勫垎鍖哄 HBase 鐨勬ц兘鏈夊緢澶х殑褰卞搷銆
鎵浠ワ紝HBase 鎻愪緵浜嗛勫垎鍖哄姛鑳斤紝璁╃敤鎴峰彲浠ュ湪鍒涘缓琛ㄧ殑鏃跺欏硅〃鎸夌収涓瀹氱殑瑙勫垯鍒嗗尯銆
鍋囪惧垵濮 10 涓 Region锛岄偅涔堝煎叆澶ч噺鏁版嵁鐨勬椂鍊欙紝灏变細鍧囪鍒 10 涓 Region 閲岄潰锛屾樉鐒舵瘮鍒濆 1 涓 Region 瑕佸ソ寰堝氾紝 鍚堢悊鐨勯勫垎鍖哄彲浠ュ噺灏 Region 鐑鐐归棶棰橈紝鎻愬崌鍐欐暟鎹鐨勬ц兘鍜岄熷害锛岃屼笖涔熻兘鍑忓皯鍚庣画鐨 split 鎿嶄綔 銆
棣栧厛瑕佹槑鐧芥暟鎹鐨 RowKey 鏄濡備綍鍒嗗竷鐨勶紝鐒跺悗鏍规嵁 RowKey 鐨勭壒鐐硅勫垝瑕佸垎鎴愬氬皯 Region锛屾瘡涓 Region 鐨 startKey 鍜 endKey 鏄澶氬皯锛屾帴鐫灏卞彲浠ラ勫垎鍖轰簡銆
姣斿傦紝RowKey 鐨勫墠鍑犱綅瀛楃︿覆閮芥槸浠 0001~0010 鐨勬暟瀛楋紝杩欐牱鍙浠ュ垎鎴10涓猂egion锛
绗涓琛屼负绗涓涓 Region 鐨 stopKey銆備负浠涔堝悗闈浼氳窡鐫涓涓"|"锛屾槸鍥犱负鍦ˋSCII鐮佷腑锛"|"鐨勫兼槸124锛屽ぇ浜庢墍鏈夌殑鏁板瓧鍜屽瓧姣嶇瓑绗﹀彿銆
shell涓寤哄垎鍖鸿〃
涔熷彲浠ラ氳繃鎸囧畾 SPLITS_FILE 鐨勫兼寚瀹氬垎鍖烘枃浠讹紝浠庢枃浠朵腑璇诲彇鍒嗗尯鍊硷紝鏂囦欢鏍煎紡濡備笂杩颁緥瀛愭墍绀猴細
棰勫垎鍖哄悗锛屽彲浠ヤ粠 HBase ui 椤甸潰瑙傚療鍒帮細
HBase API 寤洪勫垎鍖鸿〃
涓洪槻姝㈢儹鐐归棶棰橈紝鍚屾椂閬垮厤 Region Split 鍚庯紝閮ㄥ垎 Region 涓嶅啀鍐欐暟鎹鎴栬呭緢灏戝啓鏁版嵁銆備篃涓轰簡寰楀埌鏇村ソ鐨勫苟琛屾э紝甯屾湜鏈夊ソ鐨 load blance锛岃╂瘡涓鑺傜偣鎻愪緵鐨勮锋眰澶勭悊閮芥槸鍧囩瓑鐨勶紝骞朵笖 Region 涓嶈佺粡甯 split锛屽洜涓 split 浼氫娇 server 鏈変竴娈垫椂闂寸殑鍋滈】锛岄殢鏈烘暎鍒楀姞涓婇勫垎鍖烘槸姣旇緝濂界殑瑙e喅鏂瑰紡銆
棰勫垎鍖轰竴寮濮嬪氨棰勫缓濂戒簡涓閮ㄥ垎 Region锛岃繖浜 Region 閮界淮鎶ょ潃鑷宸茬殑 start-end keys锛屽啀閰嶅悎涓婇殢鏈烘暎鍒楋紝鍐欐暟鎹鑳藉潎绛夊湴鍛戒腑杩欎簺棰勫缓鐨 Region锛屽氨鑳介氳繃鑹濂界殑璐熻浇锛屾彁鍗囧苟琛岋紝澶уぇ鍦版彁楂樹簡鎬ц兘銆
hash + 棰勫垎鍖
鍦 RowKey 鐨勫墠闈㈡嫾鎺ラ氳繃 hash 鐢熸垚鐨勯殢鏈哄瓧绗︿覆锛屽彲浠ョ敓鎴愯寖鍥存瘮杈冮殢鏈虹殑 RowKey锛屽彲浠ユ瘮杈冨潎琛″垎鏁e埌涓嶅悓鐨 Region 涓锛岄偅涔堝氨鍙浠ヨВ鍐冲啓鐑鐐归棶棰樸
鍋囪 RowKey 鍘熸湰鏄鑷澧為暱鐨 long 鍨嬶紝鍙浠ュ皢 RowKey 鍏堣繘琛 hash锛屽姞涓婃湰韬 id 锛岀粍鎴恟owkey锛岃繖鏍峰氨鐢熸垚姣旇緝闅忔満鐨 RowKey 銆
閭d箞瀵逛簬杩欑嶆柟寮忕殑 RowKey 璁捐★紝濡備綍鍘昏繘琛岄勫垎鍖猴紵
partition + 棰勫垎鍖
partition 椤惧悕鎬濅箟灏辨槸鍒嗗尯寮忥紝杩欑嶅垎鍖烘湁鐐圭被浼间簬 maprece 涓鐨 partitioner锛屽皢鍖哄煙鐢ㄩ暱鏁存暟浣滀负鍒嗗尯鍙凤紝姣忎釜 Region 绠$悊鐫鐩稿簲鐨勫尯鍩熸暟鎹锛屽湪 RowKey 鐢熸垚鏃讹紝灏 id 鍙栨ā鍚庯紝鐒跺悗鎷间笂 id 鏁翠綋浣滀负 RowKey 銆
1. HBase Region 鑷鍔ㄦ媶鍒嗙瓥鐣
2. hbase棰勫垎鍖