一、实验目的
(1)理解四种数据库(MySQL、HBase、Redis和MongoDB)的概念以及不同点;
(2)熟练使用四种数据库操作常用的Shell命令;
(3)熟悉四种数据库操作常用的Java API。
二、实验平台
(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);
(2)Hadoop版本:3.1.3;
(3)MySQL版本:5.6;
(4)HBase版本:2.2.2;
(5)Redis版本:5.0.5;
(6)MongoDB版本:4.0.16;
(7)JDK版本:1.8;
(8)Java IDE:Eclipse;
三、实验内容
(一) MySQL数据库操作
(二)HBase数据库操作
(三)Redis数据库操作
(四)MongoDB数据库操作
四、实验过程、内容
更新资源包。
(1)MySQL版本:5.6;
1.安装MySQL
执行以下命令将mysql解压至“/usr/local/”目录下并重命名,并将目录的权限赋予hadoop用户:
安装MySQL:
查看MySQL的安装状态,以下表示成功安装:
2.密码查询及更改
若安装过程未设置密码或者设置了密码然后使用过程中忘记密码了,可以通过以下方式查询、修改密码。
首先使用以下命令查询当前的用户及密码,
- sudo cat /etc/mysql/debian.cnf
然后,输入mysql -u debian-sys-maint -p会提示输入密码,此处输入的密码就是上一步的结果图中绿框里的密码。
然后就可以修改密码了,mysql8.04以后的版本执行下述语句:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
修改完密码之后就可以使用下述语句进入mysql shell了
$ mysql -u root -p
该步执行后会提示你输入密码,输入你刚才更改的密码就可以进入mysql shell了。显示mysql>就证明可以使用mysql了。
(2)Redis版本:5.0.5;
访问Redis官网(http://www.redis.cn/)下载安装包redis-5.0.5.tar.gz
执行以下命令将Redis解压至“/usr/local/”目录下并重命名
然后,执行如下命令把redis目录的权限赋予hadoop用户:
接下来,进入“/usr/local/redis”目录,输入以下命令编译和安装Redis:
至此,Redis已经安装完成,现在可以执行如下命令开启Redis服务器:
然后,再新建一个终端,输入如下命令启动Redis客户端:
(3)MongoDB版本:4.0.16;
MongoDB既可以安装在Windows系统下使用,也可以安装在Linux系统下使用,这里采用Linux系统。MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。
但是,需要说明的是,如果直接使用“sudo apt-get install mongodb”命令进行安装,默认安装的版本是MongoDB 2.6.10。由于目前MongoDB已经升级到4.0.16,这里将通过添加软件源的方式来安装4.0.16版本。
首先,在Linux系统中打开一个终端,执行如下命令导入公共秘钥到包管理器中:
然后,创建MongoDB的文件列表,命令如下:
#对于Ubuntu18.04,使用如下命令:
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list
#对于Ubuntu16.04,使用如下命令:
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list
执行如下命令来更新包管理器:
最后,执行如下命令安装MongoDB:
安装完成后,在终端输入以下命令查看MongoDB版本:
注:如果能够输出版本信息(如图6-8所示),则表明安装成功。
默认设置下,MongoDB是随Ubuntu启动而自动启动的。可以输入以下命令查看是否启动成功:
进入mongo shell:
使用MongoDB结束后,关闭MongoDB的命令如下:
$ sudo service mongod stop
五、实验结果(运行结果截图)
(一) MySQL数据库操作
学生表如14-7所示。
表14-7 学生表Student
Name | English | Math | Computer |
zhangsan | 69 | 86 | 77 |
lisi | 55 | 100 | 88 |
根据上面给出的Student表,在MySQL数据库中完成如下操作:
- 在MySQL中创建Student表,并录入数据;
- 用SQL语句输出Student表中的所有记录;
- 查询zhangsan的Computer成绩;
(4)修改lisi的Math成绩,改为95。
根据上面已经设计出的Student表,使用MySQL的JAVA客户端编程实现以下操作:
(1)向Student表中添加如下所示的一条记录:
scofield | 45 | 89 | 100 |
(2)获取scofield的English成绩信息
(3)Student表,使用MySQL的JAVA客户端编程实现代码:
//--------Student.java-------//
public class Student {//创建一个Student实体类
private String Name;
private int English;
private int Math;
private int Computer;
public String getName() {
return Name;
}
public void setName(String Name) {
this.Name=Name;
}
public int getEnglish() {
return English;
}
public void setEnglish(int English) {
this.English=English;
}
public int getMath() {
return Math;
}
public void setMath(int Math) {
this.Math=Math;
}
public int getComputer() {
return Computer;
}
public void setComputer(int Computer) {
this.Computer=Computer;
}
public Student() {
}
public Student(String Name, int English, int Math, int Computer) {
super();
this.Name = Name;
this.English = English;
this.Math = Math;
this.Computer = Computer;
}
}
//--------DBUtil.java-------//
import java.sql.*;
public class DBUtil {
private static Connection conn;
public static Connection getConnection() throws SQLException {//获取到数据库demo的连接
if(null != conn) return conn;
try {
Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动(连接MySQL数据库)
}catch(ClassNotFoundException e) {
System.out.println(e.getMessage());
}
String url = "jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false";//数据库位于本机
conn = DriverManager.getConnection(url, "root", "123");
return conn;
}
public static void closeConnection() throws SQLException {
if(null != conn)
conn.close();
}
}
//--------StudentDAO.java-------//
package StudentConcenct;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.mysql.jdbc.Connection;
public class StudentDAO {
public List<Student> getAllStudents() throws SQLException {//查询所有的学生的信息
String sql = "SELECT * from Student";
Connection conn = (Connection) DBUtil.getConnection();//
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
List<Student> list = new ArrayList<Student>();
while(rs.next()) {
//int id = rs.getInt(1); //
String Name = rs.getString("Name");
int English = rs.getInt("English");
int Math = rs.getInt("Math");
int Computer = rs.getInt("Computer");
String str = String.format("Name:%s English:%d Math:%d Computer:%d",
Name, English, Math, Computer);
System.out.println(str);
Student stu = new Student();
stu.setName(Name);
stu.setEnglish(English);
stu.setMath(Math);
stu.setComputer(Computer);
list.add(stu);
}
return list;
}
public int insert(Student student) throws SQLException {//往数据库插入特定记录
String sql = "insert into Student values (?, ?, ?, ?)";
//System.out.println(sql);
Connection conn = (Connection) DBUtil.getConnection();//
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getEnglish());
pstmt.setInt(3, student.getMath());
pstmt.setInt(4, student.getComputer());
int cnt = pstmt.executeUpdate();
if(cnt<=0) {
System.out.println("插入记录不成功。");
}
else {
System.out.println("成功插入 "+cnt+" 条记录。");
}
return cnt;
}
public Student getStudentByName(String Name) throws SQLException{//根据姓名查询学生的English信息
String sql = "SELECT English from Student where name = '"+ Name +"' ";
Connection conn = (Connection) DBUtil.getConnection();//
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
int English = rs.getInt("English");
String str = String.format("English:%d",English );
System.out.println(str);
Student stu = new Student();
stu.setName(Name);
stu.setEnglish(English);
break;
}
return null;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StudentDAO dao = new StudentDAO();
try {
System.out.println("插入一条学生信息");
dao.insert(new Student("scofield",45,89,100));
System.out.printf("\n");
System.out.println("查询所有学生信息");
dao.getAllStudents();
System.out.println();
System.out.println("查找姓名为scofield的English成绩:");
dao.getStudentByName("scofield");
}
catch(SQLException e) {
e.printStackTrace();
}
finally {
try {
DBUtil.closeConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
(二)HBase数据库操作
学生表Student如表14-8所示。
表14-8 学生表Student
name | score | |||
English | Math | Computer | ||
zhangsan | 69 | 86 | 77 | |
lisi | 55 | 100 | 88 |
根据上面给出的学生表Student的信息,执行如下操作:
(1) 用Hbase Shell命令创建学生表Student;
create 'Student','score'
put 'Student','zhangsan','score:English','69'
put 'Student','zhangsan','score:Math','86'
put 'Student','zhangsan','score:Computer','77'
put 'Student','lisi','score:English','55'
put 'Student','lisi','score:Math','100'
put 'Student','lisi','score:Computer','88'
(2)用scan命令浏览Student表的相关信息;
(3)查询zhangsan的Computer成绩;
(4)修改lisi的Math成绩,改为95。
2.根据上面已经设计出的Student表,用HBase API编程实现以下操作:
(1)添加数据:English:45 Math:89 Computer:100
scofield | 45 | 89 | 100 |
(2)获取scofield的English成绩信息。
(3)Student表,使用Hbase的JAVA客户端编程实现代码:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
public class StudentOperation {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static void main(String[] args)throws IOException{
init();
insertData("Student","scofield","score","English","69");
insertData("Student","scofield","score","Math","8");
insertData("Student","scofield","score","Computer","");
getData("Student", "scofield", "score","English");
close();
}
public static void init(){
configuration = HBaseConfiguration.create();
configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");
try{
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
}catch (IOException e){
e.printStackTrace();
}
}
public static void close(){
try{
if(admin != null){
admin.close();
}
if(null != connection){
connection.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
public static void insertData(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(rowKey.getBytes());
put.addColumn(colFamily.getBytes(),col.getBytes(), val.getBytes());
table.put(put);
table.close();
}
public static void getData(String tableName,String rowKey,String colFamily, String col)throws IOException{
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(rowKey.getBytes());
get.addColumn(colFamily.getBytes(),col.getBytes());
Result result = table.get(get);
System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));
table.close();
}
}
(三)Redis数据库操作
Student键值对如下:
zhangsan:{ English: 69 Math: 86 Computer: 77 } lisi:{ English: 55 Math: 100 Computer: 88 } |
1. 根据上面给出的键值对,完成如下操作:
(1)用Redis的哈希结构设计出学生表Student(键值可以用student.zhangsan和student.lisi来表示两个键值属于同一个表);
hset Student.zhangsan English 69
hset Student.zhangsan Math 86
hset Student.zhangsan Computer 77
hset Student.lisi English 55
hset Student.lisi Math 100
hset Student.lisi Computer 88
(2)用hgetall命令分别输出zhangsan和lisi的成绩信息;
(3)用hget命令查询zhangsan的Computer成绩;
(4)修改lisi的Math成绩,改为95。
2.根据上面已经设计出的学生表Student,用Redis的JAVA客户端编程(jedis),实现如下操作:
(1)添加数据:English:45 Math:89 Computer:100
该数据对应的键值对形式如下:
scofield:{ English: 45 Math: 89 Computer: 100 } |
(2)获取scofield的English成绩信息
(3)Student表,使用Hbase的JAVA客户端编程实现代码:
package StudentConn;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class RedisTest {
public static Jedis jedis;
public static void main(String[] args) {
// TODO Auto-generated method stub
jedis = new Jedis("localhost");
//插入数据
test1();
//查询数据a
test2();
}
public static void test1() {
// TODO Auto-generated method stub
jedis.hset("student.scofield", "English","45");
jedis.hset("student.scofield", "Math","89");
jedis.hset("student.scofield", "Computer","100");
Map<String,String> value = jedis.hgetAll("student.scofield");
for(Map.Entry<String, String> entry:value.entrySet())
{
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
public static void test2() {
// TODO Auto-generated method stub
String value=jedis.hget("student.scofield", "English");
System.out.println("scofield's English score is: "+value);
}
}
(四)MongoDB数据库操作
Student文档如下:
{ “name”: “zhangsan”, “score”: { “English”: 69, “Math”: 86, “Computer”: 77 } } { “name”: “lisi”, “score”: { “English”: 55, “Math”: 100, “Computer”: 88 } } |
1.根据上面给出的文档,完成如下操作:
(1)用MongoDB Shell设计出student集合;
切换到Student集合:
插入数据:
(2)用find()方法输出两个学生的信息;
(3)用find()方法查询zhangsan的所有成绩(只显示score列);
(4)修改lisi的Math成绩,改为95。
2.根据上面已经设计出的Student集合,用MongoDB的Java客户端编程,实现如下操作:
(1)添加数据:English:45 Math:89 Computer:100
与上述数据对应的文档形式如下:
{ “name”: “scofield”, “score”: { “English”: 45, “Math”: 89, “Computer”: 100 } } |
(2)获取scofield的所有成绩成绩信息(只显示score列)
(3)Student表,使用Hbase的JAVA客户端编程实现代码:
package StudentConn;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCursor;
public class mongoTest {
/**
* @param args
*/
public static MongoClient mongoClient;
public static MongoDatabase mongoDatabase;
public static MongoCollection<Document> collection;
public static void main(String[] args) {
// TODO Auto-generated method stub
init();
//插入数据
test1();
//查询数据
test2();
}
public static void test1() {
// TODO Auto-generated method stub
//实例化一个文档,内嵌一个子文档
Document document=new Document("name","scofield").
append("score", new Document("English",45).
append("Math", 89).
append("Computer", 100));
List<Document> documents = new ArrayList<Document>();
documents.add(document);
//将文档插入集合中
collection.insertMany(documents);
System.out.println("文档插入成功");
}
public static void test2() {
// TODO Auto-generated method stub
//进行数据查找,查询条件为name=scofield, 对获取的结果集只显示score这个域
MongoCursor<Document> cursor=collection.find( new Document("name","scofield")).
projection(new Document("score",1).append("_id", 0)).iterator();
while(cursor.hasNext())
System.out.println(cursor.next().toJson());
}
public static void init() {
// TODO Auto-generated method stub
//实例化一个mongo客户端
mongoClient=new MongoClient("localhost",27017);
//实例化一个mongo数据库
mongoDatabase = mongoClient.getDatabase("Student");
//获取数据库中某个集合
collection = mongoDatabase.getCollection("Student");
}
}
六、实验心得和总结
(列出遇到的问题和解决办法,列出没有解决的问题,可以是个人相关知识点总结,要求150字以上)
问题一:运行Student表,使用Redis的JAVA客户端编程实现代码时,出现:
解决方法:出现这种情况很有可能时你在连接时没有开启redis服务,执行如下命令开启redis服务:
然后再开启一个终端执行实现代码。
如果确保已经开启了 redis服务,仍然报出上述错误,可以考虑修改redis配置文件redis.conf,
或者关闭防火墙等。