【翻译】Voidbox: Docker on YARN

    原文链接: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做成一个永久的服务以支持长时任务
  • 提供对长时服务的支持
posted on 2015-11-14 14:37  晓O(∩_∩)O~  阅读(2334)  评论(0编辑  收藏  举报