
# 快速开发HBase应用
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。HBase设计目标是用来解决关系型数据库在处理海量数据时的局限性。
HBase使用场景有如下几个特点：
- 处理海量数据（TB或PB级别以上）。
- 具有高吞吐量。
- 在海量数据中实现高效的随机读取。
- 具有很好的伸缩能力。
- 能够同时处理结构化和非结构化的数据。
MRS对外提供了基于HBase组件的应用开发样例工程，本实践用于指导您创建MRS集群后，获取并导入样例工程并在本地进行编译调测，用于实现MRS集群中的HBase表创建、数据插入、索引创建、表删除等操作。
#### 创建MRS HBase集群
1. 购买一个包含有HBase组件的MRS集群，详情请参见[购买自定义集群](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0513.html)。
   ![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   本文以购买的MRS 3.1.0版本的集群为例，组件包含Hadoop、HBase组件，集群开启Kerberos认证。
   
2. 单击"立即购买"，等待MRS集群创建成功。
   图1集群购买成功   
   ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001587867009.png "点击放大") 
 
 #### 准备应用开发配置文件
1. 集群创建成功后，登录FusionInsight Manager创建用于样例工程安全认证的集群用户。 
   1. 选择"系统 \> 权限 \> 用户 \> 添加用户"，在新增用户界面创建一个人机用户，例如**developuser** 。
      "用户组"需加入"hadoop"用户组。
      用户创建完成后，使用新建的**develop** **user**用户登录FusionInsight Manager，根据界面提示修改初始密码。
      
   
   2. 使用Ranger管理员用户**rangeradmin** 登录Ranger WebUI页面。
      **rangeradmin** 用户默认密码为"Rangeradmin@123"，详细内容请参见[用户账号一览表](https://support.huaweicloud.com/usermanual-mrs/admin_guide_000239.html)。
      
   
   3. 在Ranger首页中单击"HBASE"区域的组件插件名称如"HBase"。
   
   4. 单击"Policy Name"名称为"all - table, column-family, column"操作列的![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001587597805.png)。
   
   5. 在"Allow Conditions"区域新增策略允许条件，"Select User"列勾选新建的用户名称，"Permissions"列勾选"Select/Deselect All"。
   
   6. 单击"Save"。
   
   
   
   
2. 使用**admin** 用户登录FusionInsight Manager，选择"系统 \> 权限 \> 用户"，在用户名为**develop** **user**的操作列选择"更多 \> 下载认证凭据"下载认证凭据文件，保存后解压得到该用户的"user.keytab"文件与"krb5.conf"文件。
3. 选择"集群 \> 概览 \> 更多 \> 下载客户端"，"选择客户端类型"设置为"仅配置文件"，单击"确定"，等待客户端文件包生成后根据浏览器提示下载客户端到本地并解压。 
   例如，客户端配置文件压缩包为"FusionInsight_Cluster_1_Services_Client.tar"，解压后得到"FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles.tar"，继续解压该文件。
   1. 进入客户端配置文件解压路径"FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles\\HBase\\config"，获取[表1]中相关配置文件。
       表1配置文件 
      | 配置文件           | 作用                 |
      |:---|:---|
      | core-site.xml  | 配置Hadoop Core详细参数。 |
      | hbase-site.xml | 配置HBase详细参数。       |
      | hdfs-site.xml  | 配置HDFS详细参数。        |
         
      
   
   2. 复制解压目录下的"hosts"文件中的内容到本地hosts文件中，确保本地机器能与解压目录下"hosts"文件中所列出的各主机在网络上互通。
      ![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
      - 在本实践中，需要确保本地环境与MRS集群所在网络平面互通，通常可以通过绑定EIP的方式访问MRS集群，具体操作请参考[配置Windows通过EIP访问集群HBase](https://support.huaweicloud.com/devg3-mrs/mrs_07_080076.html)。
      
      - 如果本地开发环境与MRS集群内节点网络不通，也可以将样例工程编译后，将jar包上传至集群内运行，具体操作可参考[调测HBase应用](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_080040.html)。
      
      - Windows本地hosts文件存放路径举例："C:\\WINDOWS\\system32\\drivers\\etc\\hosts"。
        
   
   
   
   
 
#### 获取样例工程
1. 通过开源镜像站获取样例工程。 
   下载样例工程的Maven工程源码和配置文件，并在本地配置好相关开发工具，可参考[通过开源镜像站获取样例工程](https://support.huaweicloud.com/devg3-mrs/mrs_07_010002.html)。
   根据集群版本选择对应的分支，下载并获取MRS相关样例工程。
   例如本章节场景对应示例为"hbase-example"样例，获取地址：<https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.0/src/hbase-examples/hbase-example>。
   
   
2. 本地使用IDEA工具导入样例工程，等待Maven工程下载相关依赖包，具体操作可参考[配置并导入样例工程](https://support.huaweicloud.com/devg3-mrs/mrs_07_080007.html)。
   
   图2HBase样例工程示例   
   ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001537280268.png)
   本地配置好Maven及SDK相关参数后，样例工程会自动加载相关依赖包。
   
   
3. 将[准备应用开发配置文件]中获取的集群配置文件及用户认证文件放置在样例工程的"../src/main/resources/conf"目录下。
4. 在"com.huawei.bigdata.hbase.examples"包的"TestMain"类中修改"userName"为实际用户名，例如"developuser"。 
   ```
   private static void login() throws IOException {
           if (User.isHBaseSecurityEnabled(conf)) {
               userName = "developuser";
              
               //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;
               LoginUtil.setJaasConf(ZOOKEEPER_DEFAULT_LOGIN_CONTEXT_NAME, userName, userKeytabFile);
               LoginUtil.login(userName, userKeytabFile, krb5File, conf);
           }
   }
   ```
   本样例工程中，假定用户开发一个应用程序，用于管理企业中的使用A业务的用户信息，A业务操作流程如下：
   
   | **序号** | **步骤**                          |
   |:---|:---|
   | 1      | 根据已有信息创建表。                      |
   | 2      | 导入用户数据。                         |
   | 3      | 增加"教育信息"列族，在用户信息中新增用户的学历、职称等信息。 |
   | 4      | 根据用户编号查询用户姓名和地址。                |
   | 5      | 根据用户姓名进行查询。                     |
   | 6      | 为提升查询性能，创建二级索引或者删除二级索引。         |
   | 7      | 用户销户，删除用户信息表中该用户的数据。            |
   | 8      | A业务结束后，删除用户信息表。                 |
      
   例如以下创建用户信息表代码片段在com.huawei.bigdata.hbase.examples包的"HBaseSample"类的testCreateTable方法中，其他各功能代码片段详情说明可参考[HBase数据读写示例程序](https://support.huaweicloud.com/devg3-mrs/mrs_07_080087.html)。
   ```
   public void testCreateTable() {
                LOG.info("Entering testCreateTable.");
                TableDescriptorBuilder htd = TableDescriptorBuilder.newBuilder(tableName); //创建表描述符
                ColumnFamilyDescriptorBuilder hcd = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info")); //创建列族描述符
                hcd.setDataBlockEncoding(DataBlockEncoding.FAST_DIFF); //设置编码算法，HBase提供了DIFF，FAST_DIFF，PREFIX三种编码算法
                hcd.setCompressionType(Compression.Algorithm.SNAPPY);
                htd.setColumnFamily(hcd.build());  //添加列族描述符到表描述符中
                Admin admin = null; 
                try {
                  admin = conn.getAdmin(); //获取Admin对象，Admin提供了建表、创建列族、检查表是否存在、修改表结构和列族结构以及删除表等功能。
                  if (!admin.tableExists(tableName)) {
                    LOG.info("Creating table...");
                    admin.createTable(htd.build());//调用Admin的建表方法。
                    LOG.info(admin.getClusterMetrics().toString());
                    LOG.info(admin.listNamespaceDescriptors().toString());
                    LOG.info("Table created successfully.");
                  } else {
                    LOG.warn("table already exists");
                  }
                } catch (IOException e) {
                    LOG.error("Create table failed " ,e);
                } finally {
                  if (admin != null) {
                    try {
                      admin.close();
                    } catch (IOException e) {
                      LOG.error("Failed to close admin " ,e);
                    }
                  }
                }
                LOG.info("Exiting testCreateTable.");
     }
   ```
   
   
 
#### 编译并运行程序
1. 单击IDEA右边Maven窗口的"Reimport All Maven Projects"，进行Maven项目依赖加载。 
   图3加载样例工程   
   ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001537097852.png "点击放大")
   
   
2. 编译运行程序。 
   1. 选择"Maven \> *样例工程名称*\> Lifecycle \> clean"，双击"clean"运行Maven的clean命令。
   
   2. 选择"Maven \> *样例工程名称* \> Lifecycle \> compile"，双击"compile"运行Maven的compile命令。
      图4Maven工具 clean和compile   
      ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001587617689.png) 
   
   
   编译完成，打印"Build Success"，生成target目录。
   ```
   [INFO] ------------------------------------------------------------------------
   [INFO] BUILD SUCCESS
   [INFO] ------------------------------------------------------------------------
   [INFO] Total time:  21.276 s
   [INFO] Finished at: 2023-05-05T14:36:39+08:00
   [INFO] ------------------------------------------------------------------------
   ```
   
   
3. 运行程序。 
   右键"TestMain.java"文件，选择"Run 'TestMain.main()'"。
   图5运行程序   
   ![](https://support.huaweicloud.com/devg-lts-mrs/zh-cn_image_0000001536938384.png "点击放大")
   
   
4. hbase-example样例运行成功后，运行信息如下，表示相关表操作成功执行。 
   ```
   ...
   2023-05-05 15:05:27,050 INFO  [main] examples.HBaseSample: Table created successfully.
   2023-05-05 15:05:27,050 INFO  [main] examples.HBaseSample: Exiting testCreateTable.
   2023-05-05 15:05:27,050 INFO  [main] examples.HBaseSample: Entering testMultiSplit.
   2023-05-05 15:05:31,171 INFO  [main] client.HBaseAdmin: Operation: MULTI_SPLIT_REGION, Table Name: default:hbase_sample_table, procId: 21 completed
   2023-05-05 15:05:31,171 INFO  [main] examples.HBaseSample: MultiSplit successfully.
   2023-05-05 15:05:31,172 INFO  [main] examples.HBaseSample: Exiting testMultiSplit.
   2023-05-05 15:05:31,172 INFO  [main] examples.HBaseSample: Entering testPut.
   2023-05-05 15:05:32,862 INFO  [main] examples.HBaseSample: Put successfully.
   2023-05-05 15:05:32,862 INFO  [main] examples.HBaseSample: Exiting testPut.
   2023-05-05 15:05:32,862 INFO  [main] examples.HBaseSample: Entering createIndex.
   2023-05-05 15:05:36,627 INFO  [main] examples.HBaseSample: Create index successfully.
   2023-05-05 15:05:36,627 INFO  [main] examples.HBaseSample: Exiting createIndex.
   2023-05-05 15:05:36,627 INFO  [main] examples.HBaseSample: Entering createIndex.
   2023-05-05 15:05:37,912 INFO  [main] examples.HBaseSample: Successfully enable indices [index_name]  of the table hbase_sample_table
   2023-05-05 15:05:37,912 INFO  [main] examples.HBaseSample: Entering testScanDataByIndex.
   2023-05-05 15:05:37,915 INFO  [main] examples.HBaseSample: Scan indexed data.
   2023-05-05 15:05:39,939 INFO  [main] examples.HBaseSample: Scan data by index successfully.
   2023-05-05 15:05:39,939 INFO  [main] examples.HBaseSample: Exiting testScanDataByIndex.
   2023-05-05 15:05:39,941 INFO  [main] examples.HBaseSample: Entering testModifyTable.
   2023-05-05 15:05:40,191 INFO  [main] client.HBaseAdmin: Started disable of hbase_sample_table
   2023-05-05 15:05:41,322 INFO  [main] client.HBaseAdmin: Operation: DISABLE, Table Name: default:hbase_sample_table, procId: 53 completed
   2023-05-05 15:05:42,230 INFO  [main] client.HBaseAdmin: Started enable of hbase_sample_table
   2023-05-05 15:05:43,187 INFO  [main] client.HBaseAdmin: Operation: ENABLE, Table Name: default:hbase_sample_table, procId: 65 completed
   2023-05-05 15:05:43,187 INFO  [main] examples.HBaseSample: Modify table successfully.
   2023-05-05 15:05:43,187 INFO  [main] examples.HBaseSample: Exiting testModifyTable.
   2023-05-05 15:05:43,187 INFO  [main] examples.HBaseSample: Entering testGet.
   2023-05-05 15:05:43,278 INFO  [main] examples.HBaseSample: 012005000201:info,address,Shenzhen, Guangdong
   2023-05-05 15:05:43,279 INFO  [main] examples.HBaseSample: 012005000201:info,name,Zhang San
   2023-05-05 15:05:43,279 INFO  [main] examples.HBaseSample: Get data successfully.
   2023-05-05 15:05:43,279 INFO  [main] examples.HBaseSample: Exiting testGet.
   2023-05-05 15:05:43,279 INFO  [main] examples.HBaseSample: Entering testScanData.
   2023-05-05 15:05:43,576 INFO  [main] examples.HBaseSample: 012005000201:info,name,Zhang San
   2023-05-05 15:05:43,576 INFO  [main] examples.HBaseSample: 012005000202:info,name,Li Wanting
   2023-05-05 15:05:43,577 INFO  [main] examples.HBaseSample: 012005000203:info,name,Wang Ming
   2023-05-05 15:05:43,577 INFO  [main] examples.HBaseSample: 012005000204:info,name,Li Gang
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: 012005000205:info,name,Zhao Enru
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: 012005000206:info,name,Chen Long
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: 012005000207:info,name,Zhou Wei
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: 012005000208:info,name,Yang Yiwen
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: 012005000209:info,name,Xu Bing
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: 012005000210:info,name,Xiao Kai
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: Scan data successfully.
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: Exiting testScanData.
   2023-05-05 15:05:43,578 INFO  [main] examples.HBaseSample: Entering testSingleColumnValueFilter.
   2023-05-05 15:05:43,883 INFO  [main] examples.HBaseSample: Single column value filter successfully.
   2023-05-05 15:05:43,883 INFO  [main] examples.HBaseSample: Exiting testSingleColumnValueFilter.
   2023-05-05 15:05:43,884 INFO  [main] examples.HBaseSample: Entering testFilterList.
   2023-05-05 15:05:44,388 INFO  [main] examples.HBaseSample: 012005000201:info,name,Zhang San
   2023-05-05 15:05:44,388 INFO  [main] examples.HBaseSample: 012005000202:info,name,Li Wanting
   2023-05-05 15:05:44,388 INFO  [main] examples.HBaseSample: 012005000203:info,name,Wang Ming
   2023-05-05 15:05:44,388 INFO  [main] examples.HBaseSample: 012005000204:info,name,Li Gang
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: 012005000205:info,name,Zhao Enru
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: 012005000206:info,name,Chen Long
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: 012005000207:info,name,Zhou Wei
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: 012005000208:info,name,Yang Yiwen
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: 012005000209:info,name,Xu Bing
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: 012005000210:info,name,Xiao Kai
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: Filter list successfully.
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: Exiting testFilterList.
   2023-05-05 15:05:44,389 INFO  [main] examples.HBaseSample: Entering testDelete.
   2023-05-05 15:05:44,586 INFO  [main] examples.HBaseSample: Delete table successfully.
   2023-05-05 15:05:44,586 INFO  [main] examples.HBaseSample: Exiting testDelete.
   2023-05-05 15:05:44,586 INFO  [main] examples.HBaseSample: Entering disableIndex.
   2023-05-05 15:05:45,819 INFO  [main] examples.HBaseSample: Successfully disable indices [index_name]  of the table hbase_sample_table
   2023-05-05 15:05:45,819 INFO  [main] examples.HBaseSample: Entering dropIndex.
   2023-05-05 15:05:48,084 INFO  [main] examples.HBaseSample: Drop index successfully.
   2023-05-05 15:05:48,084 INFO  [main] examples.HBaseSample: Exiting dropIndex.
   2023-05-05 15:05:48,084 INFO  [main] examples.HBaseSample: Entering dropTable.
   2023-05-05 15:05:48,237 INFO  [main] client.HBaseAdmin: Started disable of hbase_sample_table
   2023-05-05 15:05:49,543 INFO  [main] client.HBaseAdmin: Operation: DISABLE, Table Name: default:hbase_sample_table, procId: 95 completed
   2023-05-05 15:05:50,645 INFO  [main] client.HBaseAdmin: Operation: DELETE, Table Name: default:hbase_sample_table, procId: 106 completed
   2023-05-05 15:05:50,645 INFO  [main] examples.HBaseSample: Drop table successfully.
   2023-05-05 15:05:50,645 INFO  [main] examples.HBaseSample: Exiting dropTable.
   2023-05-05 15:05:50,646 INFO  [main] client.ConnectionImplementation: Closing master protocol: MasterService
   2023-05-05 15:05:50,652 INFO  [main] client.ConnectionImplementation: Connection has been closed by main.
   2023-05-05 15:05:50,654 INFO  [main] hbase.ChoreService: Chore service for: AsyncConn Chore Service had [[ScheduledChore: Name: RefreshCredentials Period: 30000 Unit: MILLISECONDS]] on shutdown
   2023-05-05 15:05:50,655 INFO  [main] examples.TestMain: -----------finish HBase -------------------
   ...
   ```
   
   
 
