快速开发HBase应用
HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。HBase设计目标是用来解决关系型数据库在处理海量数据时的局限性。
HBase使用场景有如下几个特点:
- 处理海量数据(TB或PB级别以上)。
- 具有高吞吐量。
- 在海量数据中实现高效的随机读取。
- 具有很好的伸缩能力。
- 能够同时处理结构化和非结构化的数据。
MRS对外提供了基于HBase组件的应用开发样例工程,本实践用于指导您创建MRS集群后,获取并导入样例工程并在本地进行编译调测,用于实现MRS集群中的HBase表创建、数据插入、索引创建、表删除等操作。
创建MRS HBase集群
- 购买一个包含有HBase组件的MRS集群,详情请参见购买自定义集群。
本文以购买的MRS 3.1.0版本的集群为例,组件包含Hadoop、HBase组件,集群开启Kerberos认证。
- 单击“立即购买”,等待MRS集群创建成功。
图1 集群购买成功
准备应用开发配置文件
- 集群创建成功后,登录FusionInsight Manager创建用于样例工程安全认证的集群用户。
- 选择“系统 > 权限 > 用户 > 添加用户”,在新增用户界面创建一个人机用户,例如developuser。
“用户组”需加入“hadoop”用户组。
用户创建完成后,使用新建的developuser用户登录FusionInsight Manager,根据界面提示修改初始密码。
- 使用Ranger管理员用户rangeradmin登录Ranger WebUI页面。
rangeradmin用户默认密码为“Rangeradmin@123”,详细内容请参见用户账号一览表。
- 在Ranger首页中单击“HBASE”区域的组件插件名称如“HBase”。
- 单击“Policy Name”名称为“all - table, column-family, column”操作列的。
- 在“Allow Conditions”区域新增策略允许条件,“Select User”列勾选新建的用户名称,“Permissions”列勾选“Select/Deselect All”。
- 单击“Save”。
- 选择“系统 > 权限 > 用户 > 添加用户”,在新增用户界面创建一个人机用户,例如developuser。
- 使用admin用户登录FusionInsight Manager,选择“user.keytab”文件与“krb5.conf”文件。 ,在用户名为developuser的操作列选择“更多 > 下载认证凭据”下载认证凭据文件,保存后解压得到该用户的
- 选择“集群 > 概览 > 更多 > 下载客户端”,“选择客户端类型”设置为“仅配置文件”,单击“确定”,等待客户端文件包生成后根据浏览器提示下载客户端到本地并解压。
例如,客户端配置文件压缩包为“FusionInsight_Cluster_1_Services_Client.tar”,解压后得到“FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles.tar”,继续解压该文件。
- 进入客户端配置文件解压路径“FusionInsight_Cluster_1_Services_ClientConfig_ConfigFiles\HBase\config”,获取表1中相关配置文件。
- 复制解压目录下的“hosts”文件中的内容到本地hosts文件中,确保本地机器能与解压目录下“hosts”文件中所列出的各主机在网络上互通。
- 在本实践中,需要确保本地环境与MRS集群所在网络平面互通,通常可以通过绑定EIP的方式访问MRS集群,具体操作请参考配置Windows通过EIP访问集群HBase。
- 如果本地开发环境与MRS集群内节点网络不通,也可以将样例工程编译后,将jar包上传至集群内运行,具体操作可参考调测HBase应用。
- Windows本地hosts文件存放路径举例:“C:\WINDOWS\system32\drivers\etc\hosts”。
获取样例工程
- 通过开源镜像站获取样例工程。
下载样例工程的Maven工程源码和配置文件,并在本地配置好相关开发工具,可参考通过开源镜像站获取样例工程。
根据集群版本选择对应的分支,下载并获取MRS相关样例工程。
例如本章节场景对应示例为“hbase-example”样例,获取地址:https://github.com/huaweicloud/huaweicloud-mrs-example/tree/mrs-3.1.0/src/hbase-examples/hbase-example。
- 本地使用IDEA工具导入样例工程,等待Maven工程下载相关依赖包,具体操作可参考配置并导入样例工程。
图2 HBase样例工程示例
本地配置好Maven及SDK相关参数后,样例工程会自动加载相关依赖包。
- 将准备应用开发配置文件中获取的集群配置文件及用户认证文件放置在样例工程的“../src/main/resources/conf”目录下。
- 在“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数据读写示例程序。
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."); }
编译并运行程序
- 单击IDEA右边Maven窗口的“Reimport All Maven Projects”,进行Maven项目依赖加载。
图3 加载样例工程
- 编译运行程序。
- 选择“Maven > 样例工程名称 > Lifecycle > clean”,双击“clean”运行Maven的clean命令。
- 选择“Maven > 样例工程名称 > Lifecycle > compile”,双击“compile”运行Maven的compile命令。
图4 Mavne工具 clean和compile
编译完成,打印“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] ------------------------------------------------------------------------
- 运行程序。
右键“TestMain.java”文件,选择“Run 'TestMain.main() '”。
图5 运行程序
- 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 ------------------- ...