这是CDP中Yarn使用手册系列的一篇。之前的文章请参考《Apache Hadoop Yarn概述》、《CDP中使用YARN Web UI和CLI》、《CDP中配置Apache Hadoop Yarn的安全性》、《CDP中Yarn资源调度与管理》、《CDP中Yarn管理队列》、《Yarn在全局级别配置调度程序属性》。
队列属性包含定义队列行为的设置。使用队列属性,您可以定义不需要直接从父队列继承属性的设置,并定义特定于队列的设置。
在 Cloudera Manager 中,您可以使用队列属性来查看和配置队列属性。
1. 在Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。
2. 单击队列上的三个垂直点,然后选择查看/编辑队列属性选项。
3. 在“队列属性”窗口中,输入属性值并单击“保存”。
1 在队列中设置用户限制
设置分配给每个叶队列用户的最小资源百分比。
最小用户限制(最小用户极限百分比)属性可以用于设置分配给每个叶队列用户资源的最小百分比。例如,要在五个用户之间平等共享“服务”叶队列容量,您可以将最小用户限制百分比设置为 20%。
根据本例配置用户限制,请执行以下操作:
1. 在 Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击服务队列上的三个垂直点,然后选择 查看/编辑队列属性选项。
3. 在“队列属性”对话框中,在“最小用户限制”文本框中输入20 。
4. 点击保存。
此设置确定任何用户的队列容量份额可以缩小到的最小限制。无论此限制如何,如果有空闲资源可用,任何用户都可以进入队列并占用超过其分配的份额。
下表显示了如何在用户将作业提交到最小用户限制百分比设置为 20% 的队列时调整队列资源:
· 对于单个用户连续提交多个作业,队列资源以相同的方式进行调整。如果没有其他用户请求队列资源,第一个作业将获得 100% 的队列容量。当用户提交第二个作业时,每个作业接收队列容量的 50%。当用户提交第三个作业时,每个作业接收队列容量的 33%。如果第四个用户随后提交作业,则每个作业将获得队列容量的 25%。当所有用户提交的作业总数达到5个时,每个作业将获得队列容量的20%,后续用户必须等待队列容量释放(假设未启用抢占)。
· 容量调度程序还管理资源以减少用户数量。随着用户的应用程序完成运行,其他具有突出需求的现有用户开始收回该份额。
· 请注意,尽管用户之间存在这种共享,但容量调度程序的 FIFO 应用程序调度顺序不会改变。这保证了用户不能通过不断提交新的应用程序来独占队列。首先提交的应用程序(以及相应的用户)总是比稍后提交的应用程序获得更高的优先级。
Capacity Scheduler 的叶子队列还可以使用user-limit-factor 属性来控制用户资源分配。此属性表示任何单个用户最多可以消耗的队列容量比例,无论集群中是否存在空闲资源。
根据本示例配置最大限制(user-limit-factor),请执行以下操作:
1. 在 Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击要设置限制的队列上的三个垂直点,然后选择 查看/编辑队列属性选项。
3. 在“队列属性”对话框中,1 在“用户限制因子”文本框中输入。
4. 点击保存。
默认值“1”表示队列中的任何单个用户最多只能占用队列配置的容量。这可以防止单个队列中的用户独占集群中所有队列的资源。将该值设置为“2”会将队列的用户限制为队列配置容量的两倍。将其设置为 0.5 值将限制任何用户使用超过队列容量一半的资源。
2 为特定队列设置最大应用程序限制
为避免由于无法管理的负载(由恶意用户或意外引起)导致系统崩溃,容量调度程序使您能够对并发活动(正在运行和待处理)应用程序的总数设置静态、可配置的限制任何时候。
您可以使用最大应用程序队列属性设置最大应用程序限制属性。在任何特定队列中运行应用程序的限制是该总限制的一小部分,与其容量成正比。这是一个硬限制,这意味着一旦队列达到此限制,该队列的任何新应用程序都将被拒绝,客户端将不得不等待并稍后重试。
要在特定队列上设置应用程序限制 ( yarn.scheduler.capacity.<queue-path>.maximum-applications ),请执行以下操作:
1. 在 Cloudera Manager 中,选择集群> YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击队列上的三个垂直点,然后选择查看/编辑队列属性选项。
3. 在队列属性对话框中,在最大应用程序文本框中输入最大应用程序限制。
4. 点击保存。
3 为特定队列设置Application-Master 资源限制
Application Master (AM) 资源限制可用于设置专门分配给 Application Master 的集群资源的最大百分比。默认值为 10%,存在是为了避免跨应用程序死锁,其中集群中的重要资源完全被运行应用程序主控的容器占用。
此属性还间接控制集群中并发运行的应用程序数量,每个队列仅限于与其容量成比例的运行应用程序数量。
要为特定队列设置最大 Application Masters 资源限制 ( yarn.scheduler.capacity.maximum-am-resource-percent ):
1. 在Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击队列上的三个垂直点,然后选择查看/编辑队列属性选项。
3. 在队列属性对话框中,在最大AM 资源限制文本框中输入限制 。
4. 点击保存。
4 使用 ACL 控制对队列的访问
使用访问控制列表 (ACL) 来控制用户和管理员对容量调度程序队列的访问权限。
应用程序提交实际上只能发生在叶队列级别,但是在父队列上设置的 ACL 限制将应用于其所有后代队列。
在容量调度程序中,通过使用提交应用程序 ACL参数授予对用户和组列表的队列访问权限来配置ACL。列表的格式是“user1,user2 group1,group2”——一个逗号分隔的用户列表,后跟一个空格,后跟一个逗号分隔的组列表。
注意
根队列的Submit Application ACL的默认值为yarn,这意味着只有默认yarn 用户才能向该队列提交应用程序。因此,要为特定用户和组提供对队列的访问权限,您必须将提交应用程序 ACL的值显式设置为这些用户和组。
值提交应用ACL(acl_submit_applications)也可以设置为“*”(星号),以允许访问所有的用户和组,也可以设置为“”(空格字符)阻止访问到所有用户和组。
如前所述,父队列上的 ACL 设置适用于其所有后代队列。因此,如果父队列使用“*”(星号)值(或未指定)允许访问所有用户和组,则其子队列不能限制访问。同样,在限制对子队列的访问之前,必须先将父队列设置为“”(空格字符)以阻止对所有用户和组的访问。
例如,以下属性会将根提交应用程序 ACL值设置为“”(空格字符)以阻止对所有用户和组的访问,并将对其子“support”队列的访问限制为用户“sherlock”和“john” ”和“cfo-group”组的成员:
每个子队列都通过配置属性绑定到其父队列。顶级的“支持”、“工程”和“营销”队列将绑定到“根”队列。
要基于此示例设置 ACL,请执行以下操作:
1. 在 Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击要设置 ACL 的队列上的三个垂直点,然后选择 查看/编辑队列属性选项。
3. 在队列属性对话框框,添加sherlock,john cfo-group在提交申请ACL文本框中。
4. 点击 保存。
单独的 ACL 可用于控制各个级别的队列管理。队列管理员可以向队列提交应用程序,杀死队列中的应用程序,并获取有关队列中任何应用程序的信息(而普通用户被限制查看其他用户应用程序的所有详细信息)。
如果队列管理 ACL值设置为“ ”(空格字符),则会阻止对所有用户和组的访问。如果 ACL 设置为 sherlock,john cfo-group,则它允许访问用户“sherlock”和“john”以及“cfo-group”组的成员。
5 为特定队列启用抢占
容量调度程序抢占允许较高优先级的应用程序抢占较低优先级的应用程序。
可能会发生这样的情况:队列具有保证级别的集群资源,但必须等待运行应用程序,因为其他队列正在使用所有可用资源。如果启用抢占,高优先级的应用程序不必等待,因为低优先级的应用程序已经占用了可用容量。启用抢占后,服务不足的队列几乎可以立即开始声明其分配的集群资源,而无需等待其他队列的应用程序完成运行。
注意
如果调度器配置中禁用抢占策略,则无法启用特定队列的抢占。有关设置调度程序级别抢占的信息,请参阅配置抢占。
您可以禁用特定队列的队列抢占(yarn.resourcemanager.scheduler.monitor.enable)。
1. 在Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击队列上的三个垂直点,然后选择查看/编辑队列属性选项。
3. 在队列属性对话框中,取消选中 启用抢占复选框。
4. 点击保存。
6 为特定队列启用队列内抢占
队列内抢占防止队列中的资源不平衡。
队列内抢占有助于根据配置的用户限制或应用程序优先级在队列内有效分配资源。
注意
如果调度器配置中关闭了队列内抢占策略,则无法为特定队列开启队列内抢占。有关设置调度程序级别的队列内抢占的信息,请参阅配置队列内抢占。
禁用特定队列的队列内抢占(yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.enabled)
1. 在Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击队列上的三个垂直点,然后选择查看/编辑队列属性选项。
3. 在Queue Properties对话框中,取消选中 Enable Intra Queue Preemption复选框。
4. 点击保存。
7 配置动态队列属性
动态队列是根据动态放置规则的预定义表达式自动创建的。
动态创建的叶队列的队列名称旁边将显示一个叶图标。您可以在队列属性的动态自动创建队列部分查看动态创建的叶队列 的队列属性。您可以通过单击其托管父队列的Edit Child Queues选项来配置动态叶队列属性,例如设置用户限制、ACL、排序策略。在托管父队列级别设置的队列属性将应用于其所有叶队列。
8 在特定队列中设置排序策略
根据您的要求在容量调度程序中设置 FIFO(先进先出)或公平调度策略。
容量调度程序中的默认排序策略是 FIFO(先进先出)。FIFO 通常适用于可预测的重复批处理作业,但有时不适用于按需或探索性工作负载。对于这些类型的工作,公平调度通常是更好的选择。灵活的调度策略使您能够在每个队列的基础上为不同类型的工作负载分配 FIFO 或公平排序策略。
8.1 FIFO 和公平共享策略示例
FIFO(先进先出)和公平调度策略在批处理作业和临时作业中的工作方式不同。
批处理示例
在下面的示例中,两个队列具有相同的可用资源。一种使用 FIFO 排序策略,另一种使用公平共享策略。用户一个接一个地向每个队列提交三个作业,等待每个作业开始的时间刚好足够。第一个作业使用队列中资源限制的 6 倍,第二个 4 倍,最后一个 2 倍。
· 在 FIFO 队列中,6x 作业将启动并运行至完成,然后 4x 作业将启动并运行至完成,然后是 2x 作业。他们将按照 6x、4x、2x 的顺序开始和结束。
· 在 Fair 队列中,6x 作业将开始,然后是 4x 作业,然后是 2x 作业。所有三个将同时运行,每个使用 1/3 的可用应用程序资源。它们通常会按以下顺序完成:2x、4x、6x。
Ad Hoc Plus 批处理示例
在此示例中,正在运行使用 10 倍队列资源的作业。作业完成一半后,同一个用户开始第二个作业,需要 1 倍的队列资源。
· 在 FIFO 队列中,10x 作业将一直运行,直到它不再使用所有队列资源(例如,Map阶段完成),然后 1x 作业将启动。
· 在 Fair 队列中,1x 作业将尽快启动、运行和完成——通过损耗从 10x 作业中获取资源。
8.2 排序策略的最佳实践
· 排序策略是基于每个队列配置的,默认排序策略设置为 FIFO。公平性通常最适合按需、交互式或探索性工作负载,而 FIFO 可以更有效地用于可预测的重复批处理。您应该将这些不同类型的工作负载隔离到配置有适当排序策略的队列中。
· · 在同时支持大型和小型应用程序的队列中,大型应用程序可能会“饿死”(无法获得足够的资源)。为避免这种情况,请为大作业和小作业使用不同的队列,或使用基于大小的加权来减少排序逻辑倾向于较小应用程序的自然趋势。
· · 使用最大AM 资源限制调度程序属性来限制队列中运行的并发应用程序的数量,以避免出现同时运行太多应用程序的情况。每个队列的限制与其队列容量和用户限制成正比。此属性指定为浮点数,例如:0.5 = 50%。默认设置为 0.1=10%。该属性可以通过设置所有队列进行设置最大AM资源限制在根级别属性,也可以在以每队列基础上通过设置覆盖最大AM资源限制设置默认的应用掌握资源限制在队列级别属性.
8.3 配置队列排序策略
您可以将队列排序策略的属性 ( yarn.scheduler.capacity.<queue-path>.ordering-policy ) 配置为 FIFO 或 Fair。默认设置为先进先出。
1. 在Cloudera Manager 中,选择集群> YARN 队列管理器UI 服务。图形队列层次结构显示在概览选项卡中。
2. 单击要配置队列排序策略的队列上的三个垂直点,然后选择查看/编辑队列属性选项。
3. 在Queue Properties对话框中,使用Ordering Policy 下拉框将排序策略选择为FIFO或Fair。
4. 点击保存。