分享

hbase如何确定一条新数据写入到哪个regionserver?

kanwei163 发表于 2014-12-28 12:37:40 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 8 85584

如果只有一个regionserver,直接写入即可

如果有两个regionserver,如何根据rowkey确定写到哪个regionserver呢?

已有(8)人评论

跳转到指定楼层
kanwei163 发表于 2014-12-28 17:31:43
desehawk 发表于 2014-12-28 16:23
应该是这样的,如果put数据的话,肯定会有表名字的,,是根据表tableName的row所对应的HRegion引用:

...

非常感谢回复!!!

数据写入过程:
  • client先根据rowkey找到对应的region和regionserver
  • client想regionserver提交写请求
  • region找到目标region
  • region检查数据是否与scheam一致
  • 如果客户端没有指定版本,则获取当前系统时间作为数据版本
  • 将更新写入wal log
  • 将更新写入memstore
  • 判断memstore是否需要flush为store文件

个人理解:

put操作也是追加操作,需要提供存在或者不存在的rowkey,但是不管怎样,都是追加操作
根据rowkey,就能判断该记录是存放在某个table的的哪个region,因为meta文件中标明了该table每个region的start key。根据这个start key可以确定存放的region,然后往region对应的regionserver通信,写数据等等,当某个region达到一定的数量,split。

考虑极端情况(rowkey递增,且都是put操作
rowkey的put操作一直是递增的,那么开始的一个region的start key是1,第一个put直接放到这个region中,当到达一定数据后,一分为二,两个region的start key分别是1和100(假设100切分),那么后续的put操作就放到第二个region了,而第一个region不再有put操作,这样的现象便是热点。

如果我们将rowkey随机化,那么就不是递增put,所随机出的rowkey就有可能会小于第二个region的startkey并大于第一个region的startkey,这时候就与第一个region通信,以此类推。虽然rowkey随机化处理,不是将整个递增的rowkey数据均云分布到所有的region,但是可以保证大致的分布,至于后续的平衡等操作,可以后续处理。对于新上线的regionserver,可以将split的region托管给他,并指定startkey,对于随机高于此startkey的put数据,由该新增的regionserver处理。

不知道我理解的对不对?

回复

使用道具 举报

desehawk 发表于 2014-12-28 13:50:20
首先hbase不是一条条的写入数据,而是数据不断的积累,然后经过Compact和split,最后分裂一个Region,然后将Region分配到相应的HRegionServer 上。

引用如下:
Client写入 -> 存入MemStore,一直到MemStore满 -> Flush成一个StoreFile,直至增长到一定阈值 -> 出发Compact合并操作 -> 多个StoreFile合并成一个StoreFile,同时进行版本合并和数据删除 -> 当StoreFiles Compact后,逐步形成越来越大的StoreFile -> 单个StoreFile大小超过一定阈值后,触发Split操作,把当前Region Split成2个Region,Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer 上。






详细参考:
hbase写数据如何(指定、分配)Region到(相应)哪个 RegionServer

Hbase写数据,存数据,读数据的详细过程


回复

使用道具 举报

kanwei163 发表于 2014-12-28 15:18:21
desehawk 发表于 2014-12-28 13:50
首先hbase不是一条条的写入数据,而是数据不断的积累,然后经过Compact和split,最后分裂一个Region,然后 ...

首先hbase不是一条条的写入数据,而是数据不断的积累”,这里说了是累计一定程度后提交,最后导致region分裂,

我想知道,累计到一定后,提交到哪个region中,最后导致这个region分裂了?

regionserver托管region后,有很多个regionserver,我数据提交,总的先到一个region中,再导致新的region分裂出。

我看网上的文章,有的使用时间%regionserver个数并放到rowkey前,这样能够均匀的把数据分布到regionserver中

看了一些,还是没有对这部分,“如果确定数据提交的region地址”有些不清楚。 不好意思
回复

使用道具 举报

desehawk 发表于 2014-12-28 16:23:29

应该是这样的,如果put数据的话,肯定会有表名字的,,是根据表tableName的row所对应的HRegion
引用:

HRegion所在位置过程关键在private HRegionLocation locateRegion(final byte [] tableName,final byte [] row, boolean useCache)方法中,并且为递归方法,过程如下:

调用locateRegionInMeta方法到.META.表中查找tableName的row所对应的HRegion所在位置,先从本地缓存查找,如果没有,则进行下一步;
调用locateRegionInMeta方法到-ROOT-表中查找.META.所对应的HRegion所在位置,先从本地缓存查找,如果没有,则进行下一步
通过rootRegionTracker(即从zk上)获取RootRegionServer地址,即找到-ROOT-表所在的RegionServer地址,然后获取到.META.所在位置,最后在获取.META.表上所有HRegion,并将其加入到本地缓存。

详细参考:这篇帖子
HBase源码分析:HTable put过程分析






回复

使用道具 举报

muyannian 发表于 2014-12-28 23:05:55
kanwei163 发表于 2014-12-28 17:31
非常感谢回复!!!
数据写入过程:
  • client先根据rowkey找到对应的region和regionserver

  • 赞同你的说法。。。
    回复

    使用道具 举报

    tang 发表于 2015-6-9 20:21:07
    回复

    使用道具 举报

    Wyy_Ck 发表于 2017-1-17 09:54:24
    吹毛求疵一点,标题是不是应该是Hbase如何确定数据写入到哪一个region?
    client应该是regionserver rpc通信,然后给出region对应的地址,数据写入即可。

    不知道我理解的是不是对的?  谢谢啊
    回复

    使用道具 举报

    spftoto 发表于 2018-6-7 16:43:15
    不是很懂呀
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    推荐上一条 /2 下一条