更新时间:2023-11-10 GMT+08:00
分享

使用HBase双读

操作场景

HBase客户端应用通过自定义加载主备集群配置项,实现了双读能力。HBase双读作为提高HBase集群系统高可用性的一个关键特性,适用于四个查询场景:使用Get读取数据、使用批量Get读取数据、使用Scan读取数据,以及基于二级索引查询。它能够同时读取主备集群数据,减少查询毛刺,具体表现为:
  • 高成功率:双并发读机制,保证每一次读请求的成功率。
  • 可用性:单集群故障时,查询业务不中断。短暂的网络抖动也不会导致查询时间变长。
  • 通用性:双读特性不支持双写,但不影响原有的实时写场景。
  • 易用性:客户端封装处理,业务侧不感知。

HBase双读使用约束:

  • HBase双读特性基于Replication实现,备集群读取的数据可能和主集群存在差异,因此只能实现最终一致性。
  • 目前HBase双读功能仅用于查询。主集群宕机时,最新数据无法同步,备集群可能查询不到最新数据。
  • HBase的Scan操作可能分解为多次RPC。由于相关session信息在不同集群间不同步,数据不能保证完全一致,因此双读只在第一次RPC时生效,ResultScanner close之前的请求会固定访问第一次RPC时使用的集群。
  • HBase Admin接口、实时写入接口只会访问主集群。所以主集群宕机后,不能提供Admin接口功能和实时写入接口功能,只能提供GetScan查询服务。

HBase双读支持以下两种方式设置主备集群的相关配置:

  • 在“hbase-dual.xml”中新增主备集群的相关配置。
  • 将主备集群相关配置设置到HBaseMultiClusterConnection中(仅MRS 3.3.0及之后版本支持)。

在“hbase-dual.xml”中新增主备集群配置

  1. 将在准备开发用户时获取的主集群keytab认证文件“user.keytab”与“krb5.conf”放置到二次样例“src/main/resources/conf”目录下。
  2. 参考准备开发和运行环境章节,获取HBase主集群客户端配置文件core-site.xml”、“hbase-site.xml”、“hdfs-site.xml”,并将其放置到“src/main/resources/conf/active”目录下,该目录需要自己创建。
  3. 参考准备开发和运行环境章节,获取备集群客户端配置文件core-site.xml、“hbase-site.xml”、“hdfs-site.xml”,并将其放置到“src/main/resources/conf/standby”目录下,该目录需要自己创建。
  4. 创建“hbase-dual.xml”配置文件,放置到“src/main/resources/conf/”目录下。配置文件中的配置项可参考表1

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <!--主集群配置文件目录-->
        <property>
            <name>hbase.dualclient.active.cluster.configuration.path</name>
            <value>{样例代码目录}\\src\\main\\resources\\conf\\active</value>
            </property>
    <!--备集群配置文件目录-->
        <property>
            <name>hbase.dualclient.standby.cluster.configuration.path</name>
            <value>{样例代码目录}\\src\\main\\resources\\conf\\standby</value>
        </property>
    <!--双读模式的Connection实现-->
        <property>
            <name>hbase.client.connection.impl</name>
            <value>org.apache.hadoop.hbase.client.HBaseMultiClusterConnectionImpl</value>
        </property>
    <!--安全模式-->
        <property>
            <name>hbase.security.authentication</name>
            <value>kerberos</value>
        </property>
    <!--安全模式-->
        <property>
            <name>hadoop.security.authentication</name>
            <value>kerberos</value>
        </property>

  5. 创建双读Configuration。

    • MRS 3.3.0之前版本,下面代码片段在“com.huawei.bigdata.hbase.examples”包的“TestMain”类的init方法中添加。
      private static void init() throws IOException {
          // Default load from conf directory
          conf = HBaseConfiguration.create();
          //In Windows environment
          String userdir = TestMain.class.getClassLoader().getResource("conf").getPath() + File.separator;
          //In Linux environment
          //String userdir = System.getProperty("user.dir") + File.separator + "conf" + File.separator;
          conf.addResource(new Path(userdir + "hbase-dual.xml"), false);
        }
    • MRS 3.3.0及之后版本,取消“com.huawei.bigdata.hbase.examples”包的“TestMain”类main方法中的testHBaseDualReadSample注释,确保“com.huawei.bigdata.hbase.examples”包的“HBaseDualReadSample”类中的“IS_CREATE_CONNECTION_BY_XML”值为“true”。

  6. 确定数据来源的集群

    • GET请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testGet方法中添加。
      Result result = table.get(get); 
      if (result instanceof DualResult) {
           LOG.info(((DualResult)result).getClusterId()); 
      }
    • Scan请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testScanData方法中添加。
      ResultScanner rScanner = table.getScanner(scan);  
      if (rScanner instanceof HBaseMultiScanner) {
           LOG.info(((HBaseMultiScanner)rScanner).getClusterId()); 
      }

  7. 客户端支持打印metric信息

    “log4j.properties”文件中增加如下内容,客户端将metric信息输出到指定文件。指标项信息可参考打印metric信息

    log4j.logger.DUAL=debug,DUAL 
    log4j.appender.DUAL=org.apache.log4j.RollingFileAppender 
    log4j.appender.DUAL.File=/var/log/dual.log //客户端本地双读日志路径,根据实际路径修改,但目录要有写入权限
    log4j.additivity.DUAL=false 
    log4j.appender.DUAL.MaxFileSize=${hbase.log.maxfilesize} 
    log4j.appender.DUAL.MaxBackupIndex=${hbase.log.maxbackupindex} 
    log4j.appender.DUAL.layout=org.apache.log4j.PatternLayout 
    log4j.appender.DUAL.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n

将主备集群相关配置设置到HBaseMultiClusterConnection中

该操作仅适用于MRS 3.3.0及之后版本。

  1. 将在准备开发用户时获取的主集群keytab认证文件“user.keytab”与“krb5.conf”放置到二次样例“src/main/resources/conf”目录下。
  2. 创建双读Configuration,取消“com.huawei.bigdata.hbase.examples”包的“TestMain”类main方法中的testHBaseDualReadSample注释,确保“com.huawei.bigdata.hbase.examples”包的“HBaseDualReadSample”类中的“IS_CREATE_CONNECTION_BY_XML”值为“false”。
  3. 在“HBaseDualReadSample”类的addHbaseDualXmlParam方法中添加相关配置,相关配置项可参考HBase双读配置项

    private void addHbaseDualXmlParam(Configuration conf) {
        // We need to set the optional parameters contained in hbase-dual.xml to conf
        // when we use configuration transfer solution
        conf.set(CONNECTION_IMPL_KEY, DUAL_READ_CONNECTION);
        // conf.set("", "");
    }

  4. 在“HBaseDualReadSample”类的initActiveConf方法中添加主集群客户端相关配置:

    private void initActiveConf() {
        // The hbase-dual.xml configuration scheme is used to generate the client configuration of the active cluster.
        // In actual application development, you need to generate the client configuration of the active cluster.
        String activeDir = HBaseDualReadSample.class.getClassLoader().getResource(Utils.CONF_DIRECTORY).getPath()
            + File.separator + ACTIVE_DIRECTORY + File.separator;
        Configuration activeConf = Utils.createConfByUserDir(activeDir);
        HBaseMultiClusterConnection.setActiveConf(activeConf);
    }

  5. 在“HBaseDualReadSample”类initStandbyConf方法中添加备集群客户端相关配置:

    private void initStandbyConf() {
        // The hbase-dual.xml configuration scheme is used to generate the client configuration of the standby cluster.
        // In actual application development, you need to generate the client configuration of the standby cluster.
        String standbyDir = HBaseDualReadSample.class.getClassLoader().getResource(Utils.CONF_DIRECTORY).getPath()
            + File.separator + STANDBY_DIRECTORY + File.separator;
        Configuration standbyConf = Utils.createConfByUserDir(standbyDir);
        HBaseMultiClusterConnection.setStandbyConf(standbyConf);
    }

  6. 确定数据来源的集群。

    • GET请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testGet方法中添加。
      Result result = table.get(get); 
      if (result instanceof DualResult) {
           LOG.info(((DualResult)result).getClusterId()); 
      }
    • Scan请求,以下代码片段在“com.huawei.bigdata.hbase.examples”包的“HBaseSample”类的testScanData方法中添加。
      ResultScanner rScanner = table.getScanner(scan);  
      if (rScanner instanceof HBaseMultiScanner) {
           LOG.info(((HBaseMultiScanner)rScanner).getClusterId()); 
      }

  7. 客户端支持打印metric信息。

    “log4j.properties”文件中增加如下内容,客户端将metric信息输出到指定文件。指标项信息可参考打印metric信息

    log4j.logger.DUAL=debug,DUAL 
    log4j.appender.DUAL=org.apache.log4j.RollingFileAppender 
    log4j.appender.DUAL.File=/var/log/dual.log //客户端本地双读日志路径,根据实际路径修改,但目录要有写入权限
    log4j.additivity.DUAL=false 
    log4j.appender.DUAL.MaxFileSize=${hbase.log.maxfilesize} 
    log4j.appender.DUAL.MaxBackupIndex=${hbase.log.maxbackupindex} 
    log4j.appender.DUAL.layout=org.apache.log4j.PatternLayout 
    log4j.appender.DUAL.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2}: %m%n

分享:

    相关文档

    相关产品