在阿里云容器服务中运行离线作业

目前在在线应用,尤其是无状态的在线应用领域,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

具体使用数据卷的帮助,可以参考下列文档:

  • 在阿里云容器服务上使用OSS数据卷(Volume)
  • 在阿里云容器服务中使用NAS(NFS)数据卷
  • 用OSS数据卷实现wordpress附件共享

集成日志和监控服务

日志和监控是分析离线作业的重要工具。阿里云容器服务集成了阿里云SLS与云监控功能,只要在编排模板中添加一个标签,就可以将日志收集到SLS,将容器的CPU、内存等数据收集到云监控。具体使用方便请参考下面的文档,这里不再细写。

  • 集成日志服务
  • 容器监控服务

操作步骤

首先打开容器服务控制台https://cs.console.aliyun.com/,并创建一个集群。

第二步,选择应用->创建应用->使用模板创建,填入上文中的编排模板,并创建应用。

第三步,选择应用->您的应用,可以查看应用的运行状态,如下图所示。

时间: 2016-08-11
Tags: docker

在阿里云容器服务中运行离线作业的相关文章

在阿里云容器服务中使用定时任务

定时任务是常见需求.普遍的做法是,选择一台或几台机器,通过crontab实现定时任务.但是对于大规模或大量的定时任务,这种做法的缺点非常多,比如: 可靠性低,一台机器宕机,该机器上的定时任务就无法执行了 没有调度功能,机器之间的负载可能不均衡 没有重试机制,任务可能运行失败 无法运行大规模分布式任务 阿里云容器服务在离线任务的基础上,增加了定时任务的功能,通过简单的描述,解决了上述问题.关于离线任务的细节,请参考在阿里云容器服务中运行离线作业. 只有10月25号之后升级了agent版本或新创建的

当Docker遇到数据库:在阿里云容器服务中使用RDS

Docker与持久化服务 最近一段时间以来,微服务架构和Docker成为了技术社区的"网红".其背后的原因是将微服务与Docker的结合在一起对现有的软件生命周期从架构设计.开发测试到运维迭代构成了一种"颠覆性"的力量:微服务鼓励开发者将整个软件解构为较小的功能组件:每个组件能够独立开发.运维.伸缩和容错:组件之间通过标准的服务接口进行通信,而组件可以选择最适合的技术栈来实现.而容器技术进一步拓展了这种解耦性,它能够将软件与其部署环境分离,利用容器敏捷和可移植的使得

在阿里云容器服务中使用NAS(NFS)数据卷

在阿里云容器服务中使用NAS(NFS)数据卷 Docker的特性,决定了容器本身是非持久化的,容器被删除后其中的数据也一并被删除了.Docker提供数据卷(Volume),通过挂载宿主机上的目录来实现持久存储. 但宿主机上的数据卷有很大的局限性 容器在机器间迁移时,数据无法迁移 不同机器之间不能共享数据卷 为了解决这些问题,阿里云容器服务提供第三方数据卷,将各种云存储包装成数据卷,可以直接挂载在容器上,不同容器间可以共享,并在容器重启.迁移时自动重新挂载. 在上一篇文章中,我们介绍了如何使用OS

容器服务--如何在阿里云容器服务上运行基于TensorFlow的Alexnet

AlexNet是2012年由Alex Krizhevsky使用五层卷积.三层完全连接层开发的CNN网络,并赢得了ImageNet竞赛(ILSVRC).AlexNet 证明了CNN在分类问题上的有效性(15.3%错误率),而此前的图片识别错误率高达25%.这一网络的出现对于计算机视觉在深度学习上的应用具有里程碑意义. AlexNet也是深度学习框架常用的性能指标工具,TensorFlow就提供的alexnet_benchmark.py可以测试GPU和CPU上的性能.我们尝试基于AlexNet在阿里

利用Docker和阿里云容器服务轻松搭建分布式TensorFlow训练集群(上)

本系列将利用Docker技术在阿里云HPC和容器服务上,帮助您上手TensorFlow的机器学习方案 第一篇:打造TensorFlow的实验环境 第二篇:轻松搭建TensorFlow Serving集群 第三篇:打通TensorFlow持续训练链路 第四篇:利用Neural Style的TensorFlow实现,像梵高一样作画 第五篇:轻松搭建分布式TensorFlow训练集群(上) 本文是该系列中的第五篇文章, 将为您介绍如何在本机以及HPC和阿里云容器服务上快速部署和使用分布式TensorF

利用Docker和阿里云容器服务部署高可用Ghost博客集群

简介 Ghost是一个流行的开源博客平台(Open source blogging platform),基于 Node.js 构建,博客内容默认采用 Markdown 语法书写,给用户提供一种更加纯粹的内容写作与发布平台. Ghost的部署和运维需要一定的Web开发基础,利用Docker技术可以大大简化Ghost的部署和更新.Docker Hub上面也提供了Ghost官方镜像 使用Docker镜像,不懂得Node.Js的同学也可以分分钟在本地或阿里云容器服务上搭建起一个单节点的Ghost博客,但

Python应用容器化(二)----使用阿里云容器服务部署应用

前言 我们曾经在Python程序容器化(一)中介绍了如何将一个克隆版Twitter程序(retwit-py)容器化,并使用docker-compose运行于宿主机上.对于经典的Web程序,处理前端请求的Web服务通常都是可扩展伸缩的.生产环境中,随着访问量的不断增长,需要部署多个Web服务实例,并通过负载均衡统一对外进行服务.本文将会介绍如何使用阿里云容器服务将retwit-py改造为贴近生产环境的系统并部署. 阿里云容器服务 容器服务是一项高性能可扩展的容器管理服务,支持在一组阿里云云服务器上

阿里云容器服务新增支持Kubernetes编排系统,性能重大提升

阿里云容器服务提供了面向企业客户的技术能力,为企业应用容器化提供了迁移工具和咨询服务.深度学习.区块链等应用解决方案,以帮助企业优化现有IT投资和加速业务创新. 10月12日云栖大会上,阿里云专有云新版本(飞天专有云敏捷版2.0)宣告了对Kubernetes的支持:日前,公共云容器服务也宣布了开放支持Kubernetes 1.8.1 版本的托管服务,并且成为全球首批通过Kubernetes一致性认证的厂商之一.作为容器编排系统的两大流派, Kubernetes和Swarm的重要性不言而喻.融合了

区块链Hyperledger Fabric在阿里云容器服务Kubernetes中的进阶使用技巧(一)

我们在支持用户在阿里云容器服务Kubernetes集群中使用容器服务区块链Hyperledger Fabric配置部署解决方案.或者使用自建的基于Hyperledger Fabric的区块链方案的过程中,逐渐积累了一些相关的进阶使用经验.技巧和最佳实践,涵盖了系统设计.资源规划.服务使用.错误诊断.运营维护等方面,适用于区块链Hyperledger Fabric应用和方案的开发测试.以及生产部署等用途.这些内容将以系列文章的形式陆续发布并更新,同时欢迎有兴趣.有经验的朋友不吝指正. 利用区块链解