最近接触的某个数据挖掘项目将近尾声(其实并无……),客户开始关心模型最终部署的问题,但愿将模型部署在巨硬云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语句里,并把咱们的模型打包嵌入进去,这样一来咱们就基本完成了一个最简单的模型部署。