(续) 为什么用Yarn来做Docker容器调度引擎
Posted hadoop123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(续) 为什么用Yarn来做Docker容器调度引擎相关的知识,希望对你有一定的参考价值。
没想到在群里给人的回复整理出来的内容,发到微博上发现对大家还是有帮助的。原文只是纯粹从开发的角度来看的,这里再补充补充几点生态方面的:
1. Yarn 因为诞生于Hadoop这个大数据的始作俑者项目,所以在大数据领域具有先天优势。
和HDFS有天然的集成。其上支撑了Spark,MR等大数据领域的扛顶之座,最近发布版本也明显加快,对于长任务的支持也越来越优秀。说了这么多,就是说,Yarn的社区绝对不用担心,Yarn的发展自然也不用担心。
2. Yarn之前之所以没有脱离大数据生态,成为一个通用的资源管理调度组件(虽然一开始他就是朝着这个目标的),我觉得有两点:
习惯的力量。因为Yarn是从MR里剥离出来的,大家自然而然的认为Yarn必须活在Hadoop生态群里。我在之前的一篇课程里,反复强调,Hadoop是一个软件集合,包含分布式存储,资源管理调度,计算框架三个部分。他们之间没有必然的关系,是可以独立开来的。
Yarn确实对HDFS有些耦合,比如ContainerLocalization等就需要HDFS的支持。这个问题还是比较容易解决的。
固有的认为Yarn适合批量任务的调度,而不适合服务。其实从13年开始Yarn社区就一直在加强这块。到目前的2.6,2.7版本,我认为是足以支持长任务的。
说到长任务,我之前在群里也和人有讨论,并做了下总结,
Yarn做long running services 需要考虑一下几个点:
1. Fault tolerance. 主要是AM的容错。
2. Yarn Security. 如果开启了安全机制,令牌等的失效时间也是需要注意的。
3. 日志收集
4. 还有就是资源隔离和优先级。这个我觉得可以通过容器能很好的解决。
关于这块可以参考Jira https://issues.apache.org/jira/browse/YARN-896.
我看这个Jira 13年就开着了。说明这事还是需要一个过程。
AM容错,我看从2.4版本(看的源码,也可能更早的版本就已经支持)就已经支持 keep containers across attempt 的选项了。什么意思呢?就是如果AM挂掉了,在Yarn重新启动AM的过程中,所有由AM管理的容器都会被保持而不会被杀掉。除非Yarn多次尝试都没办法把AM再启动起来(默认两次)。 这说明从底层调度上来看,已经做的很好了。
第二个是Yarn以及HDFS的安全令牌机制,有个失效时间。这个就不具体阐述。总之是因为一开始确实没有给LRS程序考虑。
日志收集在2.6版本已经是边运行边收集了。
资源隔离的话,Yarn做的不好,目前有效的是内存,对其他方面一直想做支持,但一直有限。这估计也是很多最后选择Mesos的缘由。但是现在这点优势Mesos其实已经荡然无存,因为Docker容器在资源隔离上已经做的足够好。Yarn和Docker一整合,就互补了。
容器技术使得所有应用可以被操作系统运行起来。并且可以吻合Yarn内核对资源控制的要求。但是我们可能需要对被容器包括起来应用更细致的控制。 我们先来看两个概念。
哑应用:所谓哑应用指的是无法和分布式系统直接进行交互,分布式系统也仅仅透过容器能进行生命周期的控制,比如关闭或者开启的应用。典型的比如mysql,nginx等这些基础应用。他们一般有自己特有的交互方式,譬如命令行或者socket协议或者HTTP协议。
伴生组件:因为有了哑应用的存在,操作系统为了能够和这些应用交互,所以有了伴生组件的存在。这些伴生组件和哑应用具有相同的生命周期。伴生组件其实是哑应用的Proxy,从而使得哑应用可以和分布式系统进行交流。典型的比如,某个服务被关停后,该事件会被操作系统获知,操作系统会将该事件发送给Nginx的伴生组件,伴生组件转化为Nginx能够识别的指令,将停止的服务从Nginx的ProxyBackend列表中剔除。
所以,Yarn管理的其实还是Java的Container,如果该Container同时也是伴生组件,则该Java Container可以直接和第三方应用做交互。否则就需要借助另外一个伴生组件做中转,从而实现对任意,第三方应用的统一管理。
这个方案就奠定了,Yarn可以作为一个通用的资源调度引擎,将包括存储,应用等都囊括进来,同时也自然而然的集成了大数据平台。我觉得从这来来看,更像Google的Borg了。
以上是关于(续) 为什么用Yarn来做Docker容器调度引擎的主要内容,如果未能解决你的问题,请参考以下文章