[原] 容器定义应用:数据科学的容器革命

更新于 2016-11-13  约 18 分钟

title

概述

随着容器化技术的兴起,数据科学现在最大的一场运动已经不是由一个新的算法或者统计方法发起的了,而是来自Docker的容器化技术。通常,数据科学被认为研究成果立即应用到生产环境都是比较缓慢的一个过程。本文将介绍利用容器技术如何加速数据科学在生产环境中的实际应用。

clipboard.png

瓶颈

1. 环境部署一致性

保持数据科学环境一致性通常都是一件异常痛苦的事情,在不同的机器之间同时部署即使是用 Python 的 Conda 和 Virtualenv 或者 R 的 CRAN 和 packrat 的包依赖虚拟化技术,也会遇到不同操作系统(比如 CentOS、Ubuntu、Mac OS、Windows)的底层c库缺失等问题。(国内的现状是很多公司逼迫Data Scientist 变成 DevOps,美其名曰:全栈。。)

2. 服务弹性与性能

由于数据科学套件一般比较复杂,从底层的 Hadoop 分布式架构、到顶层的 Shiny Server,这一系列服务的智能运维部署都是一个问题。尤其是 Shiny Server 的开源版本现在默认是只支持单机单线程的处理(其实就是nodejs内核),通常每次请求处理只是在几毫秒之间。这对于一个小应用一般并不会出现太问题,不过更常见的场景是我们需要在生产环境上部署高性能的 shiny server,此时 shiny server 的单机性能就成了一个问题。

解决方案

事实上,容器同时为加速数据科学的应用提供了一揽子解决方案:

  1. 将复杂的环境依赖化繁为简

  2. 简化集群配置与管理的复杂度

  3. 标准交付、研究结果可重复、便于成果分享

  4. 快速部署、快速扩展

  5. 明确运维、开发职责

为什么使用容器

可重复研究

一方面,容器就像一个轻量级的虚拟机,当我们启动虚拟机的时候通常都要花几分钟,但是Docker容器通常只要几毫秒就启动了。因此,你跑容器和跑本地应用从速度上来讲基本没什么差。每次我们跑容器,容器的环境都是标准化的,这也意味着它为我们带来了可重复性研究的机会。这些容器可以一致部署在 Mac、Windows、Linux 上,因此协同共享变得非常得简单。

无状态研究

对于个人而言,好处之一就是减少了R、Python生态组件安装时带来的痛苦。如果你在容器中使用Python或R,之前所有的环境一致性问题就都灰飞烟灭了。如果我们使用容器技术,就可以在容器中肆无忌惮地使用新包,因为即使出现意外导致容器不可用了,我们只需要重跑一个容器就可以了。

弹性高可用

另一方面,对于整个数据科学套件而言,在架构上越来越流行微服务对原来SOA的架构进行进一步解耦,以便于每一个模块可以独立迭代,小步快跑。而容器技术基于轻量级的进程,使得我们可以快速扩展计算资源实现分布式计算并且轻松管理。

以 Shiny-Server 为例,吐槽Shiny-Server的单机能力其实没什么意义,这就好像你在吐槽tornado和nodejs的性能不行?但是明明这两个Web框架就是根据Epoll的IO复用,故意设计成异步单线程的模型来应对高并发业务场景的,正确的使用姿势其实是搭配 Nignx反向代理 + Supervisor + 多个服务器实例。如果是 Tornado、Nodejs 跑单个服务也跪了,那Python和JS又得躺枪。Docker化之后,这些都可以一起用docker-compose.yml的配置文件来描述,然后一键启动整个集群服务,这样一来就获得了商用版本的Shiny-Server的主要特性了。

shiny.png

和运维划清界限

在实际生产中,使用Docker之后,运维只需要定义好基本的镜像的Dockerfile,而不用处理具体的开发产生的依赖包问题。数据部门可以引用运维提供的基础镜像,在此基础上自行添加需要的依赖包。一面解脱了运维不必要的负担,另一方面也提升数据部门对项目的掌控力,从而提升整个团队的效率。

数据科学镜像

R + Docker = Rocker

rocker.png

Rocker 是一个组织管理R语言Docker镜像的项目。Rocker提供了一系列用于不同场景下的R 镜像。

这些镜像是构建在 Debian OS的基础之上的,基础镜像由r-base(通用),r-devel(开发者),rstudio(含rstuido服务器)这三类构成。

用例镜像有:

  1. hadleyverse镜像:包含了hadley大人所经营的rstudio开发的相关R包,包括rmarkdown、 pandoc、knitr、shiny、ggplot2、 dplyr、 tidyr、devtools、 httr 等等,这基本可以满足大多数人的需求。

  2. ropensci镜像:在hadleyverse的基础上,又扩展了 rOpenSci 项目所涉及的包,让各领域的数据科学研究如虎添翼。

社区镜像则包括:

  1. r-java镜像:在r-base基础上加入了 Java 8 和 rJava包,用来和java做各种交互。

  2. r-pandoc镜像: 在r-base基础上加入了 pandoc,主要用来写作。

  3. r-ssh镜像:在r-base基础上加入了 SSH客户端,让我们可以通过SSH登陆到这个R容器中。

除了 Rocker 之外,我们还可以使用一些其他第三方镜像:

  • docker-mro镜像 通过微软的Open R 优化 R 底层的矩阵运算,自动利用起多CPU的计算性能。

  • shrektan/shiny 镜像 自带了 Shiny-server和rstudio以及其他常见R包,用来部署服务器非常方便。

依赖于这些开源镜像,我们就可以快速组合镜像搭建所需要的R语言计算环境,并且不会因为每台电脑的操作系统不一样而产生一些不必要的问题。

Python

jupyter 为Python科学计算环境虚拟化提供了诸多镜像,我们可以根据不同的需要选择相应的镜像。

  • all-spark-notebook

  • base-notebook

  • datascience-notebook

  • minimal-notebook

  • pyspark-notebook

  • scipy-notebook

基本上我们在科学计算环境中用到的包都可以在这里找到,如果需要安装更多的包,我们亦可以直接在notebook中输入,比如

%% bash
conda install financer

正确安装后,直接重启内核即可。不过因为容器的无状态,所以还是建议大家在Dockerfile里面修改,或者在conda安装之后包后,自行docker commit来持久化镜像。

一揽子解决方案

阿里云其实为为数据科学还提供了一揽子解决方案,执行下面命令,你可以把科学计算全套带回家。

docker pull registry.aliyuncs.com/alicloudhpc/toolkit

其中包含了

  • 图像识别:OpenCV

  • 机器学习工具:Cuda、Theano、R、Caffe等等

  • 数值计算:Numpy、Scipy、OpenBLAS、Octave

  • 配置和监控:lspci、numactl、perf、iostat、netstat

  • 开发工具:Gcc/g++、JDK、CUDA、 OpenMPI 、OpenCL、 Python 、Lua

自行脑补一下自己为了"深度学习"在一台ubuntu上安装一天都没搞定和这里一键搞定的差距。。

实战

现实并不完美,对于这些固有的镜像,我们需要如何定制呢?其实,我们可以去查看这些开源镜像都是通过Dockerfile制作的。通过修改 Dockerfile,我们就可以根据自己的需要重新建立一些私有镜像,然后上传到公有或私有的Registry上和其他人共享镜像了。

由于国情问题,在制作容器的时候,我们最好修改一下我们的apt-get源(科学计算推崇操作系统使用 Ubuntu14.04 或 Debian)。

cp /etc/apt/sources.list /etc/apt/sources.list.back
vi /etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-proposed main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ trusty-updates main multiverse restricted universe

R 则中可以通过参数修改CRAN源:

install.packages("some_pakcage",repos='https://mirrors.tuna.tsinghua.edu.cn/CRAN/')

Python的conda源则可以这样修改:

%% bash
conda config --add channels 'https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/'
conda config --set show_channel_urls yes

这样一来我们的整个容器的包管理加载速度就可以有一个质的提升。

文末放一个 Minecraft 版本的 Docker管理器,仅供娱乐。

参考资料

更优阅读体验可直接访问原文地址:https://segmentfault.com/a/11...
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog...,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio
商业使用请联系作者。

阅读 3.1k更新于 2016-11-13

推荐阅读
FinanceR
用户专栏

循环写作,持续更新,形成闭环,贵在坚持

1003 人关注
59 篇文章
专栏主页
目录