
# 编译并运行HBase应用
在程序代码完成开发后，您可以在Windows开发环境中运行应用。
#### 操作步骤
1. 在windows下使用REST API操作HBase集群时，JDK版本需为jdk1.8.0_60及以上版本。从集群环境中获取jdk的cacerts文件，并复制"/opt/Bigdata/jdk/jre/lib/security/cacerts"文件到windows上的JDK环境中"C:\\Program Files\\Java\\jdk1.8.0_60\\jre\\lib\\security"(不使用REST API操作HBase集群可跳过此步骤)。
2. 在windows上配置集群的ip与主机名映射关系。登录集群后台，执行命令**cat /etc/hosts** 后，把hosts文件中的ip与hostname映射关系拷贝到"C:\\Windows\\System32\\drivers\\etc\\hosts"中。其中主机名请以查询结果为准。
   
   ```
   192.168.0.90 node-master1BedB.089d8c43-12d5-410c-b980-c2728a305be3.com
   192.168.0.129 node-ana-corezLaR.089d8c43-12d5-410c-b980-c2728a305be3.com
   ```
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   使用windows访问MRS集群来操作HBase，有如下两种方式：
   - 申请一台windows的ECS访问MRS集群操作hbase。安装开发环境后运行样例代码。申请ECS访问MRS集群的步骤如下：
     1. 在"现有集群"列表中，单击已创建的集群名称。 记录集群的"可用分区"、"虚拟私有云"、"集群控制台地址"，以及Master节点的"默认安全组"。
        
     
     2. 在弹性云服务管理控制台，创建一个新的弹性云服务器。 弹性云服务器的"可用分区"、"虚拟私有云"、"安全组"，需要和待访问集群的配置相同。
        选择一个Windows系统的公共镜像。
        其他配置参数详细信息，请参见"弹性云服务器 \> 快速入门 \> 购买并登录Windows弹性云服务器"
        
      
   
   - 使用本机访问MRS集群操作HBase。为MRS集群中HBase服务的所有节点绑定弹性公网IP，在本机(即Windows机器)上配置集群的IP与主机名映射关系时，把IP替换为主机名对应的弹性公网IP，并修改导入样例的krb5.conf文件中"kdc","admin_server","kpasswd_server","kdc_listen","kadmind_listen"和"kpasswd_listen"六个参数的ip(单master的集群没有后面三个参数则不必修改)，使其对应于KrbServer中对应的弹性公网IP（由于普通集群未启用kerberos功能，可跳过此修改krb5.conf文件的步骤。），然后运行样例代码。绑定弹性公网IP步骤如下：
     1. 在虚拟私有云管理控制台，申请一个弹性IP地址，并与弹性云服务器绑定。 具体请参见"虚拟私有云 \> 用户指南 \> 弹性公网IP \> 为弹性云服务器申请和绑定弹性公网IP"。
        
     
     2. 为MRS集群开放安全组规则。 在集群Master节点和Core节点的安全组添加安全组规则使弹性云服务器可以访问集群，若集群为安全集群则需要同时将UDP的21731、21732端口，TCP的21730、21731、21732及HBase的HMaster、RegionServer实例的RPC端口和ZooKeeper服务的端口添加在安全组的入方向规则中。请参见"虚拟私有云 \> 用户指南 \> 安全性 \> 安全组 \> 添加安全组规则"。
        
      
    
   
   
3. 修改运行时环境配置。
   
   修改样例代码中自带hbase-site.xml文件的配置，与实际环境中保持一致，配置列表如下：
   - hbase.zookeeper.quorum: zookeeper实例的主机名，多个实例时以逗号分隔，必选。
   
   - hbase.regionserver.kerberos.principal: regionserver的principal，与master的principal保持一致，仅开启kerberos功能集群需要配置该参数。
   
   - hbase.master.kerberos.principal: hmaster的principal，与regionserver的principal保持一致，仅开启kerberos功能集群需要配置该参数。
   
   - hadoop.security.authentication：hadoop鉴权模式，开启kerberos功能的集群需要配置该参数值为kerberos，否则不用配置。
   
   - hbase.security.authentication：hbase鉴权模式，开启kerberos功能的集群需要配置该参数值为kerberos，否则不用配置。
    
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   上述参数可通过登录任一Master节点，从hbase客户端配置("/opt/client/HBase/hbase/conf")中获取。以获取 "hbase.zookeeper.quorum"的值为例，可登录任一Master节点执行如下命令获取：
   grep "hbase.zookeeper.quorum" /opt/client/HBase/hbase/conf/* -R -A1
   ![](https://support.huaweicloud.com/devg-mrs/zh-cn_image_0250982174.png)
   
   
4. 修改样例代码。 
   1. 当前样例代码中操作HBase的接口有两种，分别是普通接口，REST接口。调试不同API接口操作HBase时可以注释其他接口调用。这里以使用普通接口操作HBase为例，main方法中只包含如下代码段。
      ```
      public static void main(String[] args) {
        try {
          init();
          login();
        } catch (IOException e) {
            LOG.error("Failed to login because ", e);
            return;
        }
        // getDefaultConfiguration();
        conf = HBaseConfiguration.create();
        // test hbase API
        HBaseExample oneSample;
        try {
          oneSample = new HBaseExample(conf);
          oneSample.test();
        } catch (Exception e) {
          LOG.error("Failed to test HBase because ", e);
        }
        LOG.info("-----------finish HBase-------------------");
      }
      ```
      
   
   2. 修改样例工程com.huawei.bigdata.hbase.examples.TestMain类中ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL的参数值。（未开启Kerberos认证集群可跳过此步）。
      ```
      private static final String ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL = "zookeeper/hadoop.4a049bf4_e74e_4545_9291_6fc6098d3723.com";
      ```
      ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
      - 安全集群在Zookeeper认证时是通过四字命令获取Zookeeper服务端的principal，在Zookeeper实例高负载或者实例不稳定时，会由于无法使用四字命令获取服务端的principal导致认证失败，需要通过客户端把该值传入环境中使用，避免认证失败的问题。
      
      - 可通过登录任一Master节点执行如下命令获取该值。 grep "CLIENT_ZOOKEEPER_PRINCIPAL" /opt/client/HBase/hbase/conf/*
        ![](https://support.huaweicloud.com/devg-mrs/zh-cn_image_0250982427.png)
        
        
   
   3. 修改样例工程"src/main/resources"下的hbaseclient.properties文件。userKeytab.path，krb5.conf.path对应于从[准备HBase应用开发用户](https://support.huaweicloud.com/devg-mrs/mrs_06_0010.html)获取的文件的地址。（未开启Kerberos认证集群可跳过此步）。
      ```
      user.name=hbaseuser
      userKeytabName=userKeytab.path
      krb5ConfName=krb5.conf.path
      ```
      
   
   4. 若使用REST接口时需修改hbaseclient.properties中的rest.server.info，使其对应于rest server的ip:port（port默认为21309）。
      ```
      rest.server.info=10.10.10.10:21309
      ```
      ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
      1. 从集群的master节点获取core-site.xml, hdfs-site.xml, hbase-site.xml文件，并放置到样例工程的"resources"下，即"src/main/resources"，文件获取路径为"/opt/client/HBase/hbase/conf"。MRS 1.9.2及其之后版本仅需修改自带的hbase-site.xml中的相应配置即可。
      
      2. 若使用申请的ECS访问HBase，可直接使用RESTServer的ip；若使用本机访问HBase则需使用该RESTServer绑定的弹性公网IP作为RESTServer的ip。
      
      3. HIndexExample样例工程仅在MRS 1.9.2及其以后版本中支持，需注意当前集群版本。
        
   
   
   
   
5. 运行样例。 
   在开发环境中（例如Eclipse中），右击"TestMain.java"，单击"Run as \> Java Application"运行对应的应用程序工程。
   
   
 
