

# 调整映射器
<a name="EMRforDynamoDB.PerformanceTuning.Mappers"></a>

Hive 启动 Hadoop 任务后，任务将由一个或多个映射器任务处理。假设 DynamoDB 表具有足够的吞吐量容量，可以修改集群的映射器数量，从而可能提高性能。

**注意**  
Hadoop 任务使用的映射器任务数量受*输入拆分*影响，其中 Hadoop 将数据细分为逻辑块。如果 Hadoop 未执行足够的输入拆分，则写入操作可能无法占用 DynamoDB 表的所有可用写入吞吐量。

## 增加映射器数量
<a name="EMRforDynamoDB.PerformanceTuning.Mappers.Increasing"></a>

Amazon EMR 的每个映射器的最大读取速率为每秒 1 MiB。集群的映射器数量取决于集群节点的大小。（有关节点大小和每个节点的映射器数量的信息，请参见 *Amazon EMR 开发人员指南*的[任务配置](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-hadoop-task-config.html)。）

如果 DynamoDB 表具有足够的读取吞吐量，则可以通过执行以下操作之一尝试增加映射器的数量：
+ 增加集群的节点大小。例如，如果集群使用 *m1.large* 节点（每个节点有三个映射器），则可以尝试升级到 *m1.xlarge* 节点（每个节点八个映射器）。
+ 增加集群的节点数。例如，如果具有 *m1.xlarge* 节点的三节点集群，则总共有 24 个可用映射器。如果集群大小翻倍，节点类型不变，则有 48 个映射器。

可以使用 Amazon Web Services 管理控制台 管理集群的节点大小或数量。（可能需要重启集群才能使这些更改生效。）

增加映射器数量的另一个方法是修改 `mapred.tasktracker.map.tasks.maximum` Hadoop 配置参数。（这是一个 Hadoop 参数，而不是 Hive 参数。无法从命令提示符以交互方式修改。） 如果增加 `mapred.tasktracker.map.tasks.maximum` 值，则可以在不增加节点大小或数量的情况下增加映射器的数量。但是，如果设置的值太高，集群节点可能会耗尽内存。

首次启动 Amazon EMR 集群时，设置 `mapred.tasktracker.map.tasks.maximum` 值作为引导操作。有关更多信息，请参阅 *Amazon EMR 管理指南*的[（可选）创建引导操作以安装其他软件](https://docs.amazonaws.cn/ElasticMapReduce/latest/ManagementGuide/emr-plan-bootstrap.html)。

## 减少映射器数量
<a name="EMRforDynamoDB.PerformanceTuning.Mappers.Decreasing"></a>

如果使用 `SELECT` 语句从映射到 DynamoDB 的外部 Hive 表选择数据，则 Hadoop 任务可以根据需要使用任意数量的任务，最多可达集群中的映射器最大数量。在这种情况下，长时间运行 Hive 查询会占用 DynamoDB 表的所有预置读取容量，从而对其他用户产生负面影响。

可以使用 `dynamodb.max.map.tasks` 参数设置映射任务的上限：

```
SET dynamodb.max.map.tasks=1
```

此值必须等于或大于 1。如果 Hive 处理查询，从 DynamoDB 表读取时生成的 Hadoop 任务将使用不超过 `dynamodb.max.map.tasks`。