技术简要介绍

在引入 RegionServer Group 技术之前,HBase 默认使用 StochasticLoadBalancer 策略(通过 hbase.master.loadbalancer.class 参数实现,参见HBASE-9555)将表的 Region 移动到 RegionServer 里面去。这种策略被没有考虑到 RegionServer Group 的信息,所以如果要对 RegionServer 分组,我们就需要在移动 Region 的时候考虑到这些信息。

基于这些信息,社区开发出能够识别出 RegionServer Group 信息的 RSGroupBasedLoadBalancer,这个类和上面的 StochasticLoadBalancer都是实现了 LoadBalancer 接口的,详见 HBASE-6721

在默认情况下,所有的表和 RegionServer 都属于 default 组。RSGroupBasedLoadBalancer 类具有识别组信息的能力,所以在移动表的 Region 到 RegionServer 的时候会考虑到 RegionServer Group 信息的。为了启用这个特性,我们需要在 master 节点的 hbase-site.xml 文件加入以下的配置:

<property>
   <name>hbase.coprocessor.master.classes</name>
   <value>org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint</value>
</property>

<property>
   <name>hbase.master.loadbalancer.class</name>
   <value>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer</value>
</property>

设置完之后需要重启 master 节点。

RegionServer Group 技术新引入的命令

RegionServer Group 技术为我们带来了以下13个新的 HBase shell 命令。使用下面的命令一定需要在 master 节点上的 hbase-site.xml 文件配置好上面两个属性。否则将会出现 UnknownProtocolException: No registered Master Coprocessor Endpoint found for RSGroupAdminService 异常。如下所示:

hbase(main):002:0> list_rsgroups
NAME                                            SERVER / TABLE

ERROR: org.apache.hadoop.hbase.exceptions.UnknownProtocolException: No registered Master Coprocessor Endpoint found for RSGroupAdminService. Has it been enabled?
	at org.apache.hadoop.hbase.master.MasterRpcServices.execMasterService(MasterRpcServices.java:802)
	at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
	at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:413)
	at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)
	at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)
	at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)

List all RegionServer groups. Optional regular expression parameter can
be used to filter the output.

Example:

  hbase> list_rsgroups
  hbase> list_rsgroups 'abc.*'


Took 1.1077 seconds
  • list_rsgroups:列出所有的 RegionServer groups,我们可以在这个命令的后面使用正则表达式来过滤一些我们要的信息。
    hbase> list_rsgroups
    hbase> list_rsgroups 'iteblog.*'
    
  • get_rsgroup:获取某个 RegionServer group 的信息。
    hbase> get_rsgroup 'default'
    
  • add_rsgroup:创建一个新的 RegionServer Group。
    hbase> add_rsgroup 'iteblog_group'
    
  • remove_rsgroup:删除某个 RegionServer Group。
    hbase> remove_rsgroup 'iteblog_group'
    
  • balance_rsgroup:对某个 RegionServer Group 进行 balance 操作。
    hbase> balance_rsgroup 'iteblog_group'
    
  • move_servers_rsgroup:将 RegionServers 从一个组移动到另一个组。 RegionServer 中的所有 Region 都将移动到另一个 RegionServer 中。
    hbase> move_servers_rsgroup 'dest',['server1:port','server2:port']
    
  • move_tables_rsgroup:将表从一个 RegionServer Group 移动另一个 RegionServer Group。
    hbase> move_tables_rsgroup 'dest',['table1','table2']
    
  • move_namespaces_rsgroup:将指定命名空间的表从一个 RegionServer Group 移动另一个 RegionServer Group。
    hbase> move_namespaces_rsgroup 'dest',['ns1','ns2']
    
  • move_servers_tables_rsgroup:将 RegionServers 和 Tables 从一个 RegionServer Group 移动另一个 RegionServer Group。
    hbase> move_servers_tables_rsgroup 'dest',['server1:port','server2:port'],['table1','table2']
    
  • move_servers_namespaces_rsgroup:将指定命名空间的 RegionServers 和 Tables 从一个 RegionServer Group 移动另一个 RegionServer Group。
    hbase> move_servers_namespaces_rsgroup 'dest',['server1:port','server2:port'],['ns1','ns2']
    
  • get_server_rsgroup:获取给定 RegionServer 所属的 RegionServer Group。
    hbase> get_server_rsgroup 'server1:port1'
    
  • get_table_rsgroup:获取给定表所属的 RegionServer Group。
    hbase> get_table_rsgroup 'iteblog_Table'
    
  • remove_servers_rsgroup:从 RegionServer Group 中删除已停用的 Region。 处于 Dead/recovering/live 状态的 Region 将无法操作。
    hbase> remove_servers_rsgroup ['server1:port','server2:port']
    
  • 如何使用 RegionServer Group

    我们前面说了,如果没有创建 RegionServer Group 的话,HBase 默认的组只有 default,而且所有的表和 RegionServer 都属于 default 组,如下:

    hbase(main):001:0> list_rsgroups
    NAME                                            SERVER / TABLE
     default                                        server 192.168.1.103:16020
                                                    server 192.168.1.103:16021
                                                    table hbase:meta
                                                    table hbase:namespace
                                                    table hbase:rsgroup
    2 row(s)
    Took 1.4986 seconds
    

    现在我们使用 add_rsgroup 命令创建了一个名为 iteblog_group 的组:

    hbase(main):020:0> add_rsgroup 'iteblog_group'
    Took 0.0444 seconds
    hbase(main):021:0> list_rsgroups
    NAME                                            SERVER / TABLE
     iteblog_group
     default                                        server 192.168.1.103:16020
                                                    server 192.168.1.103:16021
                                                    table hbase:meta
                                                    table hbase:namespace
                                                    table hbase:rsgroup
    2 row(s)
    Took 0.0101 seconds
    

    下面命令我们将 192.168.1.103:16021 RegionServer 移到了名为 iteblog_group 组里面:

    hbase(main):022:0> move_servers_rsgroup 'iteblog_group', ['192.168.1.103:16021']
    Took 1.0220 seconds
    hbase(main):023:0> list_rsgroups
    NAME                                            SERVER / TABLE
     iteblog_group                                  server 192.168.1.103:16021
     default                                        server 192.168.1.103:16020
                                                    table hbase:meta
                                                    table hbase:namespace
                                                    table hbase:rsgroup
    2 row(s)
    Took 0.0102 seconds
    

    我们已经看到了地址为 192.168.1.103:16021 的 RegionServer 已经移到名为 iteblog_group 的组了。现在我们来创建一张表 iteblog_table,并且把这张表移到名为 iteblog_group 的组里面。为了演示 RegionServer Group 的作用,这里我现在创建一张名为 iteblog_table 的表,并且设置了预分区,如下:

    hbase(main):011:0> create 'iteblog_table', 'cf', SPLITS=>['10','20','30','40']
    Created table iteblog_table
    Took 1.3884 seconds
    => Hbase::Table - iteblog_table
    hbase(main):013:0> get_table_rsgroup 'iteblog_table'
    default
    1 row(s)
    Took 0.0281 seconds
    

    从上面的输出可以看到,创建表的时候,默认是属于 default 组,虽然我们有两个 RegionServer,而且设置了预分区,按正常情况, iteblog_table 的 Region 应该是会分布在这两个 RegionServer 上的。但实际上因为这两个 RegionServer 的组不一样,而且 iteblog_table 的组属于 default,所有 iteblog_table 的 Region 全部位于 192.168.1.103:16020 上。正如下图所示:

    HBase RegionServer Group
    如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

    现在我们将表 iteblog_table 移到名为 iteblog_group 的组里面,那属于 iteblog_table 的 Region 也应该全部移到 iteblog_group 里面的:

    hbase(main):007:0> move_tables_rsgroup 'iteblog_group', ['iteblog_table']
    Took 5.6177 seconds
    
    hbase(main):008:0> get_table_rsgroup 'iteblog_table'
    iteblog_group
    1 row(s)
    Took 0.0202 seconds
    

    我们已经看到 iteblog_table 所属的组为 iteblog_group,从下图也可以看到,iteblog_table 的所有 Region 全部移到了 192.168.1.103:16021 上。

    HBase RegionServer Group
    如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

    我们还可以为命名空间设置 RegionServer 组,这样属于这个命名空间的表都属于这个 RegionServer 组:

    hbase(main):012:0> create_namespace 'iteblog_namespace', {'hbase.rsgroup.name'=>'iteblog_group'}
    Took 0.3406 seconds
    hbase(main):013:0> create 'iteblog_namespace:mytable', 'f'
    Created table iteblog_namespace:mytable
    Took 0.8126 seconds
    => Hbase::Table - iteblog_namespace:mytable
    hbase(main):014:0> get_table_rsgroup 'iteblog_namespace:mytable'
    iteblog_group
    1 row(s)
    Took 0.0080 seconds
    

    好了,到这里我们已经了解了 HBase RegionServer Group 技术,已经如何使用了。剩下的命令我就不再介绍,感兴趣的同学可以自己再去学习。

    本博客文章除特别声明,全部都是原创!
    原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
    本文链接: 【HBase 多租户隔离技术:RegionServer Group 介绍及实战】(https://www.iteblog.com/archives/2435.html)
    喜欢 (13)
    分享 (0)
    发表我的评论
    取消评论

    表情
    本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!
    (4)个小伙伴在吐槽
    1. 过往记忆大神, 请教个问题, 分组之后的balance怎么搞, 原来的balance命令好像不太好使了, 我用 balancer_enabled 看的自动balance状态明明是true, 但是我们的集群有个regionServer宕机之后重启, 过了一天也迟迟没有region分配过来, 这个regionServer是default分组里的, 是不是分组之后自动balance就失效了?

      独自修行的小沙弥2018-12-26 09:57 回复
    2. 你的 Balance 有没有设置成 org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer?

      w3970907702018-12-28 09:32 回复
    3. 设置了啊, 大神你文章中提到的两个参数都设置了, balance_rsgroup 和 balancer 命令都会报ArrayIndexOutOfBoundsException, 大神你有时间可以看看这个 http://hbase.group/question/316 里面有问题的详细描述, 我们集群是CDH5.12.1, hbase是1.2.0, 我现在怀疑是不是rsgroup和hbase1.2.0有啥兼容问题, 我们的master会周期性的五分钟报一次ArrayIndexOutOfBoundsException, ScheduledCore类报的, 再详细的信息没有打印, 不过我看hbase1.2.0的自动balance时间也正好是5分钟

      独自修行的小沙弥2018-12-28 09:57 回复
    4. rsgroup 是 HBase 2.0才有的。

      w3970907702018-12-29 17:46 回复