本文介绍了如何在HBase1.x中拆分区域,内容非常详细。感兴趣的朋友可以参考一下,希望对你有所帮助。
第一部分:区域分割的实现。
客户端将数据写入hbase。首先,它从zookeeper获取存储元数据的regionserver,查找相应的区域,在区域中查找列族,并首先将数据写入memstore。首先,它将被写入memstore(默认为128MB)(如果打开了WAL日志,它将首先被写入WAL日志)。随着数据写入的增加,会触发刷新操作,溢出到磁盘文件生成StoreFile。当存储文件堆积起来时,区域服务器会将它们压缩成更少更大的文件。每次刷新或压缩后,存储在该区域中的数据量会发生变化。区域服务器将根据配置的区域分割策略确定是否提交分割请求。
分割策略是在HBase-site.xml中配置的。HBase的默认分割策略是:递增上限区域分割策略:
property name hbase . regionserver . region . split . policy/namevaluorg . Apache . Hadoop . hbase . regionserver . additioning upper borboundgionsplitpolicy/value/property
地区的划分由地区服务器在当地决定,但会有许多参与者的协调。划分前后,Regionserver会通知HMaster更新的元数据表信息。mea并重新排列HDFS目录结构和数据文件。区域服务器将保留执行状态的日志,以便在出现错误时可以回滚任务。以下是海航官网区域划分实施流程图。来自区域服务器或主服务器的操作显示为红色,而来自客户端的操作显示为绿色,如图所示:
在RegionServer拆分的第一步中,RegionServer获取表的共享读锁,以防止在拆分过程中修改模式。然后在zookeeper下创建一个znode in/hbase/region-in-transition/region-name,并将z node的状态设置为SPLITTING。
师父开始了解znode是因为它有一个过渡区域观察者。
区域服务器创建一个子目录。在HDFS的父区域目录中拆分。
区域服务器关闭父区域,并在其本地数据结构中将该区域标记为脱机。分割区域现在脱机。此时,来自父区域的客户端请求将引发NotServingRegionException。客户端将重试一些备份。关闭的区域被刷新。
区域服务器为。拆分目录,并创建必要的数据结构。然后,它会拆分存储文件,因为它会为父区域中的每个存储文件创建两个参考文件。这些参考文件将指向父区域的文件。
区域服务器在HDFS创建实际的区域目录,并为每个子区域移动参考文件。
区域服务器向发送一个Put请求。META。表中设置父区域。META。表,并添加有关子区域的信息。这里,子区域在。META。不会有单独的条目。客户端在扫描时会看到父区域被分割。META。但是他们不会知道这些子区域,直到他们出现在。META。另外,如果放到。META。如果成功,父区域将被有效分割。如果区域服务器在此RPC成功之前失败,主服务器和下一个区域服务器将打开该区域,以清除关于区域分割的不干净状态。更新后。META。区域划分将由主机向前滚动。
RegionServer并行打开childreigon A和b。
RegionServer将子reigon A和b添加到。米(meter的缩写))
ETA.,连同它承载区域的信息。拆分reigon 现在处于在线状态。在此之后,客户端可以发现新的reigon 并向他们发出请求。客户端在本地缓存.META.条目,但是当他们向RegionServer或者.META.发出请求时,他们的缓存将失效,他们将从.META.中了解新的reigon 。
RegionServer更新ZooKeeper中的znode /hbase/region-in-transition/region-name以表示状态SPLIT,以便主服务器可以了解它。必要时,平衡器可以自由地将子reigon 重新分配给其他RegionServer。拆分事务现在已完成。
拆分之后,.META.和HDFS仍将包含对parent region的引用。在child region中进行压缩重写数据文件时,这些引用将被删除。主服务器中的垃圾收集任务会定期检查child region是否仍然引用parent region的文件。否则,parent region将被删除。
第二部分:Region拆分方式
主要有三种拆分方式:预拆分、自动拆分、手动强制拆分;
1.预拆分,
就是在新建表时进行region拆分,根据数据分布特点,提前预分区可减少rowkey热点问题,另一方面减少region分裂导致短时不可用。
两种方法预分区:
方法一:
hbase org.apache.hadoop.hbase.util.RegionSplitter table_spilt_test1 HexStringSplit -c 10 -f info1:info2:info3
表名:table_spilt_test1
拆分的region的数量:10
列族:info1,info2,info3
方法二:
指定每个预拆分的region的rowkey的开始值
create 'test_table', 'table_spilt_test1 ', SPLITS=> ['1001', '2001', '3001']
2.自动拆分:
Region默认大小为10G,超过10G就自动进行拆分,Region大小通过下面面这个参数控制,生产环境如果预分区后,每个Region数据都比较大可改成20G 30G:
<property> <name>hbase.hregion.max.filesize</name> <value>10737418240</value> </property>
3.手动强制拆分:
可在hbase shell根据提示,对某个region进行强制拆分
Examples: split 'tableName' split 'namespace:tableName' split 'regionName' # format: 'tableName,startKey,id' split 'tableName', 'splitKey' split 'regionName', 'splitKey
第三部分:Region拆分触发条件
HBase表的拆分由以下公式决定:
Min (X^2 * "hbase.hregion.memstore.flush.size", "hbase.hregion.max.filesize")
说明:
1).X是该region中所包含的该表的region的数量;
2).hbase.hregion.memstore.flush.size默认值是128M;
3).hbase.hregion.max.filesize 默认值是10GB
新建一张表并开始写入数据时,当达到128M开始第一次拆分,之后依次是512MB, 1152MB, 2GB, 3.2GB, 4.6GB, 6.2GB时候开始进行拆分,当达到hbase.hregion.max.filesize的设定值时便会永远在storefile 达到hbase.hregion.max.filesize进行拆分。
需要特别注意的是filessize指的是store下的storefile的大小并不是整个region的大小,一个region可能包含很多个store,确切的说是该表有多少个family就有多少个store,当某个family下的storefile达到以上标准是就会拆分整个region而不管改region下的其他的store下的storefile是否已经达到触发条件。
关于HBase1.x中Region的拆分是怎样的就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/93995.html