Dynamo 吞吐量未达到预置水平 - 使用 Hive 和 EMR 5.2

Posted

技术标签:

【中文标题】Dynamo 吞吐量未达到预置水平 - 使用 Hive 和 EMR 5.2【英文标题】:Dynamo throughput not reaching provisioned level - using Hive and EMR 5.2 【发布时间】:2017-01-11 16:27:07 【问题描述】:

我们使用在 EMR 5.2.0 上运行的 Hive 将许多文件运行到 Dynamo 表中。表上的预置吞吐量为每秒 3000 次写入。

无论 Hive 脚本中设置的吞吐量百分比如何,我们只能达到 2000 次写入。

Hive 执行引擎设置为 mr,dynamo.throughput.read.percent 设置为 1.0。 我们使用 EMR 通过 command-runner 运行该步骤。到目前为止,我们无法找到它只使用 2/3 的预置写入的任何原因。

任何建议或帮助将不胜感激,谢谢。

编辑添加配置单元脚本:

    SET hive.execution.engine=mr;
DROP TABLE IF EXISTS s3_import;
DROP TABLE IF EXISTS dynamo_import;

CREATE EXTERNAL TABLE s3_import(fld string, dateRef string)
ROW FORMAT
DELIMITED FIELDS
TERMINATED BY ','
ESCAPED BY '\\'
LOCATION 's3n://$s3Path';

CREATE EXTERNAL TABLE dynamo_import(fld string, dateRef string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = '$tableName',
"dynamodb.throughput.read.percent" = '$rp',
"dynamodb.throughput.write.percent" = '$wp',
"dynamodb.column.mapping" = "fld:fld,dateRef:dateRef");

INSERT OVERWRITE TABLE dynamo_import SELECT * FROM s3_import;

编辑: 如果我并行运行两个应用程序,使用 0.5 作为写入吞吐量,我们能够在预置量内实现最佳写入,这让我认为可能是集群设置导致问题?

【问题讨论】:

你是在统一读取表上的分区吗?可能是您超出了分区的吞吐量,例如 @Henry - 嗨,老实说,我不确定。如果这有助于回答您的问题,我已经添加了脚本 - 假设您不介意偷看一下 桌子的尺寸是多少?还有,预置的读/写吞吐量? @ketanvijayvargiya - 我们正在写入的表的大小目前是 20GB,它的写入吞吐量是每秒 3000,读取是 100,但我们不从中读取。 【参考方案1】:

读取和写入百分比设置是尽力而为速率限制器。 DynamoDB 连接器根据项目大小启发式估计读取和写入容量,并且可能并不总是正确。这就是为什么您实际上可以“过度配置”读取和写入高达 1.5 (150%),所以您应该尝试一下。

实际上可能导致您的写入容量未达到预置限制的另一件事是密钥空间中存在热点。如果一个分区中的项目比其他分区多,那么利用率将不均匀,即使您没有为整个表使用完整的预置速率,您也会遇到限制(一个或两个分区)。如果有 3000 个写入容量单位和一些读取,您的表至少有 4 个分区,所以这绝对是一个因素。

【讨论】:

以上是关于Dynamo 吞吐量未达到预置水平 - 使用 Hive 和 EMR 5.2的主要内容,如果未能解决你的问题,请参考以下文章

超过预置吞吐量时应该怎么做?

30_redis cluster通过master水平扩容来支撑更高的读写吞吐+海量数据

DynamoDB 何时限制请求?

海康ptz摄像机怎么设置24小时转

数据库怎么分库分表,垂直?水平?

数据库之分库分表-垂直?水平?