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

相关推荐
INFINI Labs13 分钟前
Elasticsearch filter context 的使用原理
大数据·elasticsearch·jenkins·filter·querycache
Ahern_37 分钟前
Oracle 普通表至分区表的分区交换
大数据·数据库·sql·oracle
李昊哲小课1 小时前
deepin 安装 kafka
大数据·分布式·zookeeper·数据分析·kafka
FIN66682 小时前
张剑教授:乳腺癌小红书(2025年版)更新,芦康沙妥珠单抗成功进入TNBC二线推荐,彰显乳腺癌诊疗的“中国力量”
大数据·搜索引擎·健康医疗
core5126 小时前
flink sink doris
大数据·mysql·flink·doris·存储·sink·过程正常
出发行进7 小时前
Hive其四,Hive的数据导出,案例展示,表类型介绍
数据仓库·hive·hadoop
武子康9 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
lucky_syq10 小时前
Flume和Kafka的区别?
大数据·kafka·flume
AI_NEW_COME10 小时前
构建全方位大健康零售帮助中心:提升服务与体验
大数据·人工智能
it噩梦11 小时前
es 中 terms set 使用
大数据·elasticsearch