返回 登录
0

应用Docker+Jupyter快速搭建数据科研环境

配置一个数据科研环境是一个非常痛苦的过程。比如处理各个软件包版本的一致性问题,必须非常深入理解并解决模糊晦涩的错误消息,再加上无数漫长的等待各个包的编译过程是非常令人沮丧的。这成为了数据科研难以上手的首要因素,并且是完全的没有规律可循。

在过去的几年中我们能看到有多种技术产生,来帮助我们创建隔离化的环境。在此我们将主要关注一个技术:Docker。Docker的出现让创建一个新的数据科研环境变得更快更容易,并且可以引入如Jupyter这样的工具来帮助探索你的数据。

基于Docker,我们可以下载一个镜像文件,其中已经包含了一系列的软件包和数据科研工具。我们可以基于这个镜像在极短时间内启动数据科研环境,不必花费漫长的时间来人工挨个安装编译各个软件包。这个环境就是Docker容器。容器可以帮助我们消除配置问题,即当容器被启动时,它就已经是一个所有软件包都正常工作的良好状态。

图片描述

除了降低数据科研的入门门槛,Docker也可以用于快速创建虚拟环境来隔离不同的Python和其他软件包版本,而不再需要漫长的逐个安装过程。

在这个文章中,我们将会覆盖基本的Docker操作,在你自己的机器上:如何安装,如何利用Docker容器快速启动数据科研。

虚拟机

创建虚拟机的软件技术已经存在的几十年。虚拟机允许你在自己的机器上模拟其他机器环境。比如,你可以在虚拟机上跑Linux,即使你的物理机上跑的是windows。这将让你使用Linux,而不必实际在机器上安装它,它将是完全虚拟运行的,所以你能在windows之中使用Linux。实质上,你可以点击一个程序,然后Linux的桌面就会在Windows之中弹出。虚拟机使用镜像来启动,你必须使用所需要对应的操作系统镜像来启动虚拟机。假如你需要使用Linux,你必须使用包含所有必须文件的Linux镜像来创建这样的Linux环境。

图片描述

一个在Linux上跑Windows的例子

容器

虽然虚拟机运行你在Windows上进行Linux的开发,但是它们也会有一些负面影响。虚拟机启动的时间会更长,会占用显著的系统资源,而且很难基于一个虚拟机镜像之上安装其他软件包,并以此创建新的镜像。Linux容器解决了这个问题,使得多个隔离的环境可以在同一台机器上运行。你可以把容器想象成更快,更方便的方式去使用虚拟机。

不幸的是,容器的使用有点棘手,并且容器的镜像管理和分发并不那么容易。我们所需要的功能是,让我们能快速下载并启动基于特殊的软件包和工具配置的数据科研环境。例如,你可能希望能快速启动一个已经包含了Jupyter,spark,pandas等软件包的镜像。

Docker

Docker容器是基于Linux容器之上的一个封装层,使得容器更容易被管理和分发。Docker也让我们能够更方便的下载对应一系列特定软件包的镜像,并快速启动。同时它也是跨平台的,可以工作于Mac,Windows,Linux。

虚拟环境同样具备这些优点,比如创建隔离化的Python环境。那么Docker比虚拟机环境更加有优势的是哪些:

  • 快速启动。当你需要启动项目并分析数据时,你完全不需要等待任何软件包安装。
  • 良好配置。大多数时候,Python软件包需要其他系统包以及配置的支持。这可能导致一些奇怪的问题。基于Docker,这些都已经被安装和配置完毕。
  • 跨平台一致性。Python软件包是跨平台的,但是部分行为在Linux和Windows上是不一样的,并且部分相关库是无法在Windows上安装的。Docker容器总是运行于Linux环境内,所以它们永远一致。
  • 设立检查点并恢复。你可以在Docker镜像中安装新软件包,然后基于这个检查点创建新的镜像。这样就可以很方便的回滚之后所做的任何改动和配置。

每一个Docker镜像运行都会创建一个Docker容器。对于我们的目的,我们可以在容器内运行Jupyter,并且使用网络浏览器来观察分析我们的数据。

安装Docker

第一步就是安装Docker。在Windows和Mac上有很方便的图形化界面安装程序。下面就是具体规格操作系统下的安装指导:

  • Mac OS
  • Linux
  • Windows

作为安装程序的一部分,你会需要先打开一个命令提示符窗口,或者也被称为终端或者命令行窗口。是一种文本界面,而不是图形化运行的计算机命令交互接口。比如,你即可以通过在windows下双击“notepad”来启动一个文本编辑器,也可以在Linux的终端下键入命令“nano”来实现同样的效果。

每个操作系统都会有相应的预配置好的命令提示符来应用Docker命令。更多信息见如下:

  • Mac OS - 从启动面板来启动Docker快速启动终端。更多细节在此
  • Linux - 启动任意bash终端,Docker都已经准备好
  • Windows- 从桌面上点击启动Docker快速启动终端。更多细节在此
    在接下来的操作中,你也会需要使用同样的命令提示符来执行任意文章提及的Docker命令。

下载镜像

下一步就是下载你所需要的镜像。以下是我们当前已有的数据科研镜像:
- dataquestio/python3-starter – 这个包含了Python 3,Jupyter notebook以及其他很多热门的数据科研库,比如:numpy, pandas, scipy, scikit-learn,nltk.
- dataquestio/python2-starter – 这个包含了Python 2,Jupyter notebook以及其他很多热门的数据科研库,比如:numpy, pandas, scrapy,scipy, scikit-learn,nltk.

你可以通过键入 Docker pull IMAGE_NAME来下载你所需要的镜像。比如,你需要下载dataquestio/python3-starter,你需要在命令提示符里键入docker pull dataquestio/python3-starter。这个的目的就是从Docker hub(比如GitHub)下载镜像文件到你的机器上,然后你就可以启动容器并使用这些镜像。

运行镜像

一旦镜像已经被下载,你就可以开始通过命令Docker run运行它。我们需要设置少数几个参数来保证它正确配置和执行。

  • -p :该标志指定端口号用于我们从本地机器访问容器内的Jupyter服务器
  • -d :该标志指定容器派遣模式,并在后台运行
  • -v :该标志指定Jupyter可以访问存储数据的本地机器目录

这里你应该把/home/vik/notebooks换成你实际存储Jupyter数据的文件夹。并且把dataquestio/python3-starter换成你实际使用的Docker镜像。

执行docker run即可生成Docker容器。它是从你的本地机器上隔离的,你甚至可以把它想象成一个独立的机器。在容器内部,Jupyter将会运行,并且我们可以访问许多其他数据科研软件。

Docker run执行之后会打印输出一长字符串。这个字符串即是你容器的唯一标识,并且它也被用于修改容器,该唯一的标识会把它和其他容器区别开来。从现在开始我们将把它作为容器的标识。

查看Jupyter服务器

假如你当前跑在Linux上,下一步非常简单-直接访问localhost:8888即可,你应该能够看到Jupyter正在执行。如果你是跑在Windows或者OSX上,那么你需要按照之前给出Docker的安装文档指示,使用Docker安装步骤中的docker-machine。假设你的本地机器名为default,那么执行docker-machine ip default将会告诉你当前你的Docker容器的IP地址。假如你机器用的是不同名字,那么简单替换掉命令中的default即可。然后你可以通过CONTAINER_IP:8888来看到你当前Jupyter的运行情况(这里需要把CONTAINER_IP替换为之前查询到的容器IP)。

图片描述

制作Jupyter笔记

在这一步,你可以生成一个新的Jupyter笔记来测试系统的工作情况。尝试执行一段scikit代码,更多示例见此:

from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn import linear_model
import matplotlib.pyplot as plt
%matplotlib inline

lr = linear_model.LinearRegression()
boston = datasets.load_boston()
y = boston.target

predicted = cross_val_predict(lr, boston.data, y, cv=10)

fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show()

增加数据文件

假如你需要往这个环境中添加数据文件,你有三种选择。第一个是把它们放到你之前创建的给Jupyter用的文件夹中。放在这个位置的任意文件都自动能被Jupyter访问到。

第二种方法是使用docker cp命令。Docker CP能够从本地机器中拷贝文件到容器中,反之亦然。假设你想要拷贝一个文件/home/vik/data.csv到容器(其ID为4greg24134)中。你可以输入命令如下docker cp /home/vik/data.csv 4greg24134:/home/ds/notebooks,这就把data.csv拷贝到了容器的notebooks目录下。当然,你可以把文件拷贝到任意位置,把它们拷贝到notebooks目录只是为了让Jupyter访问方便。

第三种是使用Jupyter笔记主页面右上角的上传按钮。你可以选择文件并直接上传到容器中的notebooks目录。

无论你使用哪种方法,你还需要使用下列命令在Jupyter内部加载这些数据文件。

import pandas
data = pandas.read_csv("data.csv")

从容器中拷贝文件

你可能也需要从容器中拷贝文件到你的本地机器上。最简单的办法就是把这些文件放在/home/ds/notebooks文件夹里,这样它们就会被自动镜像到你的本地机器。

另一个选项是同样使用Docker cp。假如你需要拷贝容器(id为4greg24134 )内文件/home/ds/notebooks/data.csv到你本地机器的文件夹/home/vik/。你可以键入如下命令:docker cp 4greg24134:/home/ds/notebooks/data.csv /home/vik/data.csv。

最后一个办法是使用Jupyter的下载。点击浏览器内的任意非笔记格式文件,它就会被下载到你本地机器。假如是需要下载Jupyter笔记文件,那么点击该文件并且选择“Download as”即可下载它到你的本地机器。

安装更多的包

如果你需要在容器内安装你自己的软件包,你可以进入容器并执行任何正常的bash命令。你需要首先执行docker exec来进入容器。Docker exec的执行需要输入指定的容器id以及命令。例如,键入docker exec -it 4greg24134 /bin/bash就会打开容器为id 4greg24134的命令提示符。这里的-it标识是标明我们要保持输入会话并且键入命令。

在执行Docker exec后,你会被放到一个容器内的命令提示符。Python在容器的虚拟环境中已经在运行,它被称为ds,并且应该已经是被激活的。

假设你需要安装任何包,只需要键入pip install PACKAGE_NAME。例如你可以用如下命令安装requests,pip install requests。

当你需要退出容器的命令提示符时,键入exit即可。

关闭docker容器

当工作完成后,我们应当关闭docker容器。使用命令docker rm -f CONTAINER_ID来停止容器。这里的容器id就是之前我们所得到的id。假如你没有,可以使用docker ps来查询。你的Jupyter笔记会仍然存在于本地机器中,即使在容器被关闭之后,它仍会保存在你之前创建的文件夹。

创建容器镜像

容器镜像由Dockerfiles来创建。Dockerfiles会标明哪些包和工具应该被安装到具体的镜像中。你可以通过修改Dockerfiles来变更镜像中的任意默认包和工具。

假如你想基于这个文章中我们所讨论过的镜像来创建新的镜像。你可以贡献它们到Github上,这里包含了dockerfiles。我们也欢迎任何帮助我们改善当前镜像,或者是贡献新的不仅仅是针对Python的工具镜像。

原文链接:How to setup a data science environment in minutes using Docker and Jupyter (译者/王旭敏 责编/仲浩)

关于译者:王旭敏,Nokia开发工程师,关注云计算、高性能或可用等架构、容器等。

评论