

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 DynamoDB 中优化 Amazon EMR 操作的性能
<a name="EMR_Hive_Optimizing"></a>

 对 DynamoDB 表进行的 Amazon EMR 操作作为读取操作，并受表预置的吞吐量设置约束。Amazon EMR 实施其逻辑来努力平衡 DynamoDB 表上的负载，从而最大程度降低超出您预置的吞吐量的可能性。每个 Hive 查询结束时，Amazon EMR 均返回有关用于处理查询的集群的信息，包括超出预置的吞吐量的次数。您可以使用这些信息以及有关您的 DynamoDB 吞吐量的 CloudWatch 指标，在后续请求中更好地管理 DynamoDB 表上的负载。

 以下因素会影响 Hive 在处理 DynamoDB 表时的查询性能。

## 预置的读取容量单位
<a name="ProvisionedReadCapacityUnits"></a>

 对 DynamoDB 表运行 Hive 查询时，您需要确保已预置足量的读取容量单位。

 例如，假设您为 DynamoDB 表预配置了 100 个读取容量单位。这将允许您每秒执行 100 次读取或读取 409600 字节。如果该表包含 20GB 的数据（21474836480 字节）并且您的 Hive 查询执行全表扫描，则可以估算执行查询将花费多长时间：

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

 减少所需时间的唯一方法是调整源 DynamoDB 表的读取容量单位。将更多节点添加到 Amazon EMR 集群不会有所帮助。

 在 Hive 输出中，当一个或多个映射器进程已完成时，将更新完成百分比。对于预配置的读取容量设置较低的大型 DynamoDB 表，完成百分比输出可能会很长时间不更新；在上面的示例中，作业将在几个小时内显示为完成 0%。有关作业进度的详细状态，请转到 Amazon EMR 控制台；您将可以查看单个映射器任务状态和数据读取统计数据。

 您还可以登录主节点的 Hadoop 界面，查看 Hadoop 统计数据。该界面将向您显示单个映射任务状态和一些数据读取统计数据。有关更多信息，请参阅《Amazon EMR 管理指南》**中的[托管在主节点上的 Web 页面](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-web-interfaces.html)。

## 读取百分比设置
<a name="ReadPercent"></a>

 默认情况下，Amazon EMR 根据当前的预置吞吐量管理对您的 DynamoDB 表的请求负载。但是，当 Amazon EMR 返回的作业相关信息中包括预置的吞吐量远远超出响应数时，您可以在设置 Hive 表时使用 `dynamodb.throughput.read.percent` 参数调整默认读取速率。有关设置读取百分比参数的更多信息，请参阅 [Hive 选项](EMR_Interactive_Hive.md#EMR_Hive_Options)。

## 写入百分比设置
<a name="WritePercent"></a>

 默认情况下，Amazon EMR 根据当前的预置吞吐量管理对您的 DynamoDB 表的请求负载。但是，当 Amazon EMR 返回的作业相关信息中所含预置的吞吐量远远超出响应数时，您可以在设置 Hive 表时使用 `dynamodb.throughput.write.percent` 参数调整默认写入速率。有关设置写入百分比参数的更多信息，请参阅[Hive 选项](EMR_Interactive_Hive.md#EMR_Hive_Options)。

## 重试持续时间设置
<a name="emr-ddb-retry-duration"></a>

 默认情况下，如果在两分钟（默认重试时间间隔）内没有返回结果，Amazon EMR 将重新运行 Hive 查询。在运行 Hive 查询时，您可以通过设置 `dynamodb.retry.duration` 参数来调整此时间间隔。有关设置写入百分比参数的更多信息，请参阅[Hive 选项](EMR_Interactive_Hive.md#EMR_Hive_Options)。

## 映射任务数
<a name="NumberMapTasks"></a>

 Hadoop 为了处理导出和查询 DynamoDB 中所存储数据的请求而启动的映射器守护进程的读取速率控制在每秒最多 1 MiB 之内，以限制所用的读取容量。如果在 DynamoDB 上有更多预置的吞吐量可用，则可以通过增加映射器守护进程数来改善 Hive 导出和查询操作的性能。为此，您可以增加中的 EC2 实例数，*或者*增加每个 EC2 实例上运行的映射器守护进程数。

 您可以通过停止当前集群，然后使用更大的 EC2 实例数重新启动它，来增加该集群中的 EC2 实例数。可在 **Configure EC2 Instances (配置 EC2 实例)** 对话框中指定 EC2 实例数（如果您从 Amazon EMR 控制台启动集群），也可以使用 `--num-instances` 选项指定 EC2 实例数（如果您从 CLI 启动）。

 实例上运行的映射任务数取决于 EC2 实例类型。有关受支持 EC2 实例类型及每种实例类型提供的映射器数的更多信息，请参阅 [任务配置](emr-hadoop-task-config.md)。其中，每个受支持的配置都有一个“任务配置”部分。

 增加映射器守护程序数的另一个方法是，将 Hadoop 的 `mapreduce.tasktracker.map.tasks.maximum` 配置参数更改为更大的值。此方法的优点是无需增加 EC2 实例的数量或大小即可为您提供更多映射器，从而为您节省资金。缺点是将此值设置得过大可能导致集群中的 EC2 实例用尽内存。要设置 `mapreduce.tasktracker.map.tasks.maximum`，请启动集群并为 `mapreduce.tasktracker.map.tasks.maximum` 指定一个值，作为 mapred-site 配置分类的属性。如以下示例所示。有关更多信息，请参阅[配置应用程序](emr-configure-apps.md)。

```
{
    "configurations": [
    {
        "classification": "mapred-site",
        "properties": {
            "mapred.tasktracker.map.tasks.maximum": "10"
        }
    }
    ]
}
```

## 并行数据请求
<a name="ParallelDataRequests"></a>

 从多个用户或多个应用程序向单个表发出的多个数据请求可能会耗尽预配置的读取吞吐量并降低性能。

## 处理持续时间
<a name="ProcessDuration"></a>

 DynamoDB 中的数据一致性取决于在每个节点上执行读取和写入操作的顺序。当正在进行 Hive 查询时，其它应用程序可能会将新数据加载到 DynamoDB 表，或者修改或删除现有数据。在这种情况下，Hive 查询的结果可能无法反映查询运行时对数据所做的更改。

## 避免超出吞吐量
<a name="AvoidExceedingThroughput"></a>

 针对 DynamoDB 运行 Hive 查询时，请注意不要超出您的预置吞吐量，因为这会用尽应用程序调用 `DynamoDB::Get` 时所需的容量。为确保不会发生这种情况，您应`DynamoDB::Get`通过查看 Amazon 中的日志和监控指标，定期监控读取量和应用程序调用的限制。 CloudWatch

## 请求时间
<a name="RequestTime"></a>

 调度 Hive 查询以便在对 DynamoDB 表的需求较低时访问 DynamoDB 表，可以改善性能。举例来说，如果应用程序的大多数用户住在旧金山，您可以选择在太平洋标准时间凌晨 4 点导出每日数据。（此时，大多数用户都已睡着且未在更新 DynamoDB 数据库中的记录） 

## 基于时间的表
<a name="TimeBasedTables"></a>

 如果将数据组织为一系列基于时间的 DynamoDB 表（例如，每天一个表），您可以在该表不再处于活动状态时导出数据。您可以利用此方法将数据持续备份到 Amazon S3 中。

## 已存档数据
<a name="ArchivedData"></a>

 如果您计划针对 DynamoDB 中存储的数据运行多个 Hive 查询，并且您的应用程序可以接纳已存档数据，那么您可能会希望将数据导出到 HDFS 或 Amazon S3，然后针对数据的副本（而非 DynamoDB）运行 Hive 查询。这将节省读取操作和预配置的吞吐量。