给定一个查询初始化虚拟机和 N(如 6)个存储虚拟机,其中 N 个虚拟机负责分布式存储上 述 dblp.xml 片段文件,查询初始化虚拟机负责发送一个查询请求,协调 N 个虚拟机,完成 如下查询功能需求:
给出输入条件:作者名字 author 如 Ion Stoica,返回作者的 DBLP 发表论文总数。
因为dblp.xml文件较大, 为了加快切分时间, 这里没有采取按每个文章切分而后随即分配, 而是采用直接将源文件线性切分为N份(N为存储机数量), 而后分到N台存储虚拟机中
使用java实现socket通信, 通过建立TCP通信来连接数据服务器和存储虚拟机,而后发送切分好的文件给存储虚拟机
同样使用java实现的socket通信, 客户端先建立与数据服务器的TCP连接, 而后发送查询姓名, 服务端计算出姓名作为作者出现的频次后返回给客户端, 客户端整合后生成日志
采用副本存储方式, 每台虚拟机的数据会在另一台虚拟机存放一份副本, 当主机down时, 客户端会给副本服务端发送请求, 获得数据
在查询时, 为了发挥分布式存储的优势, 客户端发送请求时采用多线程实现方式, 可以让多个服务端同时运作
- 将dataServer和dataProcess文件夹传到数据服务器上, 将server文件夹拷贝到每个存储机上(SearchServer.java只需要一份, 重复的文件是为了单机多端口模拟多个端, 根据实际情况进行删减)
- 源文件dblp.xml放入src/dataProcess路径下,
- 修改上述路径下dataProcess.sh文件, 将remoteCount改为存储虚拟机个数,
- 运行该脚本进行文件切分
- 修改src/dataServer/DataSend.java中, main函数内部的ip为存储机ip(根据个数添加或删除代码)
- 先运行数据服务器的DataSend.java, 在运行每个存储机的DataReceive.java
- 将client文件夹传输到查询服务器上
- 修改client/SearchClient.java中, main函数内部的ip为存储机ip(根据个数添加或删除代码)
- 先运行每个存储机的SearchServer.java文件, 在运行查询客户端的SearchClient.java文件
- 标准输出流会输出查询过程, 查询结果也会存放在日志中