野路子码农(4)挖掘机云端部署小试

最近接触的某个数据挖掘项目将近尾声(其实并无……),客户开始关心模型最终部署的问题,但愿将模型部署在巨硬云Azure上,他们按期上传数据,按期跑跑模型,获得预测便可。我以为这应该挺简单的,客户把数据上传到某个文件夹里,个人程序直接读取就好啦,而后跑完模型结果保存在另外一个文件夹里。结果客户说,咱们的数据会上传到一个SFTP上,你得从那上面读取,这样的话咱们能够随时换VM或者换SFTP,至于怎么实现大家本身搞定。python

虽然客户的需求颇有道理,但这让我有点懵逼了,感受彷佛变成了隔空取物,毕竟我无法直接在python里用os操做SFTP上的远程文件夹,也无法直接用pandas读取。不过幸亏,咱们有pysftp这个库。3d

pysftp这个库专门用于链接并操做SFTP,咱们只须要提供SFTP的地址,用户名和密码,其余的基本跟os的操做同样了。此库安装也很是简单,直接pip install pysftp便可。blog

总体的思路很是简单,咱们先来看看整个系统的流程:ip

用户的数据上传至SFTP上的Input_remote文件夹,咱们将其同步到Azure上的Input_local文件夹中。而后咱们的模型从Input_local读取数据,运行,并将结果返回至Azure上的Output_local文件夹中。随后咱们再将其推送至SFTP上的Output_remote文件夹,用户经过该文件夹获取。这样一来咱们就实现了VM与SFTP的分离,二者随时想换就能换。rem

 

而后就是附上代码的环节了:部署

1. 导入库get

import pysftp
import os
import warnings
warnings.filterwarnings(action='ignore')

pysftp用于链接与操做SFTP,os用于操做VM上的本地文件。warnings仅用于过滤掉警告消息(强迫症患者)。同步

2. 远程文件同步到本地(SFTP -> VM)pandas

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None   
with pysftp.Connection('***.com', username='******', password='******', cnopts=cnopts) as sftp:
    sftp.chdir('./remote_folder') # 变动远程目标文件夹
    print(sftp.listdir()) # 同步前文件夹的内容
    print(os.listdir())
    sftp.get_d(remotedir='./', localdir='./') # 远程同步到本地
    print(sftp.listdir()) # 同步后文件夹的内容
    print(os.listdir())

开头两行是链接选项,不加可能会报错。而后咱们用with语句开启一个通往SFTP的链接,在pysftp.Connection中依次输入SFTP的链接地址、用户名和密码。使用with的好处是,当咱们使用完毕时,会自动关掉这个链接。it

咱们在这里能够看到,pysftp的操做基本和os别无二致,很是简单,咱们在这一步所作的就是:更改远程目标文件夹 -> 分别查看远程/本地文件夹的内容 -> 使用get_d从远程同步到本地 -> 再次查看远程/本地文件夹的内容。咱们看一下结果:

能够看到咱们把SFTP上的test1.csv同步到了本地。

3. 本地文件推送至远程(VM -> SFTP)

在这里,咱们先把test1.csv改个名字,改为test2.csv,而后把这个文件推送到远程文件夹里。

os.rename('test1.csv', 'test2.csv')
with pysftp.Connection('***.com', username='******', password='******', cnopts=cnopts) as sftp:
    sftp.chdir('./remote_folder') # 变动远程目标文件夹
    print(sftp.listdir()) # 查看
    print(os.listdir())
    sftp.put('test2.csv') # 推送单个文件
    print(sftp.listdir()) # 再次查看
    print(os.listdir())

因为上次使用的with语句在执行结束后关闭了链接,所以咱们在这里要从新变动远程目标文件夹,咱们经过put命令将本地的test2.csv推送至远程文件夹,执行先后分别查看一下:

能够看到咱们把VM上的test2.csv推送到了远程。若是咱们想直接同步整个文件夹的内容的话,咱们能够用put_d命令(跟get_d相似)。

 

经过上述简单的演示,咱们基本上完成了一个最简易的SFTP-VM的数据打通环节,须要注意的是,同步与推送的过程当中,新出现的文件老是会直接覆盖已存在的同名文件(overwrite),因此千万要注意不要一失足成千古恨。

此外,咱们能够把同步与推送的过程写在一个with语句里,并把咱们的模型打包嵌入进去,这样一来咱们就基本完成了一个最简单的模型部署。

相关文章
相关标签/搜索