原文链接:Voidbox – Docker on YARN

读了此文,收获良多,翻译之,方便以后查看~

文章介绍了Hulu北京大数据团队开发的Docker On YARN实现:Voidbox,一种基于Docker,运行在YARN上的DAG计算框架,已在hulu多条生产线上使用,效果明显。

-------------------------------------------------分割线------------------------------------------------------------------------------------------------

1.设计开发Voidbox的动机

YARN是Hadoop2.0之后的使用的分布式资源管理系统,它主要负责为MapReduce、Spark等高层应用分配管理整个集群的资源。但是现在很多已存在的工作在YARN的框架都是在某个特定的环境下运行的。所以如何能够在任意的复杂环境下支持用户的个性化应用成为了一个难题。

Docker的出现为解决这个问题指明了方向。Docker是一种很流行的容器虚拟化技术,它提供了一种在容器中运行任意应用的方法。Docker是一个用来开发、移植、运行应用的开源平台,基于Docker技术可以把应用作为一个轻量级的容器虚拟运行在任意地方。

为了继承Docker和YARN这两者的优点,Hulu北京大数据团队开发了Voidbox。Voidbox使得任意封装在docker镜像中的应用可以像MapReduce、Spark这样的应用一样运行在YARN集群中。Voidbox带来了如下便利:

  • 方便了分布式应用的创建

Voidbox解决了几乎所有的在分布式计算系统中的问题,例如,集群发现,弹性的资源分配,任务协作,灾难恢复等。利用Voidbox设计的接口,可以很方便的部署实现一个分布式应用。

  • 简化部署

通常情况下,为了适用于各种复杂的环境,我们必须创建维护各种专用的VM,这些VM一般都很大,很难部署。但是利用Voidbox,我们就可以很轻易的实现资源分配,也省去了额外的维护工作。

  • 提高的集群的利用率

利用Voidbox我们可以在同一个集群上部署Spark/MR应用,也可以部署其他的Voidbox应用,提高了集群的资源利用率。

Voidbox对Docker运行过程中的容器DAG任务实现了良好的支持。Voidbox还提供了多种方法以实现在生产环境和测试环境下的应用提交,而且它还可以和Jenkins,GitLab联合使用,利用Docker注册器来建立起一套开发、测试、自动发行的机制。

2.Voidbox的架构

2.1YARN架构

    YARN使得一个集群的多个应用动态共享集群的资源,如下图所示是YARN的整体架构。

如上图所示,一个client向Resource Manager提交一个job。Resource Manager根据所有应用对资源的需求来分配资源。Application Master负责一个应用内部任务的的时序安排执行。

每个模块的功能:

    • Resource Manager:控制集群的资源管理和作业时序。
    • Node Manager:运行在集群的计算节点上,控制单个机器上的任务执行,收集执行状态并且和Resource Manager保持心跳通信。
    • Application Master:负责向YARN发送资源请求,然后把请求到的资源分配给正在运行的任务。
    • Container:是一个抽象的概念,一个容器主要负责协调内存、cpu、硬盘、网络等资源。
    • HDFS:YARN集群的分布式文件系统。

2.2Voidbox架构设计

在Voidbox的架构中,YARN负责集群的资源管理,Docker是运行在操作系统之上的任务执行引擎,与Docker Registry一起协同工作。Voidbox把用户的编程代码翻译成Docker的基于容器的DAG任务,这些任务根据所需申请资源并且按照DAG的方式执行。

如上图所示,每个方块都代表一个机器,每个机器上面都有一些执行模块。为了使这个模型更清晰,我们把这些模块划分成三部分,Voidbox和Docker的各个模块的功能如下:

Voidbox模块:

    • Voidbox Client:通过Voidbox Client,用户可以提交、停止一个Voidbox应用。一个Voidbox应用包含多个Docker 作业,一个Docker作业包含多个Docker任务。
    • Voidbox Master:事实上,它就是YARN上的Application Master,负责向YARN申请资源,然后把资源分配给Docker作业。
    • Voidbox Driver:负责一个Voidbox 应用的时序控制。Voidbox支持Docker的容器DAG任务时序,在不同的任务之间还可以插入一些其他的代码。因此Voidbox Driver即可以控制DAG时序,也可以执行用户代码。
    • Voidbox Proxy:YARN和Docker引擎之间的桥梁,负责把YARN的各种命令传输给Docker引擎。
    • State Server:负责维护Docker引擎的健康状态信息,记录可运行任务的机器列表。

Docker模块:

    • Docker Registry:Docker镜像存储,实现Docker镜像内部的版本控制。
    • Docker Engine:Docker容器执行引擎,从Docker Registry获得特定的Docker镜像并且启动一个Docker容器。
    • Jenkins:和GitLab协作,当应用代码更新之后,Jenkins将会自动测试、打包、产生Docker镜像然后上传给Docker Registry,完成应用的自动发行过程。

2.3Voidbox运行模型

Voidbox提供了两种应用运行模式:yarn-cluster模式和yarn-client模式。

在yarn-cluster模式下,控制组件和资源管理组件运行在YARN集群上面。当提及Voidbox应用之后,VoidboxClient任何时候退出都不会对正在执行的应用产生影响。这种模式一般应用在生产环境下。

在yarn-client模式下,控制组件和资源管理组件运行在VoidboxClient上,其他的组件运行在集群上。用户可以看到应用状态的更加详细的日志。当VoidboxClient退出之后,集群上对应的正在执行的应用也会突出。这种模式一般在调试时使用。

下面对这两种模型实现进行一个简单的介绍:

    • yarn-cluster模式

如上图所示,VoidboxMaster和VoidboxDriver都运行在集群上,VoidboxDriver负责控制逻辑,VoidboxMaster则负责资源管理。

    • yarn-client模式

如上图所示,VoidboxMaster是在集群中运行的,VoidboxDriver则是在VoidboxClient运行的,用户可以在IDE中提交调试Voidbox应用。

2.4Voidbox运行过程

    提交一个Voidbox应用的过程和这个Voidbox应用的生命周期如下:

用户利用Voidbox SDK编写一个应用并产生java代码,然后提交给YARN集群;

当收到一Voidbox应用之后,Resource Manager将会为Voidbox Master分配资源,然后启动它。接着Voidbox Master启动Voidbox Driver,Voidbox Driver调用Voidbox Master的接口来启动计算节点上的Docker任务;

Voidbox Master向Resource Manager请求资源,Resource Manager根据YARN集群的状态分配资源。Voidbox Master启动YARN容器上的Voidbox Proxy,并且和Docker引擎通信以启动Docker容器。

用户的Docker任务是运行在Docker容器内的,日志输出在一个本地文件上。用户通过YARN的WEB端可以看到实时的应用日志。

当所有的Docker任务都完成之后,日志将会汇总给HDFS,用户可以通过History Server来查看一个应用的日志信息。

2.5Docker和Yarn在资源管理上的集成

    YARN在集群中的主要作用是一个统一的资源管理器,主要职能就是负责所有机器的资源管理。Docker作为一个容器引擎也有类似的功能,因此如何把这两者的资源管理功能集成到一起就显得非常重要。

在YARN中,用户的任务只能运行在YARN容器中,Docker容器也只能由Docker引擎管理。这样造成的结果就是一些有Docker容器运行的程序脱离了YARN的管理,破坏了YARN的统一管理和统一时序原则,从而造成资源泄漏问题。为了使YARN能够管理控制Docker容器,我们就需要再YARN和Docker引擎中间建立一个代理层。这样是VoidboxProxy产生的缘由,通过VoidboxProxy,YARN可以管理Docker容器的生命周期避免资源泄漏。

为了更加清楚的了解VoidboxProxy,我们以停止Voidbox应用为例。当一个用户需要终止Voidbox进程时,YARN将会会有应用的所有资源,此时,YARN将会向相关的机器发送终止信号。相应的Voidbox Proxy将会捕获这个信号,然后停止Docker引擎内的Docker容器以进行资源回收。

3.容错处理

    虽然Docker已经有一些稳定的发行版本,但是由于生产环境的多样性,在运行的过程中也肯呢过产生一些不稳定的因素,造成错误。我们也考虑到了Voidbox的多层容错机会来保证Voidbox的高可用性。

  • Voidbox Master的容错处理

加入Resource Manager发现Voidbox Master崩溃,它将会通知NodeManager去回收所有属于这个Voidbox应用的YARN容器,然后重启Voidbox Master。

  • Voidbox Proxy容错处理

假设VoidboxMaster发现VoidboxProxy崩溃,它将会代表Voidbox Proxy回收Docker容器。

  • Docker容器容错处理

每个Voidbox应用都可以配置一个最大错误尝试次数,当Docker容器崩溃时,VoidboxMaster将会根据Docker容器退出错误码来进行相应处理。

4.编程模型

4.1DAG编程模型

    Voidbox提供了基于容器的DAG编程模型。如下所示:

如上图所示,这个Voidbox应用中有4个作业,每个作业可以配置它自己所需的cpu、内存、Docker镜像和并行度等资源。Job3要等到Job1和Job2结束才能执行,Job1、Job2、和Job3是分阶段执行的,用户可以在阶段之间插入自己的代码,组后才开始执行Job4.

4.2以shell命令模式提交任务

    在大多数情况下,我们都想直接运行一个单独的Docker容器任务而不想编写程序。因此Voidbox也提供了对shell模式描述和提交Docker容器任务。事实上,这也是DAG编程模型的一种实现。例如:

docker-submit.sh \

-docker_image centos \

-shell_command “echo Hello Voidbox” \

-container_memory 1000 \

-cpu_shares 2

上述shell脚本将会提交一个任务,运行的Docker镜像名字叫做“centos”,执行“echo Hello Voidbox”命令,资源需求为1000MB内存,2个虚拟cpu内核。

5.Voidbox实际应用

    目前我们可以在YARN集群上运行Docker、MapReduce、Spark和其他的应用。在HULU内也有很多使用Voidbox的短时任务:

  • 自动测试处理

和Jenkins、GitLab以及内部的DockerRegistry协同工作,当应用代码更新时,Jenkins将会完成自动化测试、打包程序、重新生成Docker镜像,然后传送给内部的DockerRegistry。

  • 并行化复杂任务

测试框架一般用来测试组件的可用性。这个工程是由Puby/Java编写,并且有很复杂的依赖关系。因此我们需要维护2层Docker镜像,第一层镜像是作为系统软件的基础镜像层,第二层是业务层。我们发布了一个测试框架的Docker镜像,然后使用一些时序控制软件来有规律地启动Voidbox应用。

人脸识别是一个录像分析应用。这个系统是由C语言编写并且内部含有许多图像相关的库。这个可以使用Voidbox来优化:首先把所有的人脸识别程序打包成一个Docker镜像,然后编写Voidbox应用来处理这些录像。Voidbox解决了复杂的机器环境和并行化控制的难题。

  • 建立复杂的工作流

有很多任务之间有相互依赖,例如一个任务需要首先加载用户行为,然后分析用户行为。这两个任务之间有承接依赖关系,我们可以使用Voidbox容器编程很容易地解决这个问题。

6.与Yarn2.6.0的DockerContainerExecutor不同之处

DockerContainerExecutor在Yarn2.6.0版本的时候发行的,它现在还不成熟,只是一个默认执行单元之上的封装层。同一个集群上的DockerContainerExecutor很难共存。

Voidbox特点:

  • DAG编程模型;
  • 可配置的容器层的容错机制;
  • 多样化的运行模式,考率到了开发环境和生产环境;
  • 与YARN集群上其他Hadoop作业分享资源;
  • 图形化的log查看工具。

7.展望

  • 支持YARN的其他版本
  • Voidbox Master容错机制中,保持已经运行成功的那些任务的元信息来减少重试的开销
  • 把VoidboxMaster做成一个永久的服务以支持长时任务
  • 提供对长时服务的支持

【翻译】Voidbox: Docker on YARN的更多相关文章

  1. Docker on YARN在Hulu的实现

    这篇文章是我来Hulu这一年做的主要工作,结合当下流行的两个开源方案Docker和YARN,提供了一套灵活的编程模型,目前支持DAG编程模型,将会支持长服务编程模型. 基于Voidbox,开发者可以很 ...

  2. docker 与 yarn

    有时我们的项目是使用yarn去发布的,当需要使用docker发布这个项目时,安装yarn是必须的,但是平时使用的npm install -g yarn此时却不可用 从网站上找到解决的方法 地址:htt ...

  3. 【翻译】Docker Compose 与Docker Stack的不同

    翻译原文 Docker引擎在1.12 版本集成了Docker Swarm,  带来了一些新工具. 现在可以无需安装 Docker Compose, 就可以利用docker-compose.yml 文件 ...

  4. Vagrant Docker Composer Yarn 国外资源下载慢或失败的问题

    1 问题 有时,我们请求国外资源时,下载巨慢,甚至失败.如: cd vue-devtools/ $ yarn install 进行到 cypress.... 时,可能失败. 2 解决 次日凌晨(7-8 ...

  5. Hadoop数据操作系统YARN全解析

    “ Hadoop 2.0引入YARN,大大提高了集群的资源利用率并降低了集群管理成本.其在异构集群中是怎样应用的?Hulu又有哪些成功实践可以分享? 为了能够对集群中的资源进行统一管理和调度,Hado ...

  6. 关于docker

    摘要: 最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术.为此,我们列了一个路线图供大家学习Docker和阿里云容器服务.这个列表包含了一些社区的优秀资料和我们的原创文章.我们会随着 ...

  7. 【转】深入 Docker:容器和镜像

    在本专栏往期的 Flux7 系列教程 里,我们已经简单地探讨了 Docker 的基本操作.而在那篇教程中,我们一直是简单地将容器当成是"正在运行的镜像",并没有深入地区分镜像和容器 ...

  8. [CoreOS 转载] CoreOS实践指南(七):Docker容器管理服务

    转载:http://www.csdn.net/article/2015-02-11/2823925 摘要:当Docker还名不见经传的时候,CoreOS创始人Alex就预见了这个项目的价值,并将其做为 ...

  9. 【云计算】docker run详解

    Docker学习总结之Run命令介绍 时间 2015-01-21 17:06:00                                               博客园精华区       ...

随机推荐

  1. CAS (1) —— Mac下配置CAS到Tomcat(服务端)

    CAS (1) -- Mac下配置CAS到Tomcat(服务端) tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: cas4.1.2 cas-clie ...

  2. 预则立&&他山之石--团队计划、访谈优秀前辈

    团队计划&访谈内容 一.团队计划 序号 任务内容 计划完成时间 主要负责人 备注 1 对接教师报课系统 决定是否重构代码 2016.10.16 陈少铭.黄家俊 阅读CourseManageme ...

  3. 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究

    来源:CSDN    http://www.csdn.net/article/2014-09-15/2821685-exploring-of-the-php 作者:王帅 摘要:PHP作为一门简单而强大 ...

  4. SpringBoot(七)_统一异常处理

    我感觉看了这节课,给我的思考还是很多的,感觉受益良多.废话不多说,一起学习. 统一的 外层结构返回 这样利于代码看着也规范,前端处理也统一 # 错误返回 { "code": 1, ...

  5. dbgrid控件如何能在左边显示行号?

    procedure TMSWageEdit.aqyMSWageEditCalcFields(DataSet: TDataSet);begin  inherited;  with DataSet do  ...

  6. BZOJ 3173 最长上升子序列(树状数组+二分+线段树)

    给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? 由于序列是顺序插入的,所以当前插入的数字对之 ...

  7. BZOJ3277 串(后缀数组+二分答案+主席树)

    因为不会SAM,考虑SA.将所有串连起来并加分隔符,每次考虑计算以某个位置开始的子串有多少个合法. 对此首先二分答案,找到名次数组上的一个区间,那么只需要统计有多少个所给串在该区间内出现就可以了.这是 ...

  8. BZOJ3156 防御准备(动态规划+斜率优化)

    设f[i]为在i放置守卫塔时1~i的最小花费.那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]. 显然这是个斜率优化入门题.将不与i.j同时相关的提出,得f[i]=min ...

  9. 【比赛】NOIP2017 时间复杂度

    恶心的模拟题,考场上犯了一堆错误,多组数据清空没清完.数组开小...民间都是50分,结果CCF90.. 考完后随便改改就过了,还好只少了10分,如果真的是50,我估计会疯掉. 因为考场的时候没写好,所 ...

  10. 沉迷AC自动机无法自拔之:穿越广场 square

    如标题所言,我已经沉迷于AC自动机无法自拔了... 这又是一道AC自动的题,红红火火恍恍惚惚 穿越广场 [问题描述] L 国的仪仗队要穿越首都广场了.首都广场可以看做是一块 N*M 的矩形网格,仪仗队 ...