【作者主页】Francek Chen【专栏介绍】⌈ ⌈⌈大数据技术原理与应用⌋ ⌋⌋专栏系统介绍大数据的相关知识分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。【GitCode】专栏资源保存在我的GitCode仓库https://gitcode.com/Morse_Chen/BigData_principle_application。文章目录一、HBase的安装与配置二、HBase常用Shell命令三、HBase常用Java API及应用实例一建立连接和关闭连接二创建表三添加数据四浏览数据五完整代码小结一、HBase的安装与配置详细安装方法请参考大数据存储技术3—— HBase分布式数据库启动关闭 Hadoop和HBase 的顺序一定是启动 Hadoop —启动 HBase —关闭 HBase —关闭 Hadoop。HBASE_MANAGES_ZKtrue则由 HBase 自己管理 Zookeeper否则启动独立的 Zookeeper。建议单机版 HBase使用自带 Zookeeper集群安装 HBase 则采用单独 Zookeeper 集群。二、HBase常用Shell命令create创建表list列出 HBase 中所有的表信息例子1创建一个表该表名称为 tempTable包含 3 个列族 f1f2 和 f3。备注后面的例子都在此基础上继续操作。put向表、行、列指定的单元格添加数据 一次只能为一个表的一行数据的一个列添加一个数据scan浏览表的相关信息例子2继续向表 tempTable 中的第 r1 行、第“f1:c1”列添加数据值为“hello,dblab”。在添加数据时HBase 会自动为添加的数据添加一个时间戳当然也可以在添加数据时人工指定时间戳的值。get通过表名、行、列、时间戳、时间范围和版本号来获得相应单元格的值例子31从 tempTable 中获取第 r1 行、第“f1:c1”列的值2从 tempTable 中获取第 r1 行、第“f1:c3”列的值。备注f1 是列族c1 和 c3 都是列。从运行结果可以看出 tempTable 中第 r1 行、第“f1:c3”列的值当前不存在。enable/disable使表有效或无效drop删除表例子4使表 tempTable 无效、删除该表。三、HBase常用Java API及应用实例HBase 是 Java 编写的它的原生的 API 也是 Java 开发的不过可以使用 Java 或其他语言调用 API 来访问 HBase。备注使用的 HBase 版本号为2.5.4。任务要求创建表、插入数据、浏览数据创建一个学生信息表用来存储学生姓名姓名作为行键并且假设姓名不会重复以及考试成绩其中考试成绩是一个列族分别存储了各个科目的考试成绩。逻辑视图如表所示。表1 学生信息表的表结构namescoreEnglishMathComputer表2 需要添加的数据namescoreEnglishMathComputerzhangsan698677lisi5510088importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.hadoop.hbase.util.Bytes;importjava.io.IOException;publicclassChapter4{publicstaticConfigurationconfiguration;publicstaticConnectionconnection;publicstaticAdminadmin;publicstaticvoidmain(String[]args)throwsIOException{init();// 初始化连接try{createTable(student,newString[]{score});insertData(student,zhangsan,score,English,69);insertData(student,zhangsan,score,Math,86);insertData(student,zhangsan,score,Computer,77);getData(student,zhangsan,score,English);}finally{close();// 确保关闭连接}}……publicstaticvoidinit(){……}//建立连接publicstaticvoidclose(){……}//关闭连接publicstaticvoidcreateTable(){……}//创建表publicstaticvoidinsertData(){……}//插入数据publicstaticvoidgetData{……}//浏览数据}一建立连接和关闭连接// 建立连接按您提供的代码publicstaticvoidinit(){configurationHBaseConfiguration.create();configuration.set(hbase.rootdir,hdfs://localhost:9000/hbase);try{connectionConnectionFactory.createConnection(configuration);adminconnection.getAdmin();}catch(IOExceptione){e.printStackTrace();}}备注hbase-site.xmlconfigurationpropertynamehbase.rootdir/namevaluehdfs://localhost:9000/hbase/value/property/configuration// 关闭连接publicstaticvoidclose(){try{if(admin!null){admin.close();}if(connection!null){connection.close();}}catch(IOExceptione){e.printStackTrace();}}二创建表创建一个学生信息表用来存储学生姓名姓名作为行键并且假设姓名不会重复以及考试成绩其中考试成绩是一个列族分别存储了各个科目的考试成绩。逻辑视图如表1所示。/* 创建表 *//** * param myTableName 表名 * param colFamily 列族数组 * throws Exception */publicstaticvoidcreateTable(StringmyTableName,String[]colFamily)throwsIOException{TableNametableNameTableName.valueOf(myTableName);if(admin.tableExists(tableName)){System.out.println(table is exists!);}else{TableDescriptorBuildertableDescriptorTableDescriptorBuilder.newBuilder(tableName);for(Stringstr:colFamily){ColumnFamilyDescriptorfamilyColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();tableDescriptor.setColumnFamily(family);}admin.createTable(tableDescriptor.build());}}三添加数据现在向表 student 中添加如表2所示的数据。/* 添加数据 *//** * param tableName 表名 * param rowKey 行键 * param colFamily 列族 * param col 列限定符 * param val 数据 * throws Exception */publicstaticvoidinsertData(StringtableName,StringrowKey,StringcolFamily,Stringcol,Stringval)throwsIOException{Tabletableconnection.getTable(TableName.valueOf(tableName));PutputnewPut(rowKey.getBytes());put.addColumn(colFamily.getBytes(),col.getBytes(),val.getBytes());table.put(put);table.close();}添加数据时需要分别设置参数 myTableName、rowkey、colFamily、col、val 的值然后运行上述代码。例如添加表 2 第一行数据时为 insertData() 方法指定相应参数并运行如下 3 行代码insertData(student,zhangsan,score,English,69);insertData(student,zhangsan,score,Math,86);insertData(student,zhangsan,score,Computer,77);上述代码与如下 HBase Shell 命令等效putstudent,zhangsan,score:English,69;putstudent,zhangsan,score:Math,86;putstudent,zhangsan,score:Computer,77;四浏览数据/* 获取某单元格数据 *//** * param tableName 表名 * param rowKey 行键 * param colFamily 列族 * param col 列限定符 * throws IOException */publicstaticvoidgetData(StringtableName,StringrowKey,StringcolFamily,Stringcol)throwsIOException{Tabletableconnection.getTable(TableName.valueOf(tableName));GetgetnewGet(rowKey.getBytes());get.addColumn(colFamily.getBytes(),col.getBytes());Resultresulttable.get(get);System.out.println(newString(result.getValue(colFamily.getBytes(),colnull?null:col.getBytes())));table.close();}比如现在要获取姓名为“zhangsan”在“English”上的数据就可以在运行上述代码时指定参数 tableName 为“student”、rowKey 为“zhangsan”、colFamily 为“score”、col 为“English”。getData(student,zhangsan,score,English);上述代码与如下 HBase Shell 命令等效getstudent,zhangsan,{COLUMNscore:English}五完整代码importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.hadoop.hbase.util.Bytes;importjava.io.IOException;publicclassExampleForHBase{publicstaticConfigurationconfiguration;publicstaticConnectionconnection;publicstaticAdminadmin;publicstaticvoidmain(String[]args)throwsIOException{init();createTable(student,newString[]{score});insertData(student,zhangsan,score,English,69);insertData(student,zhangsan,score,Math,86);insertData(student,zhangsan,score,Computer,77);getData(student,zhangsan,score,English);close();}// 建立连接publicstaticvoidinit(){configurationHBaseConfiguration.create();configuration.set(hbase.rootdir,hdfs://localhost:9000/hbase);try{connectionConnectionFactory.createConnection(configuration);adminconnection.getAdmin();}catch(IOExceptione){e.printStackTrace();}}// 关闭连接publicstaticvoidclose(){try{if(admin!null){admin.close();}if(null!connection){connection.close();}}catch(IOExceptione){e.printStackTrace();}}// 建表publicstaticvoidcreateTable(StringmyTableName,String[]colFamily)throwsIOException{TableNametableNameTableName.valueOf(myTableName);if(admin.tableExists(tableName)){System.out.println(talbe is exists!);}else{TableDescriptorBuildertableDescriptorTableDescriptorBuilder.newBuilder(tableName);for(Stringstr:colFamily){ColumnFamilyDescriptorfamilyColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();tableDescriptor.setColumnFamily(family);}admin.createTable(tableDescriptor.build());}}// 插入数据publicstaticvoidinsertData(StringtableName,StringrowKey,StringcolFamily,Stringcol,Stringval)throwsIOException{Tabletableconnection.getTable(TableName.valueOf(tableName));PutputnewPut(rowKey.getBytes());put.addColumn(colFamily.getBytes(),col.getBytes(),val.getBytes());table.put(put);table.close();}// 浏览数据publicstaticvoidgetData(StringtableName,StringrowKey,StringcolFamily,Stringcol)throwsIOException{Tabletableconnection.getTable(TableName.valueOf(tableName));GetgetnewGet(rowKey.getBytes());get.addColumn(colFamily.getBytes(),col.getBytes());Resultresulttable.get(get);System.out.println(newString(result.getValue(colFamily.getBytes(),colnull?null:col.getBytes())));table.close();}}小结本文介绍了 HBase 的安装配置要点、常用 Shell 命令及 Java API 应用实例。HBase 启动顺序为先启动 Hadoop再启动 HBase。单机版可使用自带 Zookeeper集群版建议独立部署。Shell 命令包括 create 建表、put 插入数据、scan 浏览、get 查询、enable/disable 和 drop 删除表等。Java API 部分以学生成绩表为例演示了建立连接、创建表、插入数据和浏览数据的完整代码实现。通过对比 Shell 命令与 Java API 的等效操作帮助理解 HBase 的编程接口使用方式。欢迎点赞 | 收藏⭐ | 评论✍ | 关注