
# 配置MapReduce Job基线
#### 操作场景
确定Job基线是调优的基础，一切调优项效果的检查，都是通过和基线数据做对比来获得。
Job基线的确定有如下三个原则：
- 充分利用集群资源
- Reduce阶段尽量放在一轮
- 每个Task的执行时间要合理
 
#### 操作步骤
- **原则一：充分利用集群资源。**
  Job运行时，会让所有的节点都有任务处理，且处于繁忙状态，这样才能保证资源充分利用，任务的并发度达到最大。可以通过调整处理的数据量大小，以及调整map和reduce个数来实现。
  reduce个数的控制使用"mapreduce.job.reduces"。
  map个数取决于使用了哪种InputFormat，以及待处理的数据文件是否可分割。默认的TextFileInputFormat将根据block的个数来分配map数(一个block一个map)。通过如下配置参数进行调整。
  参数入口：
  进入Yarn服务参数"全部配置"界面，在搜索框中输入参数名称。具体操作请参考[修改集群服务配置参数](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2125.html)章节。
  表1参数配置-1 
  | **参数**                                        | **描述**                                                                                                                                                                                                                                                                                                                                                                                           | **默认值** |
  |:---|:---|:---|
  | mapreduce.input.fileinputformat.split.maxsize | map输入信息应被拆分成的数据块的最大大小。 由用户定义的分片大小的设置及每个文件block大小的设置，可以计算分片的大小。计算公式如下： ``` splitSize = Math.max(minSize, Math.min(maxSize, blockSize)) ``` 如果maxSize设置大于blockSize，那么每个block就是一个分片，否则就会将一个block文件分隔为多个分片，如果block中剩下的一小段数据量小于splitSize，还是认为它是独立的分片。 | -       |
  | mapreduce.input.fileinputformat.split.minsize | 可以设置数据分片的数据最小值。                                                                                                                                                                                                                                                                                                                                                                                  | 0       |
     
  
- **原则二：控制reduce阶段在一轮中完成。**
  避免以下两种场景：
  - 大部分的reduce在第一轮运行完后，剩下唯一一个reduce继续运行。这种情况下，这个reduce的执行时间将极大影响这个job的运行时间。因此需要将reduce个数减少。
  
  - 所有的map运行完后，只有个别节点有reduce在运行。这时候集群资源没有得到充分利用，需要增加reduce的个数以便每个节点都有任务处理。
    
- **原则三：每个task的执行时间要合理。**
  如果一个job，每个map或reduce的执行时间只有几秒钟，就意味着这个job的大部分时间都消耗在task的调度和进程启停阶段，因此需要增加每个task处理的数据大小。建议一个task处理时间为1分钟。
  控制单个task处理时间的大小，可以通过如下配置来调整。
  参数入口：
  进入Yarn服务参数"全部配置"界面，在搜索框中输入参数名称。具体操作请参考[修改集群服务配置参数](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2125.html)章节。
  表2参数配置-2 
  | **参数**                                        | **描述**                                                                                                                                                                                                                                                                                                                                                                                           | **默认值** |
  |:---|:---|:---|
  | mapreduce.input.fileinputformat.split.maxsize | map输入信息应被拆分成的数据块的最大大小。 由用户定义的分片大小的设置及每个文件block大小的设置，可以计算分片的大小。计算公式如下： ``` splitSize = Math.max(minSize, Math.min(maxSize, blockSize)) ``` 如果maxSize设置大于blockSize，那么每个block就是一个分片，否则就会将一个block文件分隔为多个分片，如果block中剩下的一小段数据量小于splitSize，还是认为它是独立的分片。 | -       |
  | mapreduce.input.fileinputformat.split.minsize | 可以设置数据分片的数据最小值。                                                                                                                                                                                                                                                                                                                                                                                  | 0       |
     
  
 
