说明
增加数据节点文件的管理。
内容
1 分配端口
为一键部署的服务分配一个端口。
序号 | 容器名 | 端口 | 说明 |
5 | dnws_24004 | 24004 | 数据节点仓库服务,与24002配合,实现数据节点的统一存储管理 |
这是一个有依赖的服务(依赖主机内的文件自动同步)
2 镜像准备
采用之前做好的Flask版本即可
测试
docker pull registry.cn-hangzhou.aliyuncs.com/YOURWAREHOUSE/base-flask:v7
Note:以后可以把最新的镜像版本tag为latest,这样就不必关注版本了。
3 项目文件
dnws本身的功能相对简单,属于A类服务,是可以放在公网上(开发),且不需要密码认证的。当运行时,dnws不会暴露对外端口,所以也不存在网络信息安全的问题。
未来,主机间的dnws会通过DMS(Data Manager Service)进行,那个会暴露端口,所以也会加上鉴权管理。
配置注意:挂载热盘和冷盘。依赖的服务24002启动后,会自动创建/opt/ProjectSpace/
和/home/DataNodeWareHouse/
4 一键部署脚本
要注意遵守冷热盘的命名规范,启动服务时同时挂接两个盘
- 增加了热盘和冷盘的配置
- 修改了启动文件夹的定义
默认采用/opt/one_implements
(不存在自动创建)作为一键部署的文件夹
if [ ! -d "/opt/one_implements" ]; then
echo "一键部署文件夹不存在,创建..."
mkdir -p /opt/one_implements
else
echo "一键部署文件夹存在"
fi
cd /opt/one_implements
增加了冷热盘的配置,要注意原来的docker启动命令需要修改挂载项目的路径
# 执行启动程序
docker run -d --name=${con_name000}\
--restart=always\
-v /etc/localtime:/etc/localtime \
-v /etc/timezone:/etc/timezone\
-e "LANG=C.UTF-8"\
-v ${current_folder}/${project_folder_name}:/workspace\
-v ${hot_folder}:/workspace/app/static/hot_folder\
-v ${cold_folder}:/workspace/app/static/cold_folder\
-p ${port000}:5555\
${image_name}\
sh -c "cd /workspace && sh entry_sh.sh test"
Note: 现有web文件服务器,如果上传同名文件会直接覆盖。
5 测试
下载
dn = DataNode('ddd', dntype='rf', fs = fs, dnws='http://172.17.0.1:24004/dnws/')
dn.download_data()
{'file_name': 'ddd@latest', 'file_type': '.pkl', 'dntype': 'rf', 'is_tem': False}
{'msg': 'no exist(in host and cold)', 'status': False}
[I] no data
上传
dn.input_data(rf_data)
def ddd(nume_dict, denom_dict, suffix= None):
nume_s = pd.Series(nume_dict)
denom_s = pd.Series(denom_dict)
res_s = nume_s / denom_s
if suffix is None:
return dict(res_s)
else:
new_s_index = ['_'.join([x,suffix]) for x in list(res_s.index)]
return dict(zip(new_s_index, list(res_s)))
dn.rf_process_meta()
---
glampse存放截图的md5码,目前为空,可以输入:bbb
explantion存放简介,目前为空,可以输入:bbb
data_org_type 数据组织类型:1 for ListOfElements,2 for DictOfElements, 3 for Element:3
【Note】meta还可以(不是必须)有如下属性:score,data_dis,duration
score:用于评估方法的适应度/效果
data_dis:用于描述维度分布的字典。对于连续变量,均假设为正态分布。
duration:执行一次函数所用的时间
---
dn.send_to_dnws()
data save to pickle: ./ddd@27388005.pkl
{'msg': 'file saved to /workspace//app/static/hot_folder/RF/ddd@27388005.pkl',
'status': True}
再次尝试下载,提示已经存在(如果不存在会下载)
{'file_name': 'ddd@latest', 'file_type': '.pkl', 'dntype': 'rf', 'is_tem': False}
{'data': '/workspace//app/static/hot_folder/RF/ddd@27388005.pkl', 'msg': 'ok in hot', 'status': True}
File Existed ./ddd@27388005.pkl
确认同步文件服务启动
wget -N http://YOURIP:PORT/downup/download/p24002_setup_周期文件同步.sh
bash p24002_setup_周期文件同步.sh /opt/ProjectSpace/ /home/DataNodeWareHouse/
热盘中的文件自动同步到 了冷盘
6 接口文档
以下简单的记录一下使用说明。
接口文档(DNWS)
DNWS(DataNode Warehouse Service)服务的作用是进行数据节点(DataNode)的统一存储管理:
- 1 方便长期保存一些测试数据集。
- 2 为RF、RS 提供数据存储,方便之后的调试,同时提供了进一步的优化支持。。
- 3 为PM提供数据存储,方便进行协同。
1 功能简述
DNWS是单主机内的服务,不开放对外端口。未来由DMS(DataManager Service)提供主机间的数据协同。
DNWS以接口形式提供了对pickle形式数据文件的存储(也可以扩展到其他类型)。
DNWS分为热盘和冷盘,通过24002(文件增量同步)实现本机冷盘和热盘的数据单向增量同步。热盘通常是固态,比较快,但比较小;冷盘通常是机械,比较慢,但比较大。固态盘上的数据不使用会删掉(冷盘不会删)。冷盘的意义是备份,以及提供「空间换时间」的支持。
2 部署方式
DNWS依赖24002,使用一键部署方式。
切换到任何一个文件夹,例如/tmp
执行脚本的拉取和执行
wget -N http://YOURIP_PORT/downup/download/p24002_setup_周期文件同步.sh && bash p24002_setup_周期文件同步.sh /opt/ProjectSpace/ /home/DataNodeWareHouse/
然后再执行DNWS(24004)的脚本拉取和执行
wget -N http://YOURIP_PORT/downup/download/p24004_setup_DNWS_v1.sh && bash p24004_setup_DNWS_v1.sh
Note: 如果没有安装24002也可以使用,但不会在冷热盘进行文件同步
3 请求说明
3.1 连通性校验
访问服务的根目录进行测试。
import requests as req
req.get('http://172.17.0.1:24004/dnws').json()
{'data': None, 'msg': 'ok', 'status': True}
3.2 数据查询
数据查询时需要提交的参数
序号 | 名字 | 解释 |
1 | file_name | 请求的数据名 |
2 | file_type | 请求的文件类型 |
3 | dntype | DNWS支持的三种应用rf, rs和pm |
4 | is_tem | 是否是临时文件 |
req.post('http://172.17.0.1:24004/dnws/query_file/', data = {'file_name': 'ddd@latest', 'file_type': '.pkl', 'dntype': 'rf', 'is_tem': False})
3.3 数据上传
序号 | 名字 | 解释 |
1 | file_name | 请求的数据名 |
2 | file_type | 请求的文件类型 |
3 | dntype | DNWS支持的三种应用rf, rs和pm |
4 | is_tem | 是否是临时文件 |
5 | file | 要上传的文件 |
6 | project | 如果是pm,需要声明项目 |
7 | schema | 如果是pm,需要声明制程 |
8 | process | 如果是pm,需要声明流程 |
req.post('http://172.17.0.1:24004/dnws/upload/', data = {'file_name': 'ddd@latest', 'file_type': '.pkl', 'dntype': 'rf', 'is_tem': False}, files={'file':open('ddd@123.pkl', 'rb')})
3.4 数据下载
先进行查询,如果有数据文件的话,返回的查询体json的data键将包含文件的路径和文件名。下载时将该字符串进行base64加密,wget请求。
target_args = b64encode_str(fpathname)
wget http://172.17.0.1:24004/dnws/download/target_args
base64的加密解密函数
4 使用DataNode交互对象
一般情况下,使用交互对象来进行简单的调用。具体用法参见这篇文章