HBase Split

HBase表的结构如下:

每个Table由若干个Region组成,每个Region由若干个Store组成(每个列组构成一个Store),每个由一个MemStore和若干个StoreFiles(HFiles)组成,每个StoreFile由若干个Blocks组成。

HBase对表进行split有三种方式:Pre-splitting,Auto splitting,Forced Splits。

Pre-splitting

如果一个节点有过多的读写操作,HBase可能会因为Zookeeper的连接超时而关掉该节点,所以一个良好的策略是将表预分割为固定数量的区域(region),并且这些区域均匀地分布在所有的服务器(regionserver)上,然后让HBase的自动分割功能来处理后面不断增加的数据。RegionSplitter提供三个用于预分割的工具:HexStringSplitSplitAlgorithmUniformSplit。其中HexStringSplit和UniformSplit是两个预定义的静态类,可以直接使用;而SplitAlgorithm是一个接口,需要开发人员自己实现相应的分隔策略。如果是以十六进制字符串作为行键rowkey或者行键rowkey的前缀是十六进制字符串,用HexStringSplit就比较合适;UniformSplit会把行键均匀地分割多个部分,如果行将rowkey是随机的字节数组,用UniformSplit就比较合适;或者开发者根据需要实现分割策略。

HBase shell命令示例:

hbase org.apache.hadoop.hbase.util.RegionSplitter test_table HexStringSplit -c 10 -f f1

其中HexStringSplit指明分割策略,-c 10指明要分割的区域数量,-f指明表中的列组,用“:”分割。

或者明确的指明分割点:

create ‘test_table‘, ‘f1‘, SPLITS =>  [‘a‘, ‘b‘, ‘c‘]

echo -e  "a\nb\nc"  >> /tmp/splits
create ‘test_table‘, ‘f1‘, SPLITSFILE => ‘/tmp/splits‘

Auto splitting

Region的分割操作对于Master不可见的,RegionServer拆分region的步骤是,先将该region下线,然后拆分,将其子region加入到META元信息中,再将他们加入到原本的RegionServer中,最后汇报给Master。 不管是否对表进行了pre-splitting,只要region的大小到达设定的阈值,Hbase都会自动将其split为两个大小相等的region。HBase有如下几种Auto splitting的方法:ConstantSizeRegionSplitPolicy

IncreasingToUpperBoundRegionSplitPolicyKeyPrefixRegionSplitPolicyDelimitedKeyPrefixRegionSplitPolicy。第一个是HBase0.94版本前默认的分割方法,只要region中任一个Store(即一个列族)的大小大于设置的阈值(hbase.hregion.max.filesize,默认大小是10G),HBase就会将该region分割为两个region。此分割方法适合已经做过pre-splitting且希望每个regionserver的region数量尽可能少的情况。第二个是HBase0.94及其以后版本的默认分割方法,此方法的分割阈值跟同一个regionserver上region的数量有关,Store的大小的最大值取决于公式:Min (R^2 * hbase.hregion.memstore.flush.size, hbase.hregion.max.filesize),其中R是同一个regionserver上同一个表的region的数量。这里以hbase.hregion.memstore.flush.size=128Mhbase.hregion.max.filesize=10G为例说明,初始时regionserver中只有一个region,那么分割大小为128M,随着region数量的增多分割大小也逐渐增大:512MB, 1152MB, 2GB, 3.2GB, 4.6GB, 6.2GB……。当有9个region时,分隔大小将会超过hbase.hregion.max.filesize,也就是10G将作为以后的分割大小。对于以上两个分割方法,不管什么时候对表进行分割,总是以最大Store的最大的StoreFile索引的中间作为分割点。对于第三个分割方法,我们可以设置rowkey的前缀长度prefix_split_key_policy.prefix_length,这样在对表进行分割的时候具有相同前缀的行总是被分割到相同的region。而第四个分割方法保证以分隔符前面的前缀为splitPoint,保证相同RowKey前缀的数据在一个Region中。

Forced Splits

HBase允许我们在HBase shell中对表或者一个region进行分割。示例如下:

split ‘b07d0034cbe72cb040ae9cf66300a10c‘, ‘b‘0 row(s) in 0.1620 seconds

具体操作细节

在hbase-site.xml中配置全局的分割策略

<property>
    <name>hbase.regionserver.region.split.policy</name>
    <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value>
</property>

利用Java API对表进行配置

HTableDescriptor tableDesc = new HTableDescriptor("test");
tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, ConstantSizeRegionSplitPolicy.class.getName());
tableDesc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf1")));
admin.createTable(tableDesc);

在Hbase shell中对表进行配置

hbase> create ‘test‘, {METHOD => ‘table_att‘, CONFIG => {‘SPLIT_POLICY‘ => ‘org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy‘}},{NAME => ‘cf1‘}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 01:55:15

HBase Split的相关文章

Hbase split的三种方式和split的过程

在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的.一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个regionServer中.在自动split策略中,当一个region达到一定的大小就会自动split成两个region.table在region中是按照row key来排序的,并且一个row key所对应的行只会存储在一个region中,这一点保证了Hbase的强一致性 . 在一个region中有

Hbase split的过程以及解发条件

一.Split触发条件   1.  有任一一个Hfile的大小超过默认值10G时,都会进行split    2.  达到这个值不在拆分,默认为int_max,不进行拆分       3.compaction时,如果compact的store的大小超过了,则进行split         4. flush之前会检测区域中HStoreFile数目是否超过hbase.hstore.blockingStoreFiles,如果超过且没有等待超时会调用CompactSplitThread.requestSp

hbase split 源码分析之split策略

在工作中接触到split,于是查看了这块的源代码,先看到了split的策略,今天就说说这个吧,后续还会有split的其他源码分析和compact相关的源码分析. 看了很多其他人的博客,很多都是转发的,原创的也都没有注明是哪个版本.其实给很多读者造成混淆,我这里是基于Hbase-0.98.13  版本作为分析的,注意:不同版本的此部分源码很可能不一样. 在这个版本中使用的split策略是IncreasingToUpperBoundRegionSplitPolicy.确切来说他是0.94版本以后的策

hive中udf读写hbase

在大数据开发过程中经常会遇到,将hive中处理后的结果写入hbase中,每次都要写java程序会非常浪费时间,我们就想了一个办法 ,用hive的udf来实现. 只需要调用同一个udf,将表名字段名以及每一个字段的值作为udf的参数,就可以实现写hbase了. 这样大大的节省了开发时间,提升了开发效率. 大家可以按照这种思路写自己需要的功能.这里只简单的列举几个供大家参考,具体操作如下: 一.依赖的jar包 commons-codec-1.7.jar commons-collections-3.2

HBase内部操作日志说明

版本:0.94-cdh4.2.1 1. Split Region [regionserver60020-splits-1397585864985] INFO org.apache.hadoop.hbase.regionserver.SplitRequest - Region split, META updated, and report to master. Parent=test_table,|u:21419463|1389789100286|9749216794103914,13917856

HBase的几种调优(GC策略,flush,compact,split)

HBase的几种调优(GC策略,flush,compact,split) 一:GC的调优 1.jvm的内存 新生代:存活时间较短,一般存储刚生成的一些对象 老年代:存活时间较长,主要存储在应用程序中生命周期较长的对象 永久代:一般存储meta和class的信息 2.GC策略 Parrallel New Collector,垃圾回收策略 并行标记回收器(Concurrent Mark-Sweep Collector) 3.Parrallel New Collector 速度快,但是数据量一大,容易

Hbase写入量大导致region过大无法split问题

最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题.让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态.这里描述一整个过程—— 事情的起因:业务方按照userid和商品id作为rowkey前缀,并没有进行hash散列.我当时咨询过业务方,认为:1.业务方式按照oracle的rowid顺序来进行迁移的,相对来说对应到rowkey里面就不会集中化:2.即使出现部分集中的情

hbase手动compact与split

#!/bin/bash die () {     echo >&2 "[email protected]"     echo "usage:"     echo "       $0 check|split table_name [split_size]"     exit 1 } [[ "$#" -lt 2 ]] && die "at least 2 arguments require

HBase如何选取split point

hbase region split操作的一些细节,具体split步骤很多文档都有说明,本文主要关注regionserver如何选取split point 首先推荐web ui查看hbase region分布的一个开源工具hannibal,建议用daemontool管理hannibal意外退出,自动重启,之前博文写了博文介绍如何使用daemontool管理 假设有一张hbase的table如下表所示,有一个region的大小比较大,可以对这个region进行手动split操作 HBase的物理存