首页 >> 实验教学 >> 实验项目 >> 详细内容
实验教学
 
实验项目 >> 正文
大数据存储技术
日期:2021-12-09 17:24:52  发布人:nclgjsj  浏览量:208

 

 

 

实验一 MongoDB的安装和配置

 

一、实验目的

1.熟悉MongoDB的安装、配置、启动

2.学会使用MongoDB shell

3.熟悉使用命令创建、查看、删除数据库

二、实验内容和原理

安装MongoDB

进行服务器和环境变量的配置

实现数据库的操作

三、实验条件

Windows系统+python +MongoDB

四、实验步骤

1、安装MongoDB

下载地址:https://www.mongodb.org/downloads

Windows中安装MongoDB,只需要根据自己的需要下载安装包、解压后运行即可。

ps: 最后一步,MongoDB Compass是个可视化工具,如果勾选安装的话是在线下载安装的,据说有的人安装一整晚都没装好就是因为这个。我这里是取消勾选的,因为之后需要工具使用的时候再单独安装。

2配置服务

检查一下系统服务里,有没有这个就行了,如果有,就不需要安装了。

 

3、启动mongo  (创建启动shell BAT文件)

cmd命令行模式,cdmongodb安装目录的bin目录下,输入mongo,进入mongo命令模式弹出了这些,说明服务已启动,可以正常运行了,ctrl+c退出mongo命令模式。

4、配置环境变量

这个影响到我们是否可以在任意位置进入mongo命令模式,如果没有配置环境变量,就只能先cdmongo安装目录下的bin里,才能进入mongo命令模式。

具体步骤如下:



这里点编辑,注意编辑的是下面系统变量里的Path,而不是上面用户变量里的Path

新建一条环境变量,路径就是安装目录的bin目录下
保存完成,重新打开cmd试一下,直接输入mongo

成功了,现在在任何地方都可以直接进入mongo命令模式了,如果还是失败的话,就重启一下。

五、实验小结

 

 

实验二 创建数据库和集合

 

一、实验目的

1.掌握MongoDB中的数据库、集合和文档

2.熟悉数据库的使用、创建、查看和删除

3、掌握集合的分类,创建和操作

二、实验内容和原理

  • 创建数据库
  • 进行集合的创建和使用
  • 实现文档的增加

三、实验条件

Windows系统+MongoDB

四、实验步骤

  1.  查看数据库

     使用 show dbs

  •  创建教材的library数据库

     Use library

  •  library数据集中增加集合和文档

 实现标准集合和固定集合的创建使用。

使用多种方法实现对media集合中插入文档,具体数据如下:

方法1:定义变量,使用insert()或者insertOne()当变量为参数

var document=(

{Type:"book",

Title:"Definitive Guide to MongoDB 3rd ed.,The",

ISBN:"978-1-4842-1183-0",

Publisher:"Apress",

Author:["Hows, David","Plugger,Eelco","Membrey,Peter","Hawkins,Tim"]

}

)

db.media.insert(document)

方法2:记录直接作为函数参数

db.media.insert(

{Type:"CD",

Artist:"Nirvana",

Title:"Nevemind`",

Tracklist:[

{Track:"1",

 Title:"Smells like Teen Spirit",

 Length:"5:02"

},

{Track:"2",

 Title:"In Bloom",

 Length:"4:15"

}

]

}

方法3:使用高级语言的循环实现一次性插入多条记录

var document=[

  {Type:"book",

Title:"Definitive Guide to MongoDB 3rd ed.,The",

ISBN:"978-1-4842-1183-0",

Publisher:"Apress",

Author:["Hows, David","Plugger,Eelco","Membrey,Peter","Hawkins,Tim"]},

{Type:"CD",

Artist:"Nirvana",

Title:"Nevemind`",

Tracklist:[

 {Track:"1",

 Title:"Smells like Teen Spirit",

 Length:"5:02"},

{Track:"2",

 Title:"In Bloom",

 Length:"4:15"}

              ] }];

for(var i = 0;i<document.length;i++){

db.media.insert(document[i])

}

方法4:使用insertMany()函数一次性插入多行文档

db.media.insertMany([

  {Type:"book",

Title:"Definitive Guide to MongoDB 3rd ed.,The",

ISBN:"978-1-4842-1183-0",

Publisher:"Apress",

Author:["Hows, David","Plugger,Eelco","Membrey,Peter","Hawkins,Tim"]},

{Type:"CD",

Artist:"Nirvana",

Title:"Nevemind`",

Tracklist:[

 {Track:"1",

 Title:"Smells like Teen Spirit",

 Length:"5:02"},

{Track:"2",

 Title:"In Bloom",

 Length:"4:15"}] );

  1. 查看集合中的文档数据

 db.media.find()

 db.media.count()

  1. 文档数据的删除

 db.media.remove({})

  1. 集合的删除

db.media.drop()

  1. 数据库的删除

在当前操作的焦点数据库下使用db.dropDatabase()

五、实验小结

 

实验三 数据查询

 

一、实验目的

1. 掌握MongoDB 中的数据的find () 查询

2. 熟悉find()的参数及各参数的意义

3、掌握简单查询和条件查询

4、掌握条件查询的管道符号$

二、实验内容和原理

原理:基于数据库原理中的SQL 查询基础,对比SQL 语句和 NOSQL数据库的查询实现。

实验内容:增加 persons 集合,执行 persons.json (附件)实现文档的插入,基于Library 数据库中的MediaPersons集合,然后完成如下的查询练习:

 1. 查询出所有 library 数据库中的media集合的数据

2. 查询出 persons 集合中所有数据的指定键(name,age,country)

3. 查询出所有 library 数据库中的media集合的包含特定歌曲"In Bloom"CD数据

4. 查询出persons集合中所有文档的nameage列,按年龄升序输出

5. 查询出 persons 文档中前5条数据,_id列不输出

6. 查询出persons 文档中6-10条数据

7. 查询 media集合中的第一个记录(或者最后一条文档)。

8. 统计media集合中的文档记录条数

9. 统计 persons 中中国学生的人数

10. 查询 media 集合中的文档的类型 type

11. 查询 media 集合中CD类型的标题

12. 统计persons 中各个国家的人数

13. 查询出 media 集合的类型是“CD'的文档数据

14. 查询 persons 集合中年龄不等于 27岁的所有数据的指定键(name,age,country)

15.查询出 media 集合播放时间为5: 02CD数据

16.查询出年龄在2227岁之间的学生

17. 查询出 persons集合中国或者韩国学生的 name age

18. 查询出 persons 集合中年龄是偶数的学生数据

19. 查询语文成绩为空的学生姓名和语文、数学、英语成绩

20. 查询姓名中包含LI的学生信息(不区分大小写)

21, 查询既喜欢看MONGODB又喜欢看 JS的学生

22. 查询books域中第二本书是JAVA的学生信息

23. 查询media集合中含有Author键的所有文档

24. 查询 student 集合中姓名以“n”结尾的学生信息

三、实验条件

Windows 系统+MongoDB

四、实验步骤

在实验二的基础上增加persons集合,执行 persons.json (附件)实现文档的插入:load ("persons.json")

1.db.media.find()

 2.db.persons.find ( {, {_id:0,name:1,age:1,country:1})

3. db.media.find ( {"Tracklist. Title": "In Bloom"} )

4.db.persons.find ( {} , {_id:0,name:l,age:1}).sort({age:1})

5.db.persons.find ( {} , {_id:0}).limit(5)

6.db.persons.find().limit (5) .skip (5)

7.db.persons.findOne( )或者

db.persons.find().limit (1)

8.db.media.count() 

9.db.persons.find ( {country: "China"} ) .count() 

10.db.media.find ( {} , {_id:0,Type:1})

11.db.media.find ( {Type: "CD"} , {Title:1})

或者db.media.distinct ("Tracklist. Title")

12.db.persons.aggregate ( {Sgroup:{_id: "$country",人数:{Ssum: 1}}} )

13.db.media.find ( {type: {$ne:"CD"}})

14.db.persons.find ( {age:{$ne:27}},{name:1,age:1,country:1,_id:0})

15.db.media.find ( {"Tracklist. Length". "5: 02"} )

16.db.persons.find ( {age: {Sgt:22,$lt:27}})

17.db.persons.find ( {country: {$in:["China","Korea"]}})

18.db.persons.find ( {age: {$mod:[2,0]})

19.db.persons.find ( {c:null} , {name:1,c:1,m:1,e:1,id:0})

20.db.persons.find ( {name: /li/i} )

21.db.persons.find ( {books: {$all:["MONGODB","JS"]})

22.db.persons.find ( {"books. 1". "JAVA"} )

23.db.media.find ( {Author: {$exists:1}})

24.db.persons.find ( {name: /n$/i} )

五、实验结论

 

实验四 数据更新

一、实验目的

1.掌握MongoDB中的数据的update()修改操作符和remove()删除。

2.熟悉update()的4个参数及各参数的意义

3、掌握重命名和修改的实现

二、实验内容和原理

导入数据persons.jsonlibrary.json和在班级classes集合中插入2个文档

 db.classes.insert({"name":"c1","count":30})

db.classes.insert({"name":"c2","count":30})

1count大于20class name修改为c3

2 count大于20class name修改为c4,设置multitrue

3 count大于50class name修改为c5,设置upserttrue

4.如果要在集合persons中插入某个学生的信息(如:姓名为王武,性别为男,国籍是中国,三门课程成绩null),应如何进行?

5.“美国”籍全体学生的语文成绩C提高5分;

6 persons中中国籍学生的年龄设为23

7. persons中性别字段删除

8,把personszhangsanbooks 增加JS”和”DB”两门课

9.persons中张三姓名追加别名列,并且值是A1A2,【A3,A4】,A5

10.删除张三别名列的最后一个别名A5

11.查询出persons集合的数据

12.查询出persons集合中所有非美国和韩国的学生信息 

13.查询persons中的第5条记录 

14查询persons中的李四国籍(使用2种方法实现)

15.修改persons集合的集合名为student

16.查询student集合中年龄最小的学生信息 

17.向中国籍的学生添加书籍Hadoop

18. 删除性别为空的学生信息

19. 修改student集合中的country列名为“国籍”

20. 实现数据的引用:向media添加一本书Hadoop”,然后查询喜欢该书籍的学生信息。

21. 删除media中的所有记录和media集合

三、实验条件

Windows系统+MongoDB

四、实验步骤

启动Mongo shell ,导入对应的集合数据,完成以上的代码编写。

1. db.classes.update({count:{$gt:20}},{$set:{"name":"c3"}})

2. db.classes.update({count:{$gt:20}},{$set:{"name":"c4"}},0,1)

3. db.classes.update({count:{$gt:20}},{$set:{"name":"c5"}},1,0)

4. db.persons.insert({"name":"王武",

"sex":"","country":"China","c":null,"m":null,"e":null})

5. db.persons.update({"country":"USA"},{$inc:{"c":5}},0,1)

6. db.persons.update({"country":"China"},{$set:{"age":23}},0,1)

7. db.persons.update({},{$unset:{"sex":1}},0,1)

8.db.persons.update({"name":"zhangsan"},{$push:{"books":{$each:["JS","DB"]}}})

9.db.persons.update({"name":"zhangsan"},{$push:{"alias":{$each:["A1","A2",["A3","A4"],"A5"]}}})

10. db.persons.update({"name":"zhangsan"},{$pop:{"alias":1}})

11db.persons.find()

12db.persons.find({"country":{$nin:["USA","Kroea"]}})

13db.persons.find()[4]

14db.persons.find({"name":"lisi"},{"country":1,"_id":0})

     db.persons.find()

15db.persons.renameCollection("student")

16db.student.find().min({"age"})

17db.student.update({"country":"China"},{$push:{"book":"Hadoop"}})

18db.student.remove({"sex":NULL})

19db.student.update({},{$rename:{country:"国籍"}},0,1)

20db.media.insert({_id:1,Type:"book",Title:"Hadoop"})

db.media.find({"book":db.media.find({_id:1})[0].Title},{"name":1,"book":1,"_id":0})

21db.media.remove({})db.media.drop()

 

 

五、实验小结

 

实验五 高级应用

一、实验目的

1.掌握MongoDB中的高级应用,包括GridFSPython中使用MongoDB

2.熟悉高级查询的各种情况。

3、掌握Pymongo中数据的增删查改。

二、实验内容和原理

原理:在文件系统GridFS或者Python中对MongoDB的数据文档的增删改查。

内容:

1.启动GridFS

2.使用GridFS命令行上传一个文件

3.查看GridFS的文件存储状态

4.搜索命令search查找上传的文件

5.get获取上传文件

6.delete删除所有同名的文件

7.启动Python

8.连接MongoDB数据库

9.pymongo中实现数据库列表和集合列表的查询

10.实现文件和单词的读取

11.通过PymongoGridFS中添加文件

12.GridFS中读取数据集

13.实现文档的增删查改

14.可以打印文档中的所有内容

15.调用fs.delete()并传入文件的_id删除文件

16.完成编码实现将mongodb中已经存在的persons集合内容转换成xls存储到磁盘

 

三、实验条件

Windows系统+MongoDB+python

四、实验步骤

1、在cmd中输入mongofiles -help,可以启动GridFS

2、通过put传一个文件,命令格式为:

mongofiles -d 数据库 put "README.txt

3、查看MongoDB中的数据:mongo->db.fs.files.find()

4mongofiles 支持搜索命令search:   mongofiles  search README.txt

5mongofiles get命令就可以实现文件获取:

    mongofiles get README.txt

6、删除文件:mongofiles delete README.txt

7-10 启动python,链接mongodb,实现操作:

pycharm或者jupyter中导入pymongogridfs模块,然后编码如下:

from  pymongo import MongoClient

myclient = MongoClient()

db = myclient.library

mycol = db.student

mycol.insert_one({'_id':1,'name':'wuli'}) #插入一条记录mycol.update_one({'name':'jim'},{'$set':{'c':98}})#修改指定条件的记录

mycol.delete_one({'name':'zhangsuying'}) #删除指定条件的记录

mycol.find()[0] #查询第一条文档记录

for cur  in mycol.find():#通过游标可迭代查询整个集合中的所有文档

    print(cur)

 

11-15通过PymongoGridFS中操作文件

 

 

import gridfs

fs = gridfs.GridFS(db)

dict= db.fs.files.find_one() #查看之前已经上传的文件

dict['_id']  #获取文件的_id

filetext  = fs.get(dict['_id']) #获取文件内容

 for i in filetext:

     print (i)      #输出文件内容

#本地上传文件 

with open(r"C:\Users\admin\Desktop\ab.txt",'rb') as files:

     fid = fs.put(files)

print(fid)

newtext = fs.get(fid)

for i in newtext:

print (i)

fs.delete(fid)

16.读取mongodb中的library数据库下的persons集合的文档,结果以XLS存储到磁盘。

 

import pymongo

>>> myclient = pymongo.MongoClient("mongodb://localhost:27017/")

#查看当前的MongoDB shell中有哪些数据库

>>>myclient.list_database_names()

#链接其中数据库'library'

 >>>db = myclient['library']

#查看数据库中的集合

>>> db.list_collection_names()

#persons集合的数据

data = db['persons']

#输出persons集合的的第一条数据记录

 data.find_one()

#通过下面的语句实现记录插入、修改和删除

mycol.insert_one({'_id':1,'name':'lihong'})

mycol.update_one({'name':'lihong'},{'$set':{'c':98}})#修改指定条件的记录

mycol.delete_one({'name':'zhangsuying'}) #删除指定条件的记录

#输出persons集合的全部数据记录

 for i in data.find()[:11]:

...     print (i)

#persons中的全部数据转存成dataframe格式的数据,供pandas直接进行数据分析

>>> datalst = list(data.find())

>>> import pandas as pd

>>> df = pd.DataFrame(datalst)

>>> import numpy as np

>>> import xlrd

>>> import xlwt

# mongodb 中的persons表中的全部数据转成Excel格式

>>> df.to_excel('E:\\m.xls',index=False)

五、实验小结


 


实验六 复制和分片

一、实验目的

1.掌握MongoDB中的复制和分片

2.熟悉复制和分片的初始化

3、掌握复制集的启动和初始化

4、完成复制、分片以及数据测试

二、实验内容和原理

1.创建副本集和服务器

2.启动副本集

3.启动配置和路由服务器

4.配置shared 集群

5.测试数据

三、实验条件

Windows系统+MongoDB

四、实验步骤

 

副本集shard1,有3instancesIP10.1.1.8,端口是260162602626036,其中26036是仲裁节点

副本集shard2,有3instancesIP10.1.1.8,端口是260172602726037,其中26037是仲裁节点

 

分片是在副本集shared1shared2上进行。

 

配置服务器:有1instanceIP10.1.1.8,端口是26018

路由服务器:有1instanceIP10.1.1.8,端口是26019

 

启动shard1副本集:

./mongod --shardsvr --replSet shard1 --port 26016 --dbpath /data/26016/data --logpath /data/26016/log/26016.log --logappend --fork

./mongod --shardsvr --replSet shard1 --port 26026 --dbpath /data/26026/data --logpath /data/26026/log/26026.log --logappend --fork

./mongod --shardsvr --replSet shard1 --port 26026 --dbpath /data/26026/data --logpath /data/26026/log/26026.log --logappend --fork

 

初始化副本集shard1

./mongo --port 26016 --host 10.1.1.8 admin

cfg = { _id: "shard1", members:[ { _id:0,host:"10.1.1.8:26016"}, { _id:1, host:"10.1.1.8:26026"} ]}

rs.initiate(cfg)

rs.addArb("10.1.1.8:26036");

 

启动shard2副本集:

./mongod --shardsvr --replSet shard1 --port 26017 --dbpath /data/26017/data --logpath /data/26017/log/26017.log --logappend --fork

./mongod --shardsvr --replSet shard1 --port 26027 --dbpath /data/26027/data --logpath /data/26027/log/26027.log --logappend --fork

./mongod --shardsvr --replSet shard1 --port 26027 --dbpath /data/26027/data --logpath /data/26027/log/26027.log --logappend --fork

 

初始化副本集shard2

./mongo --port 26017 --host 10.1.1.8 admin

cfg = { _id: "shard2", members:[ { _id:0,host:"10.1.1.8:26017"}, { _id:1, host:"10.1.1.8:26027"} ]}

rs.initiate(cfg)

rs.addArb("10.1.1.8:26037");

 

启动配置服务器:

./mongod --configsvr --dbpath /data/26018/data --port 26018 --logpath /data/26018/log/26018.log --logappend --fork

./mongod --configsvr --dbpath /data/26028/data --port 26028 --logpath /data/26028/log/26028.log --logappend --fork

./mongod --configsvr --dbpath /data/26038/data --port 26038 --logpath /data/26038/log/26038.log --logappend --fork

 

启动路由服务器:

./mongos --configdb 10.1.1.8:26018,10.1.1.8:26028,10.1.1.8:26038 --port 26019 --logpath /data/26019/log/26019.log --logappend --fork

./mongos --configdb 10.1.1.8:26018,10.1.1.8:26028,10.1.1.8:26038 --port 26029 --logpath /data/26029/log/26029.log --logappend --fork

./mongos --configdb 10.1.1.8:26018,10.1.1.8:26028,10.1.1.8:26038 --port 26039 --logpath /data/26039/log/26039.log --logappend --fork

 

配置shared 集群

./mongo --port 26019 --host 10.1.1.8 admin

use admin

db.runCommand({addshard:"shard1/10.1.1.8:26016,10.1.1.8:26026,10.1.1.8:26036"})

db.runCommand({addshard:"shard2/10.1.1.8:26017,10.1.1.8:26027,10.1.1.8:26037"})

 

db.runCommand({enablesharding:"test"})

db.runCommand({shardcollection:"test.person",key:{name:1}})

 

测试数据:

 

use test

for(var i=0;i<10000;i++){

 db.person.insert({"name":"jack"+i,"age":i})

}

for(var i=0;i<10000;i++){

 db.person.insert({"name":"tom"+i,"age":i})

}

 

db.printShardingStatus()

mongos> db.printShardingStatus()

--- Sharding Status ---

  sharding version: {

 "_id" : 1,

 "version" : 4,

 "minCompatibleVersion" : 4,

 "currentVersion" : 5,

 "clusterId" : ObjectId("552a1234143ff7338546e841")

}

  shards:

 {  "_id" : "shard1",  "host" : "shard1/10.1.1.8:26016,10.1.1.8:26026" }

 {  "_id" : "shard2",  "host" : "shard2/10.1.1.8:26017,10.1.1.8:26027" }

  databases:

 {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

 {  "_id" : "test",  "partitioned" : true,  "primary" : "shard1" }

  test.person

   shard key: { "name" : 1 }

   chunks:

    shard2 1

    shard1 2

   { "name" : { "$minKey" : 1 } } -->> { "name" : "jack0" } on : shard2 Timestamp(2, 0)

   { "name" : "jack0" } -->> { "name" : "tom99" } on : shard1 Timestamp(2, 2)

   { "name" : "tom99" } -->> { "name" : { "$maxKey" : 1 } } on : shard1 Timestamp(2, 3)

五、实验小结

核发:nclgjsj 点击数:208收藏本页