- 实验目的
- 熟悉HBase操作常用的shell 命令和Java API使用;
- 实验要求
- 掌握HBase的基本操作命令和函数接口的使用;
- 实验平台
- 操作系统:Linux(建议Ubuntu16.04或者CentOS 7 以上);
- Hadoop版本:3.1.3;
- HBase版本:2.2.2;
- JDK版本:1.8;
- Java IDE:Eclipse。
- 实验内容、结果及分析(直接在题目后面列出实验结果以及分析,各个小题的代码以截图方式呈现并标注重点代码,包含java代码运行成功截图)
(实验代码参考网址:HBase2.2.2安装和编程实践指南_厦大数据库实验室博客)
- 编写Java代码完成下列题目(参考课件例子)
- 设计Book表(表格形式),包含basicInfo和SaleInfo两个列族,每一个列族中自定义列限定符(至少3个),自定义数据信息;
BOOK表设计
列族名称 | 列限定符 | 数据类型 | 描述 |
basicInfo | title | String | 书籍标题 |
basicInfo | author | String | 作者 |
basicInfo | publish_date | Date | 出版日期 |
SaleInfo | price | Double | 价格 |
SaleInfo | quantity | Integer | 库存数量 |
SaleInfo | sold | Integer | 销售数量 |
- 然后编写Java代码创建Book表,并在HBase shell中验证创建成功;
运行结果:
在HBase shell中验证创建成功:
- 编写程序插入自定义的数据信息;
运行结果:
- 编写程序获取指定列的数据并打印输出;
运行结果:
- 现有以下关系型数据库中的三个表的数据,要求:
学生表(Student)
学号(S_No) | 姓名(S_Name) | 性别(S_Sex) | 年龄(S_Age) |
2015001 | Zhangsan | male | 23 |
2015002 | Mary | female | 22 |
2015003 | Lisi | male | 24 |
课程表(Course)
课程号(C_No) | 课程名(C_Name) | 学分(C_Credit) |
123001 | Math | 2.0 |
123002 | Computer Science | 5.0 |
123003 | English | 3.0 |
选课表(SC)
学号(SC_Sno) | 课程号(SC_Cno) | 成绩(SC_Score) |
2015001 | 123001 | 86 |
2015001 | 123003 | 69 |
2015002 | 123002 | 77 |
2015002 | 123003 | 99 |
2015003 | 123001 | 98 |
2015003 | 123002 | 95 |
- 将其转换为适合于HBase存储的表,利用表格的方式绘制其存储的概念视图;
HBase表设计
列族名称 | 列限定符 | 数据类型 | 描述 |
StudentInfo | S_No | String | 学号 |
StudentInfo | S_Name | String | 姓名 |
StudentInfo | S_Sex | String | 性别 |
StudentInfo | S_Age | Integer | 年龄 |
CourseInfo | C_No | String | 课程号 |
CourseInfo | C_Name | String | 课程 |
CourseInfo | C_Credit | Double | 学分 |
SC | SC_Sno | String | 学号 |
SC | SC_Cno | String | 课程号 |
SC | SC_Score | Integer | 成绩 |
- 实现createTable(String tableName, String[] cfs)函数:创建表,参数tableName为表的名称,字符串数组cfs为存储记录各个列族名称的数组。要求当HBase中已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表;
相关代码:
执行结果:
验证:
- 实现addRow(String tableName, String row, String[] fields, String[] values),向表tableName中的行row(可以用学生姓名S_No表示)、指定列中添加数据;fields表示插入的数据记录对应的列名集合,其中每一个元素形式为”列族名:列限定符”;
- 使用上面定义的两个函数实现表的创建以及数据的添加,请思考如何实现多条数据记录的快速添加?使用尽可能少量的代码实现;
- 在hbase shell中验证4)中数据添加的结果;
- 设计modifyData(String tableName, String row, String filed, String val)函数实现指定数据的修改,其中filed形式为”列族名:列限定符”;调用该函数,将2015002 同学的S_Name和Computer Science分数分别修改为你的姓名和学号的后两位;
- 定义scanRow(String tableName, String row, String[] fields),查看指定列中的数据内容,并将查找的结果按下下列形式打印输出“row filed1,val1 filed2,val2 …”;其中fields表示插入的数据记录对应的列名,其中每一个元素形式为”列族名:列限定符”;调用该函数验证7)中数据是否修改成功;
运行结果
- 定义deleteRow(String tableName, String row)函数,删除指定行键对应的数据记录,并调用该函数删除2015001相应的数据记录,并验证删除成功;
验证:
- 总结HBase使用过程中的优缺点
优点:
- 大规模数据支持:HBase设计用于处理大量的数据,非常适合需要扩展到数千台服务器的大数据应用。
- 高性能:HBase提供实时读写访问,因为它存储数据在内存中,所以访问速度非常快。
- 列族式存储:数据按照列族进行存储,便于数据的分组和权限管理。
- 易于横向扩展:可以通过增加更多的服务器来扩展系统,而不需要停机。
- 高可用性:HBase运行在Hadoop生态系统之上,可以利用Hadoop的高可用性特性。
缺点:
- 学习曲线陡峭:对于新手来说,HBase的概念和API可能比较复杂,需要一定的时间来学习和理解。
- 有限的查询能力:HBase不支持传统的SQL查询,对于复杂的查询操作不太友好。
- 维护成本:HBase集群可能需要专业的维护团队来管理,尤其是在大规模部署时。
- 数据模型限制:HBase最适合稀疏表和多维数据模型,对于需要复杂事务处理的应用可能不太适合。
- 生态系统集成:与其他数据系统集成可能需要额外的工作,例如与实时处理系统或OLAP引擎的集成。
- 实验小结(问题和收获)
问题:最初接触HBase时,它的数据模型和API让我感到困惑,尤其是列族和列限定符的概念。配置HBase集群需要对Hadoop生态系统有深入的了解,配置过程中遇到了不少问题。在实验过程中,我发现自己需要学习如何优化HBase的性能,包括内存管理、预分区和压缩策略等。在进行数据操作时,我遇到了一些错误,例如尝试删除一个不存在的行,或者在错误的列族中插入数据。
收获:
通过这次实验,我获得了使用HBase进行数据存储和查询的实际经验。更好地理解了NoSQL数据库的概念,以及它们与传统关系型数据库的区别。学会了如何设计适合HBase的数据模型,以及如何有效地存储和检索数据。在解决实验中遇到的问题时,我提高了自己的问题解决能力,学会了查阅文档和社区资源。我对Hadoop生态系统有了更全面的认识,了解了HBase在大数据处理中的作用。