目录
一.数据库的部署与配置
二.使用命令访问数据库
三.数据库的设计
四.编程实现数据库的访问
一.数据库的部署与配置
1.在单个节点上对进行数据库的单机部署
(1)下载apache-cassandra-4.1.7-bin.tar.gz,上传到hadoop1 的/export/software目录
(2)使用解压缩命令:tar -xzf /export/software/apache-cassandra-4.1.7-bin.tar.gz -C /export/servers/ 进行解压缩到/export/servers目录
(3)使用cd /export/servers命令进入/export/servers目录
(4)将Cassandra目录进行重命名:mv apache-cassandra-4.1.7 apache-cassandra-4.1.7-standalone
(5)启动Cassandra:bin/cassandra -R
(6)查看Cassandra启动信息:tail -f logs/system.log
(7)检查状态:bin/nodetool status
(8)连接数据库:bin/cqlsh
(9)关闭Cassandra:bin/nodetool stopdaemon
2.在多个节点上实现数据库的分布式部署
(1)在Hadoop1、Hadoop2和Hadoop3上分别执行systemctl stop firewalld和systemctldisable firewalld命令关闭防火墙;
(2)在Hadoop1、Hadoop2、Hadoop3上分别执行ssh-keygen,ssh-copy-id hadoop1,ssh-copy-id hadoop2,ssh-copy-id hadoop3,使各个节点可以免密登录
注:在Hadoop2和Hadoop3上的执行结果与Hadoop1几乎相同,故不再展示。
(3)进行免密登录测试,在Hadoop1、Hadoop2和Hadoop3上分别执行ssh hadoop1,ssh hadoop2,ssh hadoop3,可以免密登录即可
注:在Hadoop2和Hadoop3上的执行结果与Hadoop1几乎相同,故不再展示。
(4)在Hadoop1、Hadoop2和Hadoop3上分别上传压缩安装包
(5)在Hadoop1、Hadoop2和Hadoop3上分别解压缩apache-cassandra-4.1.7-bin.tar.gz:tar -xzf /export/software/apache-cassandra-4.1.7-bin.tar.gz -C /export/servers/
(6)分别修改Hadoop1、Hadoop2和Hadoop3的cassandra.yaml文件中的seeds、listen_address和rpc_address,具体修改如下:
Hadoop1:seeds=192.168.121.160,listen_address=192.168.121.160,rpc_address=192.168.121.160;
Hadoop1:seeds=192.168.121.160,listen_address=192.168.121.161,rpc_address=192.168.121.161;
Hadoop1:seeds=192.168.121.160,listen_address=192.168.121.162,rpc_address=192.168.121.162
注:因修改过程类似,此处只展示Hadoop1节点上的修改结果。
(7)在Hadoop1、Hadoop2和Hadoop3上使用命令分别启动Cassandra:
bin/cassandra -R
(8)查看运行状态:bin/nodetool status
(9)连接任一服务器均可:bin/cqlsh hadoop1,bin/cqlsh hadoop2,bin/cqlsh hadoop3
二.使用命令访问数据库
练习Cassandra的相关命令。
1.键空间:创建、删除和查看键空间
(1)创建并查看键空间
CREATE KEYSPACE IF NOT EXISTS library_system
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};
DESCRIBE KEYSPACES;
(2)删除并再次查看键空间
DROP KEYSPACE IF EXISTS library_system;
DESCRIBE KEYSPACES;
2.表:创建表、设置复合型主键、修改表结构(要求:复合主键要包括分区键和分簇键,数据类型要包含两种以上的集合类型和一种以上的自定义类型)
以图书管理系统为例进行如下操作:
(1)创建表(包含复合型主键)
在图书管理系统中,我们设计一个图书借阅记录表,复合主键由 book_id 和 borrower_id 组成,分区键使用 book_id,集群键使用 borrower_id。还使用了集合类型(SET)存储借阅的日期,以及自定义类型(user_info)来存储借阅人的信息。
语句如下:
CREATE TYPE IF NOT EXISTS library_system.user_info (
name TEXT,
email TEXT,
phone_number TEXT
);
CREATE TABLE IF NOT EXISTS library_system.book_borrowing (
book_id UUID, -- 分区键
borrower_id UUID, -- 集群键
borrow_date DATE, -- 借阅日期
return_date DATE, -- 归还日期
status TEXT, -- 状态(如 已借出、已归还)
tags SET<TEXT>, -- 标签(如 热门、推荐等)
borrower_info FROZEN<user_info>, -- 自定义类型,借阅人信息
PRIMARY KEY (book_id, borrower_id) -- 复合主键
);
其中,book_id是分区键,borrower_id 是集群键,tags 是集合类型,用来存储书籍标签,borrower_info 是自定义类型 user_info,用于存储借阅人的信息。
(2)修改表结构
添加一个新列来记录图书的借阅次数。
语句如下:
ALTER TABLE library_system.book_borrowing ADD borrow_count INT;
3.数据查询
(1)查询所有数据
SELECT * FROM library_system.book_borrowing;
(2)根据分区键查询
SELECT * FROM library_system.book_borrowing WHERE book_id = 3796171a-9a3d-45e6-8886-42601fed5c04;
(3)根据分区键和集群键查询
SELECT * FROM library_system.book_borrowing WHERE book_id = b8cdcddb-4b1e-4937-83cd-dbfbf5288671 AND borrower_id = b36f25ca-082c-4ded-afc9-6675eda47cd4;
(4)查询特定列
SELECT book_id, borrow_date, return_date FROM library_system.book_borrowing WHERE book_id = b8cdcddb-4b1e-4937-83cd-dbfbf5288671 AND borrower_id = b36f25ca-082c-4ded-afc9-6675eda47cd4;
(5)查询集合类型数据
SELECT tags FROM library_system.book_borrowing WHERE book_id = b8cdcddb-4b1e-4937-83cd-dbfbf5288671 AND borrower_id = b36f25ca-082c-4ded-afc9-6675eda47cd4;
(6)查询自定义类型数据
SELECT borrower_info FROM library_system.book_borrowing WHERE book_id = b8cdcddb-4b1e-4937-83cd-dbfbf5288671 AND borrower_id = b36f25ca-082c-4ded-afc9-6675eda47cd4;
4.数据更新:数据插入、数据更新、数据删除
(1)数据插入
INSERT INTO library_system.book_borrowing (book_id, borrower_id, borrow_date, return_date, status, tags, borrower_info)
VALUES (uuid(), uuid(), '2024-01-01', '2024-01-15', 'Borrowed', {'Popular', 'New Release'},
{name: 'John Doe', email: 'johndoe@example.com', phone_number: '1234567890'});
(2)数据更新
UPDATE library_system.book_borrowing
SET return_date = '2024-01-20', status = 'Returned'
WHERE book_id = b8cdcddb-4b1e-4937-83cd-dbfbf5288671 AND borrower_id = b36f25ca-082c-4ded-afc9-6675eda47cd4;
(3)数据删除
①删除单条数据
DELETE FROM library_system.book_borrowing
WHERE book_id = b8cdcddb-4b1e-4937-83cd-dbfbf5288671 AND borrower_id = b36f25ca-082c-4ded-afc9-6675eda47cd4;
②删除整张表
TRUNCATE library_system.book_borrowing;
三.数据库的设计
图书管理系统包含三个主要实体:图书、读者和借阅记录。它们之间通过一个关系来进行联系,借阅记录表示图书与读者之间的借阅关系,本系统共设计三张表,分别是图书表(存储图书的相关信息)、借阅记录表(存储借阅的记录)和读者表(存储读者的基本信息)。
1.数据库设计
(1)图书表
表名:Books
列族(Column Families):
info:存储图书的基本信息
author:存储作者的详细信息
publisher:存储出版商的信息
行键设计:
行键:book_id(唯一标识每本图书)
列名与存储内容:
在info列族下:
title:书名
category:类别(如科幻、文学等)
published_date:出版日期
在author列族下:
name:作者名称
birth_date:作者出生日期
在publisher列族下:
publisher_name:出版商名称
publisher_address:出版商地址
(2)读者表
表名:Readers
列族(Column Families):
info:存储读者的基本信息
contact:存储读者的联系信息(例如地址、电话)
行键设计:
行键:reader_id(唯一标识每个读者)
列名与存储内容:
在info列族下:
reader_name:读者姓名
dob:出生日期
在contact列族下:
email:电子邮件地址
phone_number:电话号
address:家庭住址
(3)借阅记录表
表名:BorrowRecords
列族(Column Families):
info:存储借阅信息
reader:存储读者信息
行键设计:
行键:borrow_id(唯一标识每次借阅记录)
列名与存储内容:
在info列族下:
book_id:借阅的图书ID
borrow_date:借阅日期
return_date:归还日期
在reader列族下:
reader_name:读者姓名
reader_id:读者ID
(4)实体和关系的增删改查
①新增操作
新增图书:向Books表中插入新的行,包含图书ID(行键)及其对应的列族和列名。
新增借阅记录:向BorrowRecords表中插入新的行,包含借阅记录ID(行键)、借阅图书ID、借阅日期、归还日期、读者信息等。
新增读者:向Readers表中插入新的行,包含读者ID(行键)、姓名、出生日期、联系信息等。
②删除操作
删除图书:通过图书ID删除Books表中的记录。
删除借阅记录:通过借阅记录ID删除BorrowRecords表中的记录。
删除读者:通过读者ID删除Readers表中的记录。
③更新操作
更新图书信息:可以根据图书ID(行键)来更新Books表中的某些列,比如更新书名、作者或出版日期等。
更新借阅记录:可以根据借阅记录ID(行键)来更新借阅日期或归还日期等。
更新读者信息:可以根据读者ID(行键)来更新Readers表中的读者姓名、地址、电话等。
④查询操作
查询某本图书的详细信息:通过book_id查询Books表中的详细信息。
查询某本图书的借阅记录:通过book_id在BorrowRecords表中查找所有借阅记录。
查询某位读者的借阅记录:通过reader_id在BorrowRecords表中查找该读者的所有借阅记录。
查询某位读者的详细信息:通过reader_id查询Readers表中的详细信息。
2.表设计与填充数据
(1)图书表
行键(book_id) | 列族 | 列名 | 列值 |
B001 | info | title | 《活着》 |
category | 文学 | ||
published_date | 1993-06-01 | ||
author | name | 余华 | |
birth_date | 1960-04-03 | ||
publisher | publisher_name | 作家出版社 | |
publisher_address | 北京市朝阳区 | ||
B002 | info | title | 《百年孤独》 |
category | 小说 | ||
published_date | 1967-06-05 | ||
author | name | 加西亚·马尔克斯 | |
birth_date | 1927-03-06 | ||
publisher | publisher_name | 南海出版公司 | |
publisher_address | 上海市徐汇区 |
(2)读者表
行键(reader_id) | 列族 | 列名 | 列值 |
R001 | info | reader_name | 张三 |
dob | 1990-05-15 | ||
contract | | zhsan@email.com | |
phone_number | 123-4567-8901 | ||
address | 北京市海淀区 | ||
R002 | info | reader_name | 李四 |
dob | 2005-02-28 | ||
contract | | lisi@email.com | |
phone_number | 987-6543-2100 | ||
address | 上海市浦东新区 |
(3)借阅记录表
行键(borrow_id) | 列族 | 列名 | 列值 |
BR001 | info | Book_id | B001 |
Borrow_date | 2024-11-01 | ||
Return_date | 2024-11-15 | ||
reader | Reader_name | 张三 | |
Reader_id | R001 | ||
BR001 | info | Book_id | B002 |
Borrow_date | 2024-11-02 | ||
Return_date | 2024-11-20 | ||
reader | Reader_name | 李四 | |
Reader_id | R002 |
四.编程实现数据库的访问
使用Python访问实现设计的图书管理系统的列式数据库,步骤如下:
(1)数据库连接:连接到Cassandra集群,并创建数据库library和数据表Books、Readers和BorrowRecords,具体代码如下:
from cassandra.cluster import Cluster
# 连接到 Cassandra 集群
cluster = Cluster(['192.168.121.160']) 虚拟机的 IP 地址
session = cluster.connect()
# 创建 Keyspace:library
session.execute("""
CREATE KEYSPACE IF NOT EXISTS library WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}
""")
# 使用创建的 Keyspace
session.execute("USE library")
# 创建表结构
# 创建 Books 表
session.execute("""
CREATE TABLE IF NOT EXISTS Books (
book_id TEXT PRIMARY KEY,
title TEXT,
category TEXT,
published_date TEXT,
author_name TEXT,
author_birth_date TEXT,
publisher_name TEXT,
publisher_address TEXT
)
""")
# 创建 Readers 表
session.execute("""
CREATE TABLE IF NOT EXISTS Readers (
reader_id TEXT PRIMARY KEY,
reader_name TEXT,
dob TEXT,
email TEXT,
phone_number TEXT,
address TEXT
)
""")
# 创建 BorrowRecords 表
session.execute("""
CREATE TABLE IF NOT EXISTS BorrowRecords (
borrow_id TEXT PRIMARY KEY,
book_id TEXT,
borrow_date TEXT,
return_date TEXT,
reader_name TEXT,
reader_id TEXT
)
""")
print("Keyspace and tables created.")
结果如下图所示:
(2)数据增加
分别给三张表插入数据,具体代码如下:
①插入图书记录
session.execute("""
INSERT INTO Books (book_id, title, category, published_date, author_name, author_birth_date, publisher_name, publisher_address)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
""", ('B001', '《活着》', '文学', '1993-06-01', '余华', '1960-04-03', '作家出版社', '北京市朝阳区'))
结果如下图所示:
②插入读者信息
session.execute("""
INSERT INTO Readers (reader_id, reader_name, dob, email, phone_number, address)
VALUES (%s, %s, %s, %s, %s, %s)
""", ('R001', '张三', '1990-05-15', 'zhangsan@email.com', '123-4567-8901', '北京市海淀区'))
结果如下图所示:
③插入借阅记录
session.execute("""
INSERT INTO BorrowRecords (borrow_id, book_id, borrow_date, return_date, reader_name, reader_id)
VALUES (%s, %s, %s, %s, %s, %s)
""", ('BR001', 'B001', '2024-11-01', '2024-11-15', '张三', 'R001'))
结果如下图所示:
(3)数据更新
更新读者的联系方式,具体代码如下:
session.execute("""
UPDATE Readers SET email = %s WHERE reader_id = %s
""", ('newemail@email.com', 'R001'))
结果如下图所示:
(4)数据查询
查询book_id为B001图书的详细信息,具体代码如下:
# 查询某本图书的详细信息
rows = session.execute("""
SELECT * FROM Books WHERE book_id = %s
""", ('B001',))
for row in rows:
print(row)
结果如下图所示:
(5)数据删除
删除book_id为B001图书的记录
session.execute("""
DELETE FROM Books WHERE book_id = %s
""", ('B001',))
执行结果如下图所示: