【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/"目录下并重命名:

bash 复制代码
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用户:

bash 复制代码
sudo chown -R hadoop:hadoop ./redis

接下来,进入"/usr/local/redis"目录,输入以下命令编译和安装Redis:

bash 复制代码
cd /usr/local/redis
bash 复制代码
sudo make
bash 复制代码
sudo make install

至此,Redis已经安装完成,现在可以执行如下命令开启Redis服务器:

$ cd /usr/local/redis
$ ./src/redis-server

然后,再新建一个终端,输入如下命令启动Redis客户端:

bash 复制代码
cd /usr/local/redis
bash 复制代码
./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系统中打开一个终端,执行如下命令导入公共秘钥到包管理器中:

bash 复制代码
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,使用如下命令:

bash 复制代码
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,使用如下命令:

bash 复制代码
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

执行如下命令来更新包管理器:

bash 复制代码
sudo apt-get update

最后,执行如下命令安装MongoDB:

bash 复制代码
sudo apt install mongodb-org

安装完成后,在终端输入以下命令查看MongoDB版本:

bash 复制代码
mongo -version

如果能够输出版本信息,则表明安装成功。


安装成功以后,启动MongoDB的命令如下:

bash 复制代码
sudo service mongodb start

默认设置下,MongoDB是随Ubuntu启动而自动启动的。可以输入以下命令查看是否启动成功:

bash 复制代码
pgrep mongod -l

注意:-l是英文字母l,不是阿拉伯数字1

如果能够出现如图所示信息,则表明启动成功:

使用MongoDB结束后,关闭MongoDB的命令如下:

bash 复制代码
sudo service mongodb stop

6.2.3使用Shell命令操作MongoDB

1. 进入MongoDB Shell模式

在Linux系统打开一个终端,输入如下命令启动MongoDB:

bash 复制代码
sudo service mongodb start

再输入如下命令进入MongoDB Shell模式:

执行该命令后,屏幕截图如图所示。

2. 常用操作命令

show dbs

use School

show dbs

3.简单操作演示

(1)切换到School数据库

命令如下:

bash 复制代码
use School

(2)创建集合

创建集合(Collection)的命令如下:

(3)插入数据

运行完以上例子,student已自动创建,这也说明MongoDB不需要预先定义集合(collection),在第一次插入数据后,集合会被自动创建。此时,可以使用"show collections"命令查询数据中当前已经存在的集合。如图所示。

(4)查找数据

查找数据所使用的基本命令格式如下:

bash 复制代码
db.youCollection.find(criteria, filterDisplay)

查询所有记录

bash 复制代码
db.student.find()

查询sname='lisi'的记录

bash 复制代码
db.student.find({sname: 'lisi'})

查询指定列sname、sage数据

bash 复制代码
db.student.find({},{sname:1, sage:1})

AND条件查询

bash 复制代码
db.student.find({sname: 'zhangsan', sage: 22})

OR条件查询

bash 复制代码
db.student.find({$or: [{sage: 22}, {sage: 25}]})

格式化输出

(5)修改数据

修改数据的基本命令格式如下:

bash 复制代码
db.youCollection.update(criteria, objNew, upsert, multi )

这里给出一个实例,语句如下:

bash 复制代码
db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true)

(6)删除数据

(7)删除集合

4. 退出MongoDB Shell模式

可以输入如下命令退出MongoDB Shell模式:

bash 复制代码
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

java 复制代码
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,详细介绍了这两种数据库的安装和使用方法,并给出了编程实例。

相关推荐
天冬忘忧13 分钟前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
sevevty-seven1 小时前
幻读是什么?用什么隔离级别可以防止幻读
大数据·sql
Yz98762 小时前
hive复杂数据类型Array & Map & Struct & 炸裂函数explode
大数据·数据库·数据仓库·hive·hadoop·数据库开发·big data
那一抹阳光多灿烂3 小时前
Spark中的Stage概念
大数据·spark
EDG Zmjjkk4 小时前
Hive 函数(实例操作版2)
数据仓库·hive·hadoop
北京鹏生科技有限公司4 小时前
EcoVadis审核是什么?EcoVadis审核流程包括什么?
大数据·百度
Moshow郑锴5 小时前
数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别
大数据·数据库·数据仓库·数据湖·湖仓一体
二进制_博客7 小时前
Flink学习连载第二篇-使用flink编写WordCount(多种情况演示)
大数据
不爱学习的YY酱8 小时前
【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作
linux·数据库·nosql
hong1616888 小时前
大数据技术Kafka详解:消息队列(Messages Queue)
大数据·分布式·kafka