纱线知识

在实际系统中,资源本身是多维的,包括CPU、内存、网络I/O和磁盘I/O等。所以,要想精准控制资源分配,就不能再有槽点的概念了。最直接的方法就是让任务直接向调度器申请它需要的资源(比如一个任务可以申请1GB的内存和1个CPU)。但是,调度器会根据任务的实际需要仔细分配相应的资源,而不是简单地给它分配一个槽。Hadoop 2.0正式采用了这种基于真实资源的资源分配方案。

Hadoop 2.0的基本设计思想是将JobTracker的两个主要功能,即资源管理和作业调度/监控,分成两个独立的进程。与每个应用程序相关的Global ResourceManager(RM)和ApplicationMaster(AM)。

ResourceManager(RM):负责统一管理和调度每个NM上的资源。将相应的空闲容器分配给AM应用的资源请求。将AM分配给空闲的容器运行并监控其运行状态。它主要由两个组件组成:调度程序和应用程序管理器。

调度程序:调度程序根据容量、队列和其他限制将系统中的资源分配给正在运行的应用程序。调度器只根据每个应用的资源需求分配资源,资源分配单元是容器,从而限制了每个任务使用的资源量。Shceduler不负责监控或跟踪应用程序的状态,也不负责因各种原因重启应用程序(这是ApplicationMaster的责任)。

调度器是可插拔的,例如CapacityScheduler和FairScheduler。

应用管理器:应用管理器负责管理整个系统中的所有应用,包括应用提交、与调度器协商资源启动AM、监控AM运行状态以及失败时重启等。它还负责跟踪所分配容器的进度和状态。

NodeManager(NM) :NM): nm是每个节点上的资源和任务管理器。它会定期向RM报告该节点上的资源使用情况和每个容器的运行状态;同时,它将接收和处理来自am的容器启动/停止请求。

ApplicationMaster(AM):用户提交的所有应用都包含一个AM,负责监控应用,跟踪应用执行状态,重启失败的任务等。AM是一个应用框架,负责与RM协调资源,与NM共同完成任务的执行和监控。Mapreduce是一个本地支持的框架,可以在YARN上运行MapReduce作业。很多分布式应用都为在YARN上运行任务开发了相应的应用框架,如Spark、Storm等。

容器:是YARN中对资源的抽象,封装了一个节点上的多维资源,比如内存、CPU、磁盘、网络等。AM向RM申请资源时,RM为AM返回的资源用容器表示。YARN为每个任务分配一个容器,任务只能使用容器中描述的资源。

1)用户向YARN提交应用程序,包括ApplicationMaster程序、启动am的命令、用户程序等。

2)ResourceManager为应用程序分配第一个容器,并与相应的节点管理器通信,要求其启动该容器中应用程序的AM。

3)AM先向RM注册,这样用户可以直接通过RM查看应用的运行状态,然后它会为每个任务申请资源,并监控其运行状态,直到运行结束,也就是重复步骤4-7。

4)AM通过RPC协议轮询向RM申请和接收资源。

5)一旦AM申请了资源,就会和对应的NM进行通信,要求其启动任务。

6)设置运行环境(包括环境变量、JAR包、二进制程序等)后的NM。)对于任务,将任务启动命令写入脚本,通过运行脚本启动任务。

7)每个任务通过一个RPC协议向AM报告自己的状态和进度,这样AM就可以随时跟踪每个任务的运行状态,以便失败时可以重新启动任务。在应用程序运行过程中,用户可以通过RPC随时向AM查询应用程序的当前运行状态。

8)应用程序运行后,AM从RM注销并自行关闭。

当用户向YARN提交应用程序时,YARN将分两个阶段运行应用程序:第一个阶段是启动AM;第二阶段是AM创建一个应用,为它申请资源,监控它的整个运行过程,直到完成。

ResourceManager将一个NodeManager上的资源分配给任务后(资源调度),NodeManager需要根据需要为任务提供相应的资源,甚至要保证这些资源应该是独占的,为任务运行提供基本保障(资源隔离)。

内存资源

1)YARN . node manager . resource . memory-MB此节点上可用于yarn的总物理内存:

假设我在这个节点上有48G内存,其中25%用于Linux,其余75%用于大数据进程。其中DN和NM一般放在同一台机器上(数据本地化)。默认DN是给4 g的,NM是给3 g的。(这两个参数分别在hadoop-env.sh和yarn-env.sh中设置)。

我们的容器可以使用高达29克的纱线。nodemanager.resource.memory-MB。当这个参数设置为所有剩余内存时,意味着我们的NM在执行任务时可以使用29 G。

2)纱线。调度程序。单个任务可以申请的最小物理内存:

在我们的生产中,分配给容器的最小克数通常设置为2克。如果机器上的剩余内存小于2 G,容器将不会在此机器上打开。

3)纱线。调度程序。单个任务可以申请的最大物理内存量。

当一个容器被打开时,放在它上面的任务不会立刻被使用到最大内存限制。一般会先设置两个G(也就是最小内存限制)。如果不够,它将继续增加,直到达到最大内存限制。如果不够,将会报告一个错误。因此,最大内存设置通常与整个节点的可用内存设置一样大。

4.2.CPU资源

Vcore:虚拟cpu,yarn推出的新概念。由于不同物理核的性能不同,为了使每个核的计算能力一致,此时设置了一个vcore。一般1物理核对应2个vcore,有的公司有1:1。

cpu也有三组参数:

yarn . node manager . resource . CPU-v cores

yarn . scheduler . minimum-allocation-v cores

yarn . scheduler . maximum-allocation-v cores

三个默认值分别是8,1,8。如果有八个物理内核,请考虑使用多少个内核来处理大数据。如果保留六个核心,保留两个核心用于其他进程,则有12个这样的vcore。

FIFO调度器根据提交的顺序将申请排列在一个队列中,这是一个先进先出的队列。分配资源时,先将资源分配给队列中最靠前的应用程序,满足最靠前的应用程序要求后再分配给下一个应用程序,以此类推。

FIFO调度器是最简单易懂的调度器,不需要任何配置,但是不适合* * *共享集群。大型应用程序可能会占用所有集群资源,从而导致其他应用程序被阻塞。在* * *共享集群中,更适合采用容量调度器或公平调度器,两者都允许大任务和小任务在提交的同时获得一定的系统资源。

从图中可以看出,在FIFO调度器中,小任务会被大任务阻塞。

对于容量调度器,有专门的队列来运行小任务,但是为小任务设置队列会提前占用一定的集群资源,导致大任务的执行时间落后于使用FIFO调度器时的执行时间。

在公平调度器中,我们不需要提前占用一定的系统资源,公平调度器会为所有正在运行的作业动态调整系统资源。如图,第一个大作业提交时,只有这个作业在运行,此时已经获得了所有的集群资源;当第二个小任务提交后,公平调度器会将一半的资源分配给这个小任务,让两个任务公平地享受集群资源。

需要注意的是,在图公平调度器中,从第二个任务提交到获取资源会有一定的延迟,因为它需要等待第一个任务释放被占用的容器。小任务执行后也会释放自己占用的资源,大任务会获得所有系统资源。最终的结果是,公平调度器既能实现较高的资源利用率,又能保证小任务的及时完成。

调度器的使用通过yarn-site.xml配置文件中的yarn . resource manager . Scheduler . class参数配置,默认采用容量调度器。如果我们想使用FairScheduler,我们需要在这个参数上配置FairScheduler类的全限定名:org。Apache . Hadoop . yarn . server . resource manager . scheduler . fair . fair scheduler。