开发者社区> 问答> 正文

hbase中balance的status一会儿为true,一会儿为false

各位大神,我在hbase集群上执行了“balance_switch true”
随后执行“balance_switch status”的时候,结果一会儿为true,一会儿为false。
请问这个是什么原因?

展开
收起
hbase小能手 2018-11-08 11:01:22 3026 0
2 条回答
写回答
取消 提交回答
  • balance_switch status 是将balance状态强制转换为false, 无论之前是true还是false, 返回的是之前的状态。 查看balance_switch 状态的命令是使用balancer_enabled

    2020-10-30 14:34:20
    赞同 展开评论 打赏
  • HBase是一个分布式的、面向列的开源数据库,一个结构化数据的分布式存储系统。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。阿里云HBase技术团队共同探讨HBase及其生态的问题。

    首先看balance_switch命令对应的rb文件源码:
    module Shell
    module Commands

    class BalanceSwitch < Command
    def help

    <<-EOF
    

    Enable/Disable balancer. Returns previous balancer state.
    Examples:

    hbase> balance_switch true
    hbase> balance_switch false
    EOF

    end

    def command(enableDisable)

    prev_state = admin.balance_switch(enableDisable) ? 'true' : 'false'
    formatter.row(["Previous balancer state : #{prev_state}"])
    prev_state

    end
    end

    end
    end
    该命令输出的是之前balancer的状态,其次再看balance_switch的处理源码:
    public SetBalancerRunningResponse setBalancerRunning(RpcController c,

    SetBalancerRunningRequest req) throws ServiceException {
    try {
    master.checkInitialized();
    boolean prevValue = (req.getSynchronous())?

    synchronousBalanceSwitch(req.getOn()) : master.balanceSwitch(req.getOn());

    return SetBalancerRunningResponse.newBuilder().setPrevBalanceValue(prevValue).build();
    } catch (IOException ioe) {
    throw new ServiceException(ioe);
    }

    }

    public boolean balanceSwitch(final boolean b) throws IOException {

    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);

    }

    /**

    Assigns balancer switch according to BalanceSwitchMode
    @param b new balancer switch
    @param mode BalanceSwitchMode
    @return old balancer switch
    */
    

    boolean switchBalancer(final boolean b, BalanceSwitchMode mode) throws IOException {

    boolean oldValue = master.loadBalancerTracker.isBalancerOn();
    boolean newValue = b;
    try {
    if (master.cpHost != null) {

    master.cpHost.preBalanceSwitch(newValue);

    }
    try {

    if (mode == BalanceSwitchMode.SYNC) {
      synchronized (master.getLoadBalancer()) {
        master.loadBalancerTracker.setBalancerOn(newValue);
      }
    } else {
      master.loadBalancerTracker.setBalancerOn(newValue);
    }

    } catch (KeeperException ke) {

    throw new IOException(ke);

    }
    LOG.info(master.getClientIdAuditPrefix() " set balanceSwitch=" newValue);
    if (master.cpHost != null) {

    master.cpHost.postBalanceSwitch(oldValue, newValue);

    }
    } catch (IOException ioe) {
    LOG.warn("Error flipping balance switch", ioe);
    }
    return oldValue;

    }
    从switchBalancer方法也能看到返回的是之前balancer的状态值。
    至于status参数设置的balanceSwitch为false是因为admin.rb文件在处理参数的时候如果传status则
    java.lang.Boolean.valueOf(enableDisable)为false,并且shell.rb文件指定了哪些参数是符合要求的,status是其中之一,而其他的譬如state这种参数会报异常。
    ----------------------------------------------------------------------------------------------Enable/disable balancerReturns previous balancer switch setting.

    def balance_switch(enableDisable)

    @admin.setBalancerRunning(

    java.lang.Boolean.valueOf(enableDisable), java.lang.Boolean.valueOf(false)

    )

    end
    Load all commands

    Shell.load_command_group(
    'general',
    full_name: 'GENERAL HBASE SHELL COMMANDS',
    commands: %w[

    status
    version
    table_help
    whoami
    processlist

    ]
    )

    2019-07-17 23:12:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
大数据时代的存储 ——HBase的实践与探索 立即下载
Hbase在滴滴出行的应用场景和最佳实践 立即下载
阿里云HBase主备双活 立即下载