【Hadoop】【大数据技术基础】实践三 NoSQL数据库 大数据基础编程、实验和案例教程(第2版)
第6章 典型NoSQL数据库的安装和使用
- Redis安装和使用
- MongoDB的安装和使用
6.1 Redis安装和使用
6.1.1 Redis简介
Redis是一个键值(key-value)存储系统,即键值对非关系型数据库,和Memcached类似,目前正在被越来越多的互联网公司采用。Redis作为一个高性能的键值数据库,不仅在很大程度上弥补了memcached这类键值存储的不足,而且在部分场合下可以对关系数据库起到很好的补充作用。Redis提供了Python、Ruby、Erlang、PHP客户端,使用很方便。
Redis支持存储的值(value)类型包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove以及取交集、并集和差集等丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,Redis中的数据都是缓存在内存中的,它会周期性地把更新的数据写入磁盘,或者把修改操作写入追加的记录文件;此外,Redis还实现了主从(master-slave)同步。
6.1.2 安装Redis
访问Redis官网(http://www.redis.cn/)下载安装包redis-5.0.5.tar.gz
执行以下命令将Redis解压至“/usr/local/”目录下并重命名:
cd ~
sudo tar -zxvf ./下载/redis-5.0.5.tar.gz -C /usr/local
cd /usr/local
sudo mv ./redis-5.0.5 ./redis
然后,执行如下命令把redis目录的权限赋予hadoop用户:
sudo chown -R hadoop:hadoop ./redis
接下来,进入“/usr/local/redis”目录,输入以下命令编译和安装Redis:
cd /usr/local/redis
sudo make
sudo make install
至此,Redis已经安装完成,现在可以执行如下命令开启Redis服务器:
$ cd /usr/local/redis
$ ./src/redis-server
然后,再新建一个终端,输入如下命令启动Redis客户端:
cd /usr/local/redis
./src/redis-cli
客户端连上服务器之后,会显示“127.0.0.1:6379>”的命令提示符信息,表示服务器的IP地址为127.0.0.1,端口为6379。现在可以执行简单的操作,比如,设置键为”hello”,值为”world”,并且取出键为”hello”时对应的值。
6.1.3 Redis实例演示
假设有三个表,即Student、Course和SC,三个表的字段(列)和数据如图所示。
Redis数据库是以<key,value>的形式存储数据,把三个表的数据存入Redis数据库时,key和value的确定方法如下:
- key=表名:主键值:列名
- value=列值
例如,把每个表的第一行记录保存到Redis数据中,需要执行的命令和执行结果如图所示。
set SC:95001:1:Grade 92
6.2 MongoDB的安装和使用
6.2.1 MongDB简介
MongoDB是一个基于分布式文件存储的文档数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富、最像关系数据库的一种NoSQL数据库。MongoDB支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是支持的查询语言非常强大,语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
6.2.2 安装MongoDB
MongoDB既可以安装在Windows系统下使用,也可以安装在Linux系统下使用,这里采用Linux系统。MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。
但是,需要说明的是,如果直接使用“sudo apt-get install mongodb”命令进行安装,默认安装的版本是MongoDB 2.6.10。由于目前MongoDB已经升级到4.0.16,这里将通过添加软件源的方式来安装4.0.16版本。
首先,在Linux系统中打开一个终端,执行如下命令导入公共秘钥到包管理器中:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
或者按教材上:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
然后,创建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
或者按教材:
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
执行如下命令来更新包管理器:
sudo apt-get update
最后,执行如下命令安装MongoDB:
sudo apt install mongodb-org
安装完成后,在终端输入以下命令查看MongoDB版本:
mongo -version
如果能够输出版本信息,则表明安装成功。
安装成功以后,启动MongoDB的命令如下:
sudo service mongodb start
默认设置下,MongoDB是随Ubuntu启动而自动启动的。可以输入以下命令查看是否启动成功:
pgrep mongod -l
注意:-l是英文字母l,不是阿拉伯数字1
如果能够出现如图所示信息,则表明启动成功:
使用MongoDB结束后,关闭MongoDB的命令如下:
sudo service mongodb stop
6.2.3使用Shell命令操作MongoDB
1. 进入MongoDB Shell模式
在Linux系统打开一个终端,输入如下命令启动MongoDB:
sudo service mongodb start
再输入如下命令进入MongoDB Shell模式:
执行该命令后,屏幕截图如图所示。
2. 常用操作命令
show dbs
use School
show dbs
3.简单操作演示
(1)切换到School数据库
命令如下:
use School
(2)创建集合
创建集合(Collection)的命令如下:
(3)插入数据
运行完以上例子,student已自动创建,这也说明MongoDB不需要预先定义集合(collection),在第一次插入数据后,集合会被自动创建。此时,可以使用“show collections”命令查询数据中当前已经存在的集合。如图所示。
(4)查找数据
查找数据所使用的基本命令格式如下:
db.youCollection.find(criteria, filterDisplay)
查询所有记录
db.student.find()
查询sname='lisi'的记录
db.student.find({sname: 'lisi'})
查询指定列sname、sage数据
db.student.find({},{sname:1, sage:1})
AND条件查询
db.student.find({sname: 'zhangsan', sage: 22})
OR条件查询
db.student.find({$or: [{sage: 22}, {sage: 25}]})
格式化输出
(5)修改数据
修改数据的基本命令格式如下:
db.youCollection.update(criteria, objNew, upsert, multi )
这里给出一个实例,语句如下:
db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true)
(6)删除数据
(7)删除集合
4. 退出MongoDB Shell模式
可以输入如下命令退出MongoDB Shell模式:
exit
6.2.4 Java API编程实例
编写Java程序访问MongoDB数据库时,首先,需要下载Java MongoDB Driver驱动JAR包,Java MongoDB Driver下载地址如下:
https://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/3.12.1/mongo-java-driver-3.12.1.jar
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.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
public class TestMongoDB {
/**
* 返回指定数据库中的指定集合
* @param dbname 数据库名
* @param collectionname 集合名
* @return
*/
public static MongoCollection<Document> getCollection(String dbname, String collectionname) {
// 实例化一个mongo客户端,服务器地址:localhost(本地),端口号:27017
MongoClient mongoClient = new MongoClient("localhost", 27017);
// 实例化一个mongo数据库
MongoDatabase mongoDatabase = mongoClient.getDatabase(dbname);
// 获取数据库中某个集合
MongoCollection<Document> collection = mongoDatabase.getCollection(collectionname);
return collection;
}
/**
* 插入数据
*/
public static void insert() {
try {
// 连接MongoDB,指定连接数据库名,指定连接表名。
MongoCollection<Document> collection = getCollection("School", "student");
// 实例化一个文档,文档内容为{sname:'Mary',sage:25},如果还有其他字段,可以继续追加append
Document doc1 = new Document("sname", "Mary").append("sage", 25);
// 实例化一个文档,文档内容为{sname:'Bob',sage:20}
Document doc2 = new Document("sname", "Bob").append("sage", 20);
List<Document> documents = new ArrayList<Document>();
// 将doc1、doc2加入到documents列表中
documents.add(doc1);
documents.add(doc2);
// 将documents插入集合
collection.insertMany(documents);
System.out.println("插入成功");
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
/**
* 查询数据
*/
public static void find() {
try {
MongoCollection<Document> collection = getCollection("School", "student");
// 通过游标遍历检索出的文档集合
MongoCursor<Document> cursor = collection.find().iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next().toJson());
}
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
/**
* 更新数据
*/
public static void update() {
try {
MongoCollection<Document> collection = getCollection("School", "student");
// 更新文档,将文档中sname='Mary'的文档修改为sage=22
collection.updateMany(Filters.eq("sname", "Mary"), new Document("$set", new Document("sage", 22)));
System.out.println("更新成功!");
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
/**
* 删除数据
*/
public static void delete() {
try {
MongoCollection<Document> collection = getCollection("School", "student");
// 删除符合条件的第一个文档
collection.deleteOne(Filters.eq("sname", "Bob"));
// 删除所有符合条件的文档
// collection.deleteMany(Filters.eq("sname", "Bob"));
System.out.println("删除成功!");
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
}
public static void main(String[] args) {
// insert();//插入数据。执行插入时,可将其他三句函数调用语句注释,下同
find(); //查找数据
// update();//更新数据
// delete();//删除数据
}
}
每次在Eclipse中执行完该程序,都可以在Linux系统的MongoDB Shell模式下查看结果。比如,在Eclipse执行完更新操作后,在MongoDB Shell模式下输入命令“db.student.find()”,就可以查看student集合的所有数据(如图所示)。
6.3 本章小结
传统的关系数据库可以较好地支持结构化数据存储和管理,但是,Web 2.0的迅猛发展以及大数据时代的到来,使关系数据库的发展越来越力不从心。在大数据时代,数据类型繁多,包括结构化数据和各种非结构化数据,其中,非结构化数据的比例更是高达90%以上。因此,在新的应用需求驱动下,各种新型的NoSQL数据库不断涌现,并逐渐获得市场的青睐。NoSQL数据库主要包括键值数据库、列族数据库、文档数据库和图数据库等4种类型,前面在第5章介绍的HBase就属于列族数据库。
键值数据库和文档数据库是两种应用比较广泛的NoSQL数据库,因此,本章选取了两个具有代表性的产品进行介绍,包括键值数据库Redis和文档数据库MongoDB,详细介绍了这两种数据库的安装和使用方法,并给出了编程实例。