一、NoSQL和关系数据库的操作比较实验的目的
(1)熟练掌握linux相关指令,完成大数据实验报告四。
(2)理解四种数据库(MySQL、HBase、Redis 和 MongoDB)的概念以及不同点;
(3)熟练使用四种数据库操作常用的 Shell 命令;
(4)熟悉四种数据库操作常用的 Java API。
二、实验平台
(1) 操作系统:Linux(Ubuntu 22.04);
(2) 虚拟机:VMware17 pro
(3) Hadoop 版本:3.1.3;
(4) HBase 版本:2.2.2;
(5) MySQL 版本:8.0;
(6) Redis 版本:7.0;
(7) MongoDB 版本:6.0;
(8) JDK 版本:1.8;
(9) Java IDE:Eclipse2023;
三、实验步骤之安装教程
1、安装MySQL 8.0
(1) 使用以下命令即可进行mysql安装,注意安装前先更新一下软件源以获得最新版本:
sudo apt update sudo apt install mysql-server mysql-client
(2) 安装完成后,root 的密码是 空密码,可以直接用命令登陆mysql -uroot不需要输入密码
sudo mysql -uroot
(3) 还需要安装MySQL C API 的开发包,它包含了 MySQL 客户端库和头文件,可以用于开发与 MySQL 数据库交互的应用程序。
sudo apt-get install libmysqlclient-dev
(4) 启动和关闭mysql服务器:
service mysql start service mysql stop
(5) 确认是否启动成功,mysql节点处于LISTEN状态表示启动成功:
sudo netstat -tap | grep mysql
(6) 显示 MySQL 服务的当前状态,包括服务是否正在运行,服务的主进程 ID(PID),服务使用的 CPU 和内存等信息。
systemctl status mysql.service
(7) 重新设置用户密码,如我把密码设为 qxzqxzha
alter user 'root'@'localhost' identified with mysql_native_password by 'qxzqxzha'
(8) 进入mysql shell界面
mysql -u root -p
(9) 查看你的端口号是否是3306 如果是0的话,就出错了,解决办法须自行百度,或者从卸载MySQL重新开始。
show variables like 'port'
2、安装Redis 7.0
(1) 访问Redis官网下载地址(点击此处跳转)下载安装包redis-7.0.11.tar.gz,并使用VMware Tools或xshell等工具把安装包传入虚拟机中,执行以下命令将Redis解压至“/usr/local/”目录下。
sudo tar -zxvf ./Desktop/redis-7.0.11.tar.gz -C /usr/local
(2) 把工作目录重命名为redis, 然后,执行如下命令把redis目录的权限赋予hadoop用户:
cd /usr/local sudo mv ./redis-7.0.11 ./redis sudo chown -R hadoop:hadoop ./redis
(3) 接下来,进入“/usr/local/redis”目录,输入以下命令编译和安装Redis:
cd /usr/local/redis sudo make install
(4) 至此,Redis已经安装完成,现在可以执行如下命令开启Redis服务器:
./src/redis-server
(5)然后,再新建一个终端,输入如下命令启动Redis客户端。
./src/redis-cli
客户端连上服务器之后,会显示“127.0.0.1:6379”的命令提示符信息,表示服务器的IP地址为127.0.0.1,端口为6379。现在可以执行简单的操作,比如,设置键为”hello”,值为”world”,并且取出键为”hello”时对应的值。
3、安装MongoDB 6.0
(1) 首先需要安装curl工具,在Ubuntu系统中新建一个终端,执行如下命令:
sudo apt install curl
(2) 然后,导入MongoDB6.0版的公钥并检查公钥是否导入成功,具体命令如下:
curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
若这一步无法运行成功,可以改用wget
wget -q0 - https://www.mongodb.org/static/pgp/server-6.0.asc | gpg --dearmor | sudo tee /usr/share/keyrings/mongodb-archive-keyring.gpg >/dev/null
(3) 向APT导入MongoDB6.0版软件包的资源链接,具体命令如下
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mongodb-archive-keyring.gpg] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
(4) 更新apt资源库
sudo apt-get update
(5) 安装MongoDB前一定要先安装MongoDB的依赖libssl1.1
curl -L0 http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-1ubuntu2.1~18.04.21_amd64.deb
sudo dpkg -i libssl1.1_1.1.1-1ubuntu2.1~18.04.21_amd64.deb
(6) 执行如下命令开始安装MongDB:
sudo apt-get install -y mongodb-org
(7) 启动MongoDB服务并检查MongoDB服务状态:
sudo systemctl start mongod sudo systemctl status mongod
(8) 设置服务开机自启动:
sudo systemctl enable mongod
(9) 按’q’或者再新建一个终端窗口,执行如下命令进入MongDB Shell交互式执行环境
mongosh
(10) MongoDB安装完成后,可以通过此命令来查看是否已经启动
pgrep mongod -l
4、安装Hbase 2.2.2
可以参考厦门大学实验室的教程 (点击此处跳转)
四、实验步骤之连接Eclipse
(一) MySQL 数据库操作
Student 表如表 A-4 所示。
1.根据上面给出的 Student 表,在 MySQL 数据库中完成如下操作:登录MySQL并创建数据库
sudo service mysql start sudo mysql -u root -p
(1) 在 MySQL 中创建 Student 表,并录入数据;
(2) 用 SQL 语句输出 Student 表中的所有记录;
(3) 查询 zhangsan 的 Computer 成绩;
(4) 修改 lisi 的 Math 成绩,改为 95;
2.根据上面已经设计出的 Student 表,使用 MySQL 的 JAVA 客户端编程实现以下操作:
(1)向 Student 表中添加如下所示的一条记录:
Step1: 访问官网下载地址 (点击此处跳转) 下载好mysql-connector-java-8.0.30.jar,传入虚拟机中。
Step2: 新建项目,导入jar包
Step3: 详细代码(由于 MySQL 8.0 默认使用了 Caching SHA-2 加密密码,需要使用 SSL 加密通道连接才能正确处理。在连接 MySQL 8.0 数据库时,需要在连接字符串中添加一个参数 allowPublicKeyRetrieval=true,以允许公钥检索。)
package mysqlExample;
import java.sql.*;
public class mysqlTest {
//JDBC DRIVER and DB
static final String DRIVER="com.mysql.cj.jdbc.Driver";
static final String DB="jdbc:mysql://localhost:3306/database_qxz?allowPublicKeyRetrieval=true&useSSL=false";
// String url = "jdbc:mysql://localhost:3306/mydatabase?allowPublicKeyRetrieval=true&useSSL=false";
//Database auth
static final String USER="root";
static final String PASSWD="qxzqxzha";
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
// 加载驱动程序
Class.forName(DRIVER);
System.out.println("Connecting to a selected database...");
// 打开一个连接
conn=DriverManager.getConnection(DB, USER, PASSWD);
// 执行一个插入
stmt=conn.createStatement();
String sql="insert into student values('scofield',45,89,100)";
stmt.executeUpdate(sql);
System.out.println("Inserting records into the table successfully!");
// 执行一个查询
stmt=conn.createStatement();
sql="select name,English from student where name='scofield' ";
// 获得结果集
rs=stmt.executeQuery(sql);
System.out.println("name"+"\t\t"+"English");
while(rs.next())
{
System.out.print(rs.getString(1)+"\t\t");
System.out.println(rs.getInt(2));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(stmt!=null)
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
代码运行前:
代码运行结果:
代码运行后:
(2) 获取 scofield 的 English 成绩信息
(二) HBase 数据库操作
Student 表如表 A-5 所示。
1.根据上面给出的学生表 Student 的信息,执行如下操作:
启动hadoop和hbase:
(1) 用 Hbase Shell 命令创建学生表 Student
注:若做过上一章的实验,需要把之前创建的student表删除掉,使用如下命令:
(2) 用 scan 指令浏览 Student 表的相关信息
(3) 查询 zhangsan 的 Computer 成绩
(4) 修改 lisi 的 Math 成绩,改为 95
2.根据上面已经设计出的 Student 表,用 HBase API 编程实现以下操作:
(1)添加数据:
Step1:新建项目,导入jar包
启动Eclipse,启动以后,出现如下图所示界面,点击界面右下角“Launch按钮。启动进入Eclipse以后的程序开发界面,点击界面顶部的“File”菜单,在弹出的子菜单(如下图所示)中选择“New”,再选择子菜单中的“Java Project”。这时会弹出一个Java工程创建对话框(如下图所示),在“Project name”文本框中输入“HBaseExample”,在“JRE”选项卡中选中第2项“Use a project specific JRE”,然后点击界面底部的“Next”按钮。在弹出的界面中(如下图所示),用鼠标点击“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮。
在弹出的“JAR Selection”界面中(如下图所示),进入到“/usr/local/hbase/lib”目录,选中该目录下的所有jar文件(注意,不要选中client-facing-thirdparty、ruby、shaded-clients和zkcli这四个目录),然后,点击界面底部的“OK”按钮。
然后,在“JAR Selection”界面中(如下图所示),点击进入到“client-facing-thirdparty”目录下。在“client-facing-thirdparty”目录下(如下图所示),选中所有jar文件,再点击界面底部的“OK”按钮。
Step2: 输入代码
package testhbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Get;
public class hbaseTest {
public static Configuration configuration;
public static Connection connection;
public static Admin admin;
public static void main(String[] args)throws IOException{
init();
createTable("student",new String[]{"score"});
insertData("student","scofield","score","English","45");
insertData("student","scofield","score","Math","89");
insertData("student","scofield","score","Computer","100");
// 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 createTable(String myTableName,String[] colFamily) throws IOException {
TableName tableName = TableName.valueOf(myTableName);
if(admin.tableExists(tableName)){
System.out.println("talbe is exists!");
}else {
TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
for(String str:colFamily){
ColumnFamilyDescriptor family =
ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();
tableDescriptor.setColumnFamily(family);
}
admin.createTable(tableDescriptor.build());
}
}
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();
}
}
代码运行前:
代码运行结果:
代码运行后:
(2)获取 scofield 的 English 成绩信息
(三)Redis 数据库操作
student键值对如下:
zhangsan:{ English:69 ; Math:86 ; Computer:88} lisi:{ English:55 ; Math:100 ; Computer:88}
1.根据上面给出的键值对,完成如下操作:
启动redis
(1) 用 Redis 的哈希结构设计出学生表 Student(键值可以用 student.zhangsan 和student.lisi 来表示两个键值属于同一个表);
(2) 用 hgetall 命令分别输出 zhangsan 和 lisi 的成绩信息;
(3) 用 hget 命令查询 zhangsan 的 Computer 成绩;
(4) 修改 lisi 的 Math 成绩,改为 95。
2.根据上面已经设计出的学生表 Student,用 Redis 的 JAVA 客户端编程(jedis),实现如下操作:
(1) 添加数据:scofield:{English: 69 ; Math: 86 ; Computer: 77}
Step1:下载slf4j-simple-1.7.30.jar(点击此处下载)和slf4j-api-1.7.30.jar(点击此处下载),和jedis-3.7.0.jar(点击此处下载)并传入虚拟机。
Step2:新建项目,导入jar包
Step3:输入代码
package redisExample;
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();
//查询数据
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);
}
}
代码运行截图:
代码运行结果:
(2) 获取 scofield 的 English 成绩信息
(四)MongoDB 数据库操作
student文档如下:
zhangsan:{ English:69 ; Math:86 ; Computer:88} lisi:{ English:55 ; Math:100 ; Computer:88}
1.根据上面给出的文档,完成如下操作:
启动MongoDB
(1) 用 MongoDB Shell 设计出student 集合;
(2) 用 find()方法输出两个学生的信息;
(3) 用 find 函数查询 zhangsan 的所有成绩(只显示 score 列)
(4) 修改 lisi 的 Math 成绩,改为 95。
2.根据上面已经设计出的 Student 集合,用 MongoDB 的 Java 客户端编程,实现如下操作:
(1)添加数据:English:45 Math:89 Computer:100
与上述数据对应的文档形式如下:
Step1:下载mongo-java-driver-3.8.2.jar(点击此处下载),并传入虚拟机
Step2: 新建项目,导入jar包
Step3: 输入代码
package mongoExample;
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 {
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");
}
}
代码运行前:
代码运行截图:
代码运行后:
(2) 获取 scofield 的所有成绩成绩信息(只显示score)
厉害了,很不错哦!
不错,大数据专业的吧
软工
棒(●’◡’●)
很详细,感谢
谢谢支持☺️