
# 使用External Shuffle Service提升性能
#### 操作场景
Spark系统在运行含shuffle过程的应用时，Executor进程除了运行task，还要负责写shuffle数据，给其他Executor提供shuffle数据。当Executor进程任务过重，导致GC而不能为其他Executor提供shuffle数据时，会影响任务运行。
External shuffle Service是长期存在于NodeManager进程中的一个辅助服务。通过该服务来抓取shuffle数据，减少了Executor的压力，在Executor GC的时候也不会影响其他Executor的任务运行。
#### 操作步骤
1. 在NodeManager中启动External shuffle Service。
   1. 通过MRS Manager页面（可参考[登录MRS Manager](https://support.huaweicloud.com/devg-mrs/mrs_06_0606.html)）的"服务管理 \> Yarn \> 服务配置"页面的"Yarn \> 自定义"在"yarn-site.xml"中添加如下配置项：
      ```
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>spark_shuffle</value>
      </property>
      <property>
          <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
          <value>org.apache.spark.network.yarn.YarnShuffleService</value>
      </property>
      ```
      
      | **配置参数**                                          | **描述**                                   |
      |:---|:---|
      | yarn.nodemanager.aux-services                     | NodeManager中一个长期运行的辅助服务，用于提升Shuffle计算性能。 |
      | yarn.nodemanager.aux-services.spark_shuffle.class | NodeManager中辅助服务对应的类。                    |
         
      
   
   2. 添加依赖的jar包。 拷贝"${SPARK_HOME}/lib/spark-1.5.1-yarn-shuffle.jar"到"${HADOOP_HOME}/share/hadoop/yarn/lib/"目录下。
      
   
   3. 重启NodeManager进程，也就启动了External shuffle Service。
    
2. Spark应用使用External shuffle Service。
   - 在客户端的安装目录"/Spark/spark/conf/spark-defaults.conf"中必须添加如下配置项：
     ```
     spark.shuffle.service.enabled   true
     spark.shuffle.service.port      7337
     ```
     
     | **配置参数**                      | **描述**                                                     |
     |:---|:---|
     | spark.shuffle.service.enabled | NodeManager中一个长期运行的辅助服务，用于提升Shuffle计算性能。默认为false，表示不启用该功能。 |
     | spark.shuffle.service.port    | Shuffle服务监听数据获取请求的端口。可选配置，默认值为"7337"。                      |
        
     ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
     1.如果"yarn.nodemanager.aux-services"配置项已存在，则在value中添加"spark_shuffle"，且用逗号和其他值分开。
     2."spark.shuffle.service.port"的值需要和上面"yarn-site.xml"中的值一样。
     
    
 
