本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 DynamoDB 中优化亚马逊EMR运营的性能
Amazon 对 DynamoDB 表的EMR操作算作读取操作,并受该表的预配置吞吐量设置的约束。Amazon EMR 实施自己的逻辑来尝试平衡您的 DynamoDB 表上的负载,以最大限度地减少超出预配置吞吐量的可能性。在每个 Hive 查询结束时,Amazon 都会EMR返回有关用于处理查询的集群的信息,包括超过预配置吞吐量的次数。您可以使用这些信息以及有关您的 DynamoDB 吞吐量的 CloudWatch 指标,在后续请求中更好地管理 DynamoDB 表上的负载。
以下因素会影响 Hive 在处理 DynamoDB 表时的查询性能。
预置的读取容量单位
对 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 界面。
读取百分比设置
默认情况下,Amazon 会根据您当前的预配置吞吐量EMR管理您的 DynamoDB 表的请求负载。但是,当 Amazon EMR 返回的任务信息中包含大量预配置吞吐量超过响应时,您可以在设置 Hive 表时使用dynamodb.throughput.read.percent
参数调整默认读取速率。有关设置读取百分比参数的更多信息,请参阅 Hive 选项。
写入百分比设置
默认情况下,Amazon 会根据您当前的预配置吞吐量EMR管理您的 DynamoDB 表的请求负载。但是,当 Amazon EMR 返回的任务信息中包含大量预配置吞吐量超过响应时,您可以在设置 Hive 表时使用dynamodb.throughput.write.percent
参数调整默认写入速率。有关设置写入百分比参数的更多信息,请参阅Hive 选项。
重试持续时间设置
默认情况下,如果在两分钟(默认EMR重试间隔)内未返回结果,Amazon 会重新运行 Hive 查询。在运行 Hive 查询时,您可以通过设置 dynamodb.retry.duration
参数来调整此时间间隔。有关设置写入百分比参数的更多信息,请参阅Hive 选项。
映射任务数
Hadoop 为了处理导出和查询 DynamoDB 中所存储数据的请求而启动的映射器守护进程的读取速率控制在每秒最多 1 MiB 之内,以限制所用的读取容量。如果在 DynamoDB 上有更多预置的吞吐量可用,则可以通过增加映射器守护进程数来改善 Hive 导出和查询操作的性能。为此,您可以增加集群中的EC2实例数量,也可以增加在每个EC2实例上运行的映射器守护程序的数量。
您可以通过停止当前集群并使用更多EC2实例重新启动集群来增加集群中的EC2实例数量。如果您是从 Amazon EMR 控制台启动集群,则可以在 “配置EC2实例” 对话框中指定实例的数量;如果要从中启动集群,则‑‑num-instances
可以选择此选项CLI。EC2
在实例上运行的地图任务数量取决于EC2实例类型。有关支持的EC2实例类型以及每种实例类型提供的映射器数量的更多信息,请参阅任务配置。其中,每个受支持的配置都有一个“任务配置”部分。
增加映射器守护程序数的另一个方法是,将 Hadoop 的 mapreduce.tasktracker.map.tasks.maximum
配置参数更改为更大的值。这样做的好处是,在不增加EC2实例数量或大小的情况下,为您提供更多的映射器,从而为您节省资金。缺点是,将此值设置得过高可能会导致集群中的EC2实例内存不足。要设置 mapreduce.tasktracker.map.tasks.maximum
,请启动集群并为 mapreduce.tasktracker.map.tasks.maximum
指定一个值,作为 mapred-site 配置分类的属性。如以下示例所示。有关更多信息,请参阅配置应用程序。
{ "configurations": [ { "classification": "mapred-site", "properties": { "mapred.tasktracker.map.tasks.maximum": "10" } } ] }
并行数据请求
从多个用户或多个应用程序向单个表发出的多个数据请求可能会耗尽预配置的读取吞吐量并降低性能。
处理持续时间
DynamoDB 中的数据一致性取决于在每个节点上执行读取和写入操作的顺序。当正在进行 Hive 查询时,其它应用程序可能会将新数据加载到 DynamoDB 表,或者修改或删除现有数据。在这种情况下,Hive 查询的结果可能无法反映查询运行时对数据所做的更改。
避免超出吞吐量
针对 DynamoDB 运行 Hive 查询时,请注意不要超出您的预置吞吐量,因为这会用尽应用程序调用 DynamoDB::Get
时所需的容量。为确保不会发生这种情况,您应DynamoDB::Get
通过查看 Amazon 中的日志和监控指标,定期监控读取量和应用程序调用的限制。 CloudWatch
请求时间
调度 Hive 查询以便在对 DynamoDB 表的需求较低时访问 DynamoDB 表,可以改善性能。举例来说,如果应用程序的大多数用户住在旧金山,您可以选择在太平洋标准时间凌晨 4 点导出每日数据。PST,此时大多数用户都处于睡眠状态,并且没有更新您的 DynamoDB 数据库中的记录。
基于时间的表
如果将数据组织为一系列基于时间的 DynamoDB 表(例如,每天一个表),您可以在该表不再处于活动状态时导出数据。您可以利用此方法将数据持续备份到 Amazon S3 中。
已存档数据
如果您计划对存储在 DynamoDB 中的数据运行多个 Hive 查询,并且您的应用程序可以容忍存档数据,则可能需要将数据导出到或 HDFS Amazon S3,然后对数据副本而不是 DynamoDB 运行 Hive 查询。这将节省读取操作和预配置的吞吐量。