目前在在线应用,尤其是无状态的在线应用领域,Docker容器已经成为执行层的事实标准,有大量云服务商提供容器云服务。但在离线计算领域,还很少有服务商提供这样的能力。
但离线计算在实际生产中使用很广,小到一个脚本任务,大到大数据分析;而且离线计算对资源隔离、环境隔离的需求更高,这正是docker容器的优势。因此,阿里云容器服务抽象出离线计算的基本模型,推出了基于Docker容器的离线计算功能。其核心功能是:
- 作业编排
- 作业调度与生命周期管理
- 存储与日志等功能的集成
基本概念
首先介绍一下离线计算的基本概念。下表中列出了离线与在线应用的概念对比。
概念 | 离线应用 | 在线应用 |
---|---|---|
容器 | 任务执行单元 | 服务的执行单元 |
运行历史 | 任务出错重试的执行历史 | 无 |
服务(任务) | 一个特定的功能,可以分割成若干个容器来执行 | 一组功能相同的容器 |
应用(作业) | 若干个任务的组合 | 若干个服务的组合 |
简言之,一个离线作业包含若干个任务,每个任务可以由若干个容器来执行,每个容器可以有多个运行历史;而一个在线应用包含若干个服务,每个服务可以有若干个容器同时服务。
基于DockerCompose的作业编排
跟在线应用一样,我们使用DockerCompose来描述和编排作业。DockerCompose支持Docker的绝大部分功能,比如:
- CPU、内存等资源限制
- 数据卷(Volume)
- 环境变量与标签
- 网络模型、端口暴露等
除此之外,阿里云容器服务还扩展了以下功能:
- 容器数量:每个任务分成多少个容器
- 重试次数:每个容器重试多少次
- 移除容器:容器运行完后是否删除,可选策略是remove_finished(删除完成的容器)、remove_failed(删除失败的容器)、remove_all(删除全部容器)、remove_none(不删除)
- DAG模型的任务依赖:同一个作业的任务之间可以有依赖关系,被依赖的任务会先执行。
下面是一个离线作业的DockerCompose示例。
version: "2"
labels:
aliyun.project_type: "batch"
services:
s1:
image: registry.aliyuncs.com/jimmycmh/testret:latest
restart: no
cpu_shares: 10
mem_limit: 100000000
labels:
aliyun.scale: "10"
aliyun.retry_count: "20"
aliyun.remove_containers: "remove-all"
s2:
image: registry.aliyuncs.com/jimmycmh/testret:latest
cpu_shares: 50
mem_limit: 100000000
labels:
aliyun.scale: "4"
aliyun.retry_count: "20"
aliyun.remove_containers: "remove-finished"
aliyun.depends: "s1"
需要注意的几点是:
- 只支持version2的docker compose
- 需要在作业级别添加标签
aliyun.project_type: "batch"
,没有该标签或标签值不为batch则认为是在线应用 - 不管restart设置为什么值,都会被修改为no
- 用
aliyun.depends
标签指定依赖,可以依赖多个任务,用,
分隔 -
aliyun.retry_count
默认值为3 -
aliyun.remove_containers
默认值为remove_finished
作业生命周期管理
容器状态由容器的运行及退出状态决定;任务状态由该任务中所有容器的状态决定;作业状态由该作业的所有任务决定。
容器状态
- 运行中(Running):容器在运行
- 完成(Finished):容器退出且ExitCode==0
- 失败(Failed):容器退出且ExitCode!=0
任务状态
- 运行中(Running):有容器在运行
- 完成(Finished):所有容器都完成了
- 失败(Failed):有容器失败次数超过给定值
作业状态
- 运行中(Running):有任务在运行
- 完成(Finished):所有任务都完成了
- 失败(Failed):有任务失败了
上述状态都可以通过API获取,方便用户自动化运维。
共享存储
容器之间、任务之间会有数据共享和交换,共享存储可以解决这一问题。比如Hadoop上跑MR作业,是通过HDFS来交换数据的。在容器服务中,可以使用三类共享存储,其特性及应用场景对比如下:
存储 | 优点 | 缺点 | 适用范围 |
---|---|---|---|
OSSFS数据卷 | 跨主机共享 | 读写、ls性能低;修改文件会导致文件重写 | 共享配置文件;附件上传 |
阿里云NAS数据卷 | 跨主机共享;按需扩容; 高性能、高可靠性;挂载速度高 | 成本略高 | 需要共享数据的重IO应用,如文件服务器等;需要快速迁移的重IO应用,如数据库等 |
用户自己集成成三方存储,如Portworx | 将集群内的云盘虚拟成共享的大磁盘;性能高;snapshot、多拷贝 | 需要一定运维能力 | 同NAS |
具体使用数据卷的帮助,可以参考下列文档:
集成日志和监控服务
日志和监控是分析离线作业的重要工具。阿里云容器服务集成了阿里云SLS与云监控功能,只要在编排模板中添加一个标签,就可以将日志收集到SLS,将容器的CPU、内存等数据收集到云监控。具体使用方便请参考下面的文档,这里不再细写。
操作步骤
首先打开容器服务控制台https://cs.console.aliyun.com/,并创建一个集群。
第二步,选择应用->创建应用->使用模板创建,填入上文中的编排模板,并创建应用。
第三步,选择应用->您的应用,可以查看应用的运行状态,如下图所示。