坐实大数据资源调度框架之王,Yarn 为何这么牛
本文分享自华为云社区《Yarn为何能坐实资源调度框架之王?》,作者: JavaEdge。
Hadoop 主要组成:
分布式文件系统 HDFS
分布式计算框架 MapReduce
分布式集群资源调度框架 Yarn
Yarn 的出现伴随着 Hadoop 的发展,使 Hadoop 从一个单一的大数据计算引擎,成为一个集存储、计算、资源管理为一体的完整大数据平台,进而发展出自己的生态体系,成为大数据的代名词。
在 MapReduce 应用程序的启动过程中,最重要的就是把 MapReduce 程序分发到大数据集群的服务器,Hadoop 1 中,这个过程主要是通过 TaskTracker 和 JobTracker 通信完成。
方案的缺点
服务器集群资源调度管理和 MapReduce 执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如 Spark 或者 Storm,就无法统一使用集群中的资源。
Hadoop 早期,大数据技术就只有 Hadoop,这缺点不明显。但随大数据发展,各种新计算框架出现,我们不可能为每种计算框架部署一个服务器集群,而且就算能部署新集群,数据还是在原来集群的 HDFS 上。所以需要把 MapReduce 的资源管理和计算框架分开,这也是 Hadoop2 最主要变化:将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。
Yarn,Yet Another Resource Negotiator,另一种资源调度器。在 Hadoop 社区决定将资源管理从 Hadoop1 中分离出来,独立开发 Yarn 时,业界已有一些大数据资源管理产品,比如 Mesos,所以 Yarn 开发者索性管自己的产品叫“另一种资源调度器”。比如 Java 的 Ant 就是“Another Neat Tool”缩写,另一种整理工具。
Yarn 架构
Yarn 包括:
节点管理器(Node Manager)
NodeManager 进程,负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,和 HDFS 的 DataNode 进程一起出现
资源管理器(Resource Manager)
ResourceManager 进程,负责整个集群的资源调度管理,通常部署在独立的服务器
资源管理器包括两个主要组件:
调度器
就是个资源分配算法,根据 Client 应用程序提交的资源申请和当前服务器集群的资源状况进行资源分配。
Yarn 内置的资源调度算法
包括 Fair Scheduler、Capacity Scheduler 等,也可以自行开发供 Yarn 调用。
Yarn 进行资源分配的单位是容器(Container),每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。
应用程序管理器
应用程序管理器负责应用程序的提交、监控应用程序运行状态等。应用程序启动后需要在集群中运行一个 ApplicationMaster,ApplicationMaster 也需要运行在容器里面。每个应用程序启动后都会先启动自己的 ApplicationMaster,由 ApplicationMaster 根据应用程序的资源需求进一步向 ResourceManager 进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。
Yarn 的工作流程
1、向 Yarn 提交应用程序,包括
MapReduce ApplicationMaster
我们的 MapReduce 程序
MapReduce Application 启动命令
2、ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器,并在容器里启动 MapReduce ApplicationMaster
3、MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。
4、MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。
5、Map 或者 Reduce 任务在运行期和 MapReduce ApplicationMaster 通信,汇报自己的运行状态,若运行结束,MapReduce ApplicationMaster 向 ResourceManager 进程注销并释放所有的容器资源。
MapReduce 若想在 Yarn 运行,需开发遵循 Yarn 规范的 MapReduce ApplicationMaster,其他大数据计算框架也能开发遵循 Yarn 规范的 ApplicationMaster,这样在一个 Yarn 集群中就能同时并发执行不同的大数据计算框架,实现资源的统一调度管理。
为何 HDFS 是系统,而 MapReduce 和 Yarn 是框架
框架遵循依赖倒转原则:高层模块不能依赖低层模块,它们应共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。
高、低层模块的划分:调用链上,前面的是高层,后面的是低层。以 Web 应用为例,用户请求到 Server 后:
最先处理用户请求的是 Web 容器 Tomcat,通过监听 80 端口,把 HTTP 二进制流封装成 Request 对象
然后 Spring MVC 框架,提取 Request 对象里的用户参数,根据请求的 URL 分发给相应的 Model 对象处理
最后应用程序代码处理用户请求
Tomcat 相比 Spring MVC 就是高层模块,Spring MVC 相比应用程序也是高层模块。虽然 Tomcat 会调用 Spring MVC,因为 Tomcat 要把 Request 交给 Spring MVC 处理,但 Tomcat 并未依赖 Spring MVC,那 Tomcat 如何做到不依赖 Spring MVC,却能调用 Spring MVC?
Tomcat 和 Spring MVC 都依赖 J2EE 规范,Spring MVC 实现了 J2EE 规范的 HttpServlet 抽象类,即 DispatcherServlet,并配置在 web.xml 中。这样,Tomcat 就能调用 DispatcherServlet 处理用户发来的请求。
同样 Spring MVC 也不需要依赖我们写的 Java 代码,而是通过依赖 Spring MVC 的配置文件或 Annotation 抽象,来调用我们的 Java 代码。所以,Tomcat 或者 Spring MVC 都可以称作是框架,它们都遵循依赖倒转原则。
类似的,实现 MapReduce 编程接口、遵循 MapReduce 编程规范就能被 MapReduce 框架调用,在分布式集群中计算大规模数据;实现了 Yarn 的接口规范,比如 Hadoop2 的 MapReduce,就能被 Yarn 调度管理,统一安排服务器资源。所以 MapReduce 和 Yarn 都是框架。
HDFS 就不是框架,使用 HDFS 就是直接调用 HDFS 提供的 API 接口,HDFS 作为底层模块被直接依赖。
总结
Yarn,大数据资源调度框架,调度的是大数据计算引擎本身,不像 MapReduce 或 Spark 编程,每个大数据应用开发者都需根据需求开发自己的 MapReduce 程序或者 Spark 程序。
大数据计算引擎所使用的 Yarn 模块,也早被这些计算引擎开发者做出来供使用。普通大数据开发者没有机会编写 Yarn 相关程序。
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/b794067e12dfb9ef87ce63827】。文章转载请联系作者。
评论