

# DynamoDB 预置吞吐量
<a name="EMRforDynamoDB.PerformanceTuning.Throughput"></a>

如果针对外部 DynamoDB 表发出 HiveQL 语句，`DynamoDBStorageHandler` 类创建相应低级别 DynamoDB API 请求，占用预置吞吐量。如果 DynamoDB 表没有足够的读取或写入容量，请求将受到限制，导致 HiveQL 性能降低。因此，应确保该表具有足够的吞吐量。

例如，假设为 DynamoDB 表预置 100 个读取容量单位。这将允许您每秒读取 409,600 字节（100 × 4 KB 读取容量单位大小）。现在假定该表包含 20 GB 的数据（21,474,836,480 字节），希望使用 `SELECT` 语句通过 HiveQL 选择所有数据。可以如下估计查询需要的时间：

 * 21474836480/409600 = 52429 秒 = 14.56 小时 * 

在这种情况下 DynamoDB 表是一个瓶颈。添加更多 Amazon EMR 节点没有帮助，因为 Hive 吞吐量限制为每秒 409,600 字节。减少 `SELECT` 语句所需时间的唯一方法是增加 DynamoDB 表的预置读取容量。

可以执行类似计算估计将数据批量加载到映射到 DynamoDB 表的 Hive 外部表中所需的时间。确定每个项目所需的写入容量单位总数（小于 1 KB = 1，1-2 KB = 2 等），然后将其乘以要加载的项目数。这将为您提供所需的写入容量单位数。用该数除以每秒分配的写入容量单位数。得到加载表所需的秒数。

您应定期监控表的 CloudWatch 指标。有关 DynamoDB 控制台的快速概述，请选择表，然后选择**指标**选项卡。这里可以查看占用的读取和写入容量单位，以及已受到限制的读取和写入请求。

## 读取容量
<a name="EMRforDynamoDB.PerformanceTuning.Throughput.ReadCapacity"></a>

Amazon EMR 根据表的预置吞吐量设置。管理对 DynamoDB 表的请求负载。但是，如果在任务输出中看到大量 `ProvisionedThroughputExceeded` 消息，可以调整默认读取速率。要执行该操作，可修改 `dynamodb.throughput.read.percent` 配置变量。可以使用 `SET` 命令在 Hive 命令提示符处设置此变量：

```
1. SET dynamodb.throughput.read.percent=1.0;
```

此设置仅为当前 Hive 会话保留。如果退出 Hive 并在以后返回，`dynamodb.throughput.read.percent` 将恢复默认值。

值 `dynamodb.throughput.read.percent` 可以在 `0.1` 和 `1.5` 之间（包括）。`0.5` 表示默认读取速率，这意味着 Hive 将尝试占用表的一半的读取容量。如果增加值超过 `0.5`，Hive 将增加请求速率；将值降低到 `0.5` 以下将降低读取请求速率。（实际读取速率取决于 DynamoDB 表中是否存在统一键分配的等因素。）

如果发现 Hive 经常耗尽表的预置读取容量，或者如果读取请求被限制过多，请尝试减少 `dynamodb.throughput.read.percent` 低于 `0.5`。如果表中有足够的读取容量，希望更快响应 HiveQL 操作，可以设置值超过 `0.5`。

## 写入容量
<a name="EMRforDynamoDB.PerformanceTuning.Throughput.WriteCapacity"></a>

Amazon EMR 根据表的预置吞吐量设置管理对 DynamoDB 表的请求负载。但是，如果在任务输出中看到大量 `ProvisionedThroughputExceeded` 消息，可以调整默认写入速率。要执行该操作，可修改 `dynamodb.throughput.write.percent` 配置变量。可以使用 `SET` 命令在 Hive 命令提示符处设置此变量：

```
1. SET dynamodb.throughput.write.percent=1.0;
```

此设置仅为当前 Hive 会话保留。如果退出 Hive 并在以后返回，`dynamodb.throughput.write.percent` 将恢复默认值。

值 `dynamodb.throughput.write.percent` 可以在 `0.1` 和 `1.5` 之间（包含上述两者）。`0.5` 表示默认写入速率，这意味着 Hive 将尝试占用表的一半的写入容量。如果增加值超过 `0.5`，Hive 将增加请求速率；将值降低到 `0.5` 以下将降低写入请求速率。（实际写入速率取决于 DynamoDB 表中是否存在统一键分配的等因素。）

如果发现 Hive 经常耗尽表的预置写入容量，或者如果写入请求被限制过多，请尝试减少 `dynamodb.throughput.write.percent` 低于 `0.5`。如果表中有足够的容量，希望更快响应 HiveQL 操作，可以设置值超过 `0.5`。

使用 Hive 将数据写入到 DynamoDB 时，确保写入容量单位数大于集群的映射器数量。例如，假设 Amazon EMR 集群包含 10 个 *m1.xlarge* 节点。*m1.xlarge* 节点类型提供 8 个映射器任务，因此集群总共有 80 个映射器 (10 × 8)。如果 DynamoDB 表的写入容量单位少于 80，则 Hive 写入操作可能会占用该表的所有写入吞吐量。

要确定 Amazon EMR 节点类型的映射器数量，请参见 *Amazon EMR 开发人员指南*的[任务配置](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-hadoop-task-config.html)。

有关映射器的更多信息，请参阅 [调整映射器](EMRforDynamoDB.PerformanceTuning.Mappers.md)。