
# 配置AM作业自动保留及内存分配
#### 操作场景
每个应用程序（如MapReduce作业、Spark作业等）在YARN上运行时，都会启动一个独立的ApplicationMaster（AM）。AM的主要职责是与YARN的ResourceManager通信，以获取资源，并协调应用程序的任务执行。
在YARN中，AM与Container类似，都运行在NodeManager（NM）上（本文中忽略未管理的AM）。AM可能由于多种原因崩溃、退出或关闭，如果AM停止运行，ResourceManager（RM）会关闭ApplicationAttempt中管理的所有Container，其中包括当前在NM上运行的所有Container。RM会在另一计算节点上启动新的ApplicationAttempt。
对于不同类型的应用，希望以不同方式处理AM重启的事件。MapReduce类应用的目标是不丢失任务，但允许丢失当前运行的Container。但是对于长周期的YARN服务而言，用户可能并不希望由于AM的故障而导致整个服务停止运行。
YARN支持在新的ApplicationAttempt启动时，保留之前Container的状态，因此运行中的作业可以继续无故障的运行。
图1AM作业保留   
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000001676907466.png "点击放大")
#### 配置AM作业自动保留
1. 登录FusionInsight Manager。 
   登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> 服务 \> Yarn \> 配置 \> 全部配置"。
3. 搜索并根据实际需要修改[表1]相关参数。
   
    表1AM作业保留相关参数 
   | 参数                                             | 说明                                                                                                                                                                                                                                                                                                                                                                 | 取值样例  |
   |:---|:---|:---|
   | yarn.app.mapreduce.am.work-preserve            | 是否开启AM作业保留特性。默认值为"false"。 - true：开启。当AM失败时，YARN会尝试保留已经完成的任务的结果。新的AM启动后，会重用之前已经完成的任务结果，避免重新执行这些任务。  - false：关闭。当AM失败时，YARN不会保留已经完成的任务结果。新的AM启动后，会重新执行所有任务，包括之前已经完成的任务。   | true  |
   | yarn.app.mapreduce.am.umbilical.max.retries    | AM作业保留特性中，AM与RM之间通信失败时，运行的容器尝试恢复的最大次数。 - 增加重试次数可以提高通信的可靠性，减少因暂时性网络问题等导致的作业失败。但可能导致资源等待时间增加，影响整体作业效率。  - 较小的重试次数可以加快失败处理，提高作业执行效率。但可能导致作业因暂时性问题失败。   取值范围：大于0。               | 5     |
   | yarn.app.mapreduce.am.umbilical.retry.interval | AM作业保留特性中，AM与RM之间通信失败时，运行的容器尝试恢复的时间间隔。单位：毫秒。 - 增加重试时间间隔可以减少短时间内频繁重试对系统资源的消耗，降低系统压力。建议用户在高负载或高延迟场景下适当增加间隔。  - 较小的重试时间间隔可以更快地恢复通信，减少作业等待时间。建议用户在低负载和低延迟环境下适当减小时间间隔。           | 10000 |
   | yarn.resourcemanager.am.max-attempts           | AM失败时的重试次数。增加重试次数可以避免当资源不足时造成AM启动失败。 适用于所有AM作业的全局设置。每个AM都可以使用API设置一个单独的最大尝试次数，但该次数不能大于全局的最大次数，否则ResourceManager将会覆写这个单独的最大尝试次数。取值范围大于等于1。                                                                                                                                                                      | 5     |
      
   
   
4. 保存修改的配置。保存完成后请重新启动配置过期的服务或实例以使配置生效。
 
#### 配置AM自动调整分配内存
启动该配置的过程中，ApplicationMaster在创建container时，分配的内存会根据任务总数的浮动自动调整，资源利用更加灵活，提高了客户端应用运行的容错性。
1. 登录FusionInsight Manager。 
   登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> 服务 \> Yarn \> 配置 \> 全部配置"。
3. 在搜索框中搜索并根据实际需要修改以下参数。 
   表2AM自动调整分配内存参数 
   | 参数                             | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 取值样例 |
   |:---|:---|:---|
   | mapreduce.job.am.memory.policy | 使用该策略时AM的内存会根据Mapreduce任务的task数量自动调整。 - 默认值为空，此时不会启动自动调整的策略，AM的内存仍受"yarn.app.mapreduce.am.resource.mb"配置项的影响，该参数表示AM的内存限制，默认值为1536 MB。  - 配置参数的值由5个数值组成，中间使用":"与","分隔，格式为： {baseTaskCount}:{taskStep}:{memoryStep},{minMemory}:{maxMemory} 取值含义请见[表3]。 例如设定为"100:10:200,1024:3096"，表示当task的数量超过100时，每增加10个任务，container的内存就会在"yarn.app.mapreduce.am.resource.mb"配置参数的基础上增加200MB，但不会超过设定的最大内存3096MB。    | -    |
      
    表3配置取值说明 
   | 数值名称          | 描述                                                                | 设定要求                                                           |
   |:---|:---|:---|
   | baseTaskCount | 任务总量基数，只有当应用的task总数（mapperTasks+reduceTasks）不小于该值时配置才会起作用。        | 不能为空且大于零。                                                      |
   | taskStep      | 任务增量步进，与memoryStep共同决定内存调整量。                                      | 不能为空且大于零。                                                      |
   | memoryStep    | 内存增量步进，在"yarn.app.mapreduce.am.resource.mb"配置的基础上对内存向上调整。         | 不能为空且大于零。 单位：MB                 |
   | minMemory     | 内存自动调整下限，如果调整后的内存不大于该值，仍保持"yarn.app.mapreduce.am.resource.mb"的配置。 | 不能为空且大于零，且不大于maxMemory的设定值。 单位：MB  |
   | maxMemory     | 内存自动调整上限，如果调整后的内存超过该值，则使用该值作为最终调整值。                               | 不能为空且大于零，且不小于minMemory的设定值。 单位：MB |
      
   
   
4. 保存修改的配置。保存完成后请重新启动配置过期的服务或实例以使配置生效。
 
