最近一直在学习hadoop的一些原理和优化,然后也做了一些实践,也有没有去做实践的,反正个人观点都记录下来
一、yarn的介绍YARN的基本结构由一个ResourceManager与多个NodeManager组成。ResourceManager负责对NodeManager所持有的资源进行统一管理和调度。当在处理一个作业时ResourceManager会在NodeManager所在节点创建一全权负责单个作业运行和监控的程序ApplicationMaster。
1、ResouceManager(简称RM)
资源管理器负责整个集群资源的调度,该组件由两部分构成:调度器(Scheduler)和ApplicationsManager。调度器会根据特定调度器实现调度算法,结合作业所在的队列资源容量,将资源按调度算法分配给每个任务。分配的资源将用容器(container)形式提供,容器是一个相对封闭独立的环境,已经将CPU、内存及任务运行所需环境条件封装在一起。通过容器可以很好地限定每个任务使用的资源量。YARN调度器目前在生产环境中被用得较多的有两种:能力调度器(Capacity Scheduler)和公平调度器(Fair Scheduler)(FIFO一般都不使用)。
2、ApplicationMaster(简称AM)
每个提交到集群的作业(job)都会有一个与之对应的AM 来管理。它负责进行数据切分,并为当前应用程序向RM 去申请资源,当申请到资源时会和NodeManager 通信,启动容器并运行相应的任务。此外,AM还负责监控任务(task)的状态和执行的进度。
3、NodeManage(简称NM)
NodeManager负责管理集群中单个节点的资源和任务,每个节点对应一个NodeManager, NodeManager负责接收ApplicationMaster的请求启动容器,监控容器的运行状态,并监控当前节点状态及当前节点的资源使用情况和容器的运行情况,并定时回报给ResourceManager
更具体点的知识可以参考hadoop之yarn详解(基础架构篇)、hadoop之yarn详解(框架进阶篇)和hadoop之yarn详解(命令篇)这几篇文章
二、yarn的优化丢个官网:https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
这里不说调度器的配置,一般都是选用能力调度器(Capacity Scheduler)和公平调度器(Fair Scheduler),这些一般都是根据公司的具体情况进行配置,比如根据用户配置资源比例,或者更具时间点的不同配置,毕竟有时候离线计算在某些时候压力会比较大,可以根据公司的具体情况,对具体的一些时间段进行相应的调整,防止集群压力过大,造成集群不健康。
2.1、资源配置在YARN中可供分配和管理的资源有内存和CPU资源,在Hadoop 3.0中将GPU、FPGA资源也纳入可管理的资源中。
既然yarn是用来管理资源的,所以资源的来源还是来源于服务器的cpu和内存。所以也就是我们配置服务器的多少资源作为yarn的资源。这里有两种配置,一种是自己更具服务器的资源,自己判断预留给服务器多少资源提供给其他服务,其他配置给yarn作为资源,还有一种就是让yarn去扫描服务器的资源,按照比例进行配置(这个理论上可行,没有实践)
这里再说一句,优化这个东西呢其他在集群没有出现瓶颈的时候就不要去优化,一个是看不出效果,还有就是浪费时间,反正资源够用,没啥好优化的,优化的目的就是在有限的资源下,保证集群的稳定,又能挺高资源的利用率和提高集群的并发能力。
首先我们说第一种:手动配置固定的资源给yarn
yarn.nodemanager.resource.cpu-vcores,默认值为-1。默认表示集群中每个节点可被分配的虚拟CPU个数为8。为什么这里不是物理CPU个数?因为考虑一个集群中所有的机器配置不可能一样,即使同样是16核心的CPU性能也会有所差异,所以YARN在物理CPU和用户之间加了一层虚拟CPU,一个物理CPU可以被划分成多个虚拟的CPU。这里确实可以配置超过物理cpu的个数,确实能够提高并发,但是尝试了一把,这样子服务器的负载就很大了,基本上是处理不过来,而且这样配置没有个服务器留有空余的cpu去执行其他的任务或者其他的集群。因为是生产环境,也没敢去做压测,检测到服务器的负载都是cpu核数的十倍了,所以负载太大,不太敢太激进,所以最终配置是比物理cup核数少那么几个,预留几个cpu给服务器或者其他服务使用。
yarn.nodemanager.resource.memory-mb,默认值为-1。当该值为-1时,默认表示集群中每个节点可被分配的物理内存是8GB。这个一般配置是给服务器预留20%的内存即可。