编者注:这篇文章是Swapnil Daingade,Sarjeet Singh和Mitra Kaseebhotla共同努力的结果。
最近,我们很高兴参加了Docker Global Hack#3 。 我们很高兴地宣布,我们在“自由式”类别中获得了第一名,这意味着我们的解决方案必须使用最新Docker版本中的功能,包括Engine和其他Docker OSS项目。 在此博客文章中,我们将详细介绍在共享基础架构上提供具有相同安全性和性能的YARN群集的解决方案。
问题
企业不断努力提高数据中心投资的利用率和回报率。 这种需求导致企业探索将其基础架构整合到一个巨型集群中,而不是几个孤立的集群中。
解
企业目前有几个Hadoop / YARN集群,出于各种原因(安全性,性能等),它们需要分开。 是否可以在共享基础结构上提供具有相同安全性和性能的YARN群集?
最近一个名为Apache Myriad(正在孵化)的项目试图解决此问题。 它使用Apache Mesos作为基础资源调度程序。 当前,它支持在Mesos群集之上运行单个YARN群集。 企业可以在YARN与其他应用程序(例如Web服务器, Spark等)之间共享资源。作为Myriad的积极贡献者,我们正在探索在Myriad中提供多租户和租户隔离的选项。 我们尝试使用实验性网络插件来创建用于网络隔离的覆盖网络。 使用容器,计算隔离是免费的。 对于存储,我们研究了多种选择:1)为每个群集提供自己的存储(环回或连接到容器的原始设备,以及2)通过文件系统权限为单个DFS共享实例提供隔离。
实施细节
YARN由一个称为ResourceManager(RM)的中央守护程序组成。 在YARN上运行的应用程序可以以YARN容器(CPU块,mem块)的形式从RM请求资源。 群集中的每个节点都有一个守护程序,该守护程序管理该节点上的资源,称为NodeManager(NM)。
Mesos是轻量级的资源调度程序。 在Mesos上运行的应用程序称为框架。 与YARN不同,是Mesos向框架提供资源(CPU,mem)。 如果框架可以利用要约,则它接受要约并在要提供资源的节点上启动Mesos任务(进程)。 直到进程终止,Mesos任务才完成。
在Myriad中 ,RM是使用诸如Marathon(开源)之类的元框架启动的。 马拉松接受Mesos的报价,并启动RM作为Mesos的任务。 Myriad在RM流程中运行的代码向Mesos注册为另一个框架。 我们称此代码为Myriad Scheduler。 请注意,由于RM现在已注册为Mesos框架,因此它可以在接受Mesos的报价后启动NM。
Myriad当前不支持RM和NM的Docker容器 。 它还不支持多租户或与其他非YARN应用程序(例如Web服务器)隔离。 以下是我们在黑客马拉松中尝试过的细节。 Mesos部署在物理群集上。 RM和NM位于容器中。 属于同一YARN群集的RM和NM可以相互通信。 属于不同YARN群集的群集无法相互通信。
网络配置和隔离
上图显示了我们如何在物理群集上配置网络。 出于演示目的,我们假设物理群集上运行着三个YARN群集。 我们为每个YARN群集创建一个覆盖物理群集所有节点的覆盖网络。 我们使用Docker的覆盖网络插件。 但是,覆盖网络的成员资格不允许容器与底层网络通信。 这对我们来说是个问题。 如果RM要在Docker容器中运行,则它必须具有向Mesos注册为Mesos框架的功能才能启动NM(Mesos基础结构在底层网络上运行)。
另外,我们希望支持一种配置,其中在多个YARN群集中只有一个分布式文件系统实例( HDFS , MapR-FS等)。 使用此单个DFS实例的YARN群集由文件系统权限隔离。 因此,为了允许Docker容器访问DFS,我们在每个主机上为每个群集创建了一个网桥(就像在安装Docker之后出现的docker0网桥一样。)就像在docker0网桥上一样,配置了NAT,以便容器可以可以轻松访问底层网络,但不能访问属于另一个群集的容器。
此配置允许RM(也充当Mesos框架)向在底层网络上运行的Mesos注册。 图2(下图)显示了在三节点物理群集上看到时该网络配置的外观。 请参阅脚本OnDemandYARNClusters / scripts / docker-create-master.sh和OnDemandYARNClusters / scripts / docker-create-worker.sh以了解其配置方式。
当RM(充当Mesos框架)决定启动NM容器时,它接受Mesos的报价并要求Mesos运行OnDemandYARNClusters / scripts / docker_deploy.sh脚本(在每个物理服务器上都存在)。
该脚本采用三个参数:
- 正在启动的NM容器的Mesos任务ID
- 要连接的覆盖网络。 (请记住,所有物理主机上都可以使用所有覆盖网络)。
- 为NM运行的Docker映像。
该脚本配置存储和网络(将容器连接到正确的网桥,以便除了覆盖网络之外还可以与底层网络通信)。
我们还修改了Myriad代码,以便RM(充当Mesos框架)可以生成用于创建NM Docker容器的命令。 此处提供了针对无数(阶段1分支)的补丁: OnDemandYARNClusters / myriad-docker-hack-day-3.patch
您还可以按照以下步骤使用此补丁程序构建Myriad:
git clone https://github.com/sdaingade/myriad.git
git checkout docker-hack-day
./gradlew clean; ./gradlew build
最后,以下位置还提供了包括Hadoop在内的MapR发行版的Docker文件:
- OnDemandYARNClusters / nm_docker_centos / Dockerfile
- OnDemandYARNClusters / rm_docker_centos / Dockerfile
存储 :我们尝试使用暴露于Docker容器的环回设备来运行DFS(即,每个YARN群集一个DFS实例)。 将来,我们计划尝试在多个YARN群集之间共享DFS的单个实例,并通过使用文件系统权限来提供隔离。
现状:我们能够隔离执行所有部分(例如,网络,RM和NM创建,存储配置等)。 集成期间我们确实用完了时间,但是我们非常有信心,只要再多花一点时间,我们就能使这项工作端到端地进行。
在此博客文章中,您了解了我们在Docker Global Hack Day上提出的解决方案,该解决方案用于在共享基础架构上提供具有相同安全性和性能的YARN群集。
如果您对我们的解决方案有任何疑问,请在下面的评论部分中提问。
翻译自: https://www.javacodegeeks.com/2015/11/docker-global-hack-day-3-on-demand-yarn-clusters.html