分享

Regions分裂问题

evababy 发表于 2017-5-18 10:21:22 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 5271
用sqoop往hbase导入数据
以前:
128M发现region太多,改成256M,每天增量sqoop也正常。

现在:重新加载数据
256M,发现region只有1个,数据倒是全过来了,sqoop的过程有map、reduce,发现map拉去数据,reduce写入数据(以前是不是这个情况不记得了)

hbase.hregion.max.filesize=256M
org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy

问题:分裂出来策略+大小,还有其他影响的参数么?

已有(6)人评论

跳转到指定楼层
nextuser 发表于 2017-5-18 13:23:40
应该就这两个,楼主可以测试下。超过256M
回复

使用道具 举报

evababy 发表于 2017-5-18 13:23:51
自己顶一下吧
回复

使用道具 举报

evababy 发表于 2017-5-18 13:45:33
问题解决了,
sqoop的批量处理参数--hbase-bulkload导致的
使用--hbase-bulkload,则批量导入方式,存在map、reduce,map拉数据,极快,reduce写入数据,此时不会触发split,所以怎么写也只有1个region。
不使用--hbase-bulkload,则只有map,拉数据的同时进行split,split会有短暂的暂停。
如果比较效率使用--hbase-bulkload效率要高得多,1个超大的region系统会自动进行split,目测一次split只能/2,
难道有更好的触发系统split命令?(是触发系统,并非指定split)
回复

使用道具 举报

evababy 发表于 2017-5-18 14:06:45
split 'tablename'

一次一次的手动分裂,虽然有点坑,但效率高就好吧。。。。。
回复

使用道具 举报

langke93 发表于 2017-5-18 17:11:57
evababy 发表于 2017-5-18 14:06
split 'tablename'

一次一次的手动分裂,虽然有点坑,但效率高就好吧。。。。。

看完整个,楼主的意思是想说hbase加载哪种方式效率更高??

回复

使用道具 举报

langke93 发表于 2017-5-18 17:31:21
evababy 发表于 2017-5-18 14:06
split 'tablename'

一次一次的手动分裂,虽然有点坑,但效率高就好吧。。。。。

分裂方式有三种:
1.提前分裂,也就是,在创建table的时候就配置好,生成多个region.
提前分裂也分为两种分别是 HexStringSplit 和 UniformSplit 。
如果我们的row key是十六进制的字符串作为前缀的,就比较适合用HexStringSplit,我们使用HexHash(prefix)作为row key的前缀,其中Hexhash为最终得到十六进制字符串的hash算法。我们也可以用我们自己的split算法。
在hbase shell 下:
[mw_shl_code=bash,true]hbase org.apache.hadoop.hbase.util.RegionSplitter pre_split_table HexStringSplit -c 10 -f f1[/mw_shl_code]

-c 10 的意思为,最终的region数目为10个;-f f1为创建一个那么为f1的 column family.
执行scan 'hbase:meta' 可以看到meta表中的10个region


除了提前分裂,还有自动分裂和强制分裂。楼主应该使用的是强制分裂。

其实自动分裂,应该像楼主的只有一个region,可能跟楼主的版本有点关系。
一个region如果是256,达到256M才分裂,这个确实不大好。

在0.94版本之前ConstantSizeRegionSplitPolicy 是默认和唯一的split策略。当某个store(对应一个column family)的大小大于配置值 ‘hbase.hregion.max.filesize’的时候region就会自动分裂。

而0.94版本中,IncreasingToUpperBoundRegionSplitPolicy 是默认的split策略。
这个策略中,最小的分裂大小和table的某个region server的region 个数有关,当store file的大小大于如下公式得出的值的时候就会split,公式如下

Min (R的立方^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”)  R为同一个table中在同一个region server中region的个数。
例如:
hbase.hregion.memstore.flush.size 默认值 128MB。
hbase.hregion.max.filesize默认值为10GB 。
如果初始时R=1,那么Min(1*1*1*2*128MB,10GB)=128MB,也就是说在第一个flush的时候就会触发分裂操作。
当R=2的时候Min(2*2*2*2*128MB,10GB)=2048MB ,当某个store file大小达到2048MB的时候,就会触发分裂。
如此类推,当R=4的时候,store file 达到10GB的时候就会分裂,也就是说当R>=4的时候,store file 达到10GB的时候就会分裂。


参考:aichengxu
##########################

所以像楼主的256才分裂,可能是因为版本的问题



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条