【发布时间】:2015-06-23 12:51:03
【问题描述】:
我有一个在 AWS 云中运行的 DynamoDB,我正在使用常规(计划)基础上的数据填充它。基本上,每小时一次,我会收到一个需要处理的文件,并且必须将结果保存在数据库中。
我正在使用以下类来处理数据库连接并执行批量写入:
public class DynamoDBService {
private final AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient();
private final DynamoDBMapper mapper = new DynamoDBMapper(amazonDynamoDB);
@Value("${aws_region}")
private String region;
@PostConstruct
public void init() {
log.info("Region: {}", region);
amazonDynamoDB.setRegion(RegionUtils.getRegion(region));
}
/**
*
* @param records
*/
public void saveRecord(final Collection<Record> records) {
log.info("Saving records...");
// create table if necessary here
List<Record> recordsToSave = new ArrayList<Record>(100);
for (Record record : records) {
recordsToSave.add(record);
}
// save the records
List<FailedBatch> failedBatch = mapper.batchWrite(recordsToSave, new ArrayList<Record>());
// process failed writes here
log.info("All records have been saved.");
}
}
问题是写入速度非常缓慢。我阅读了文档并增加了吞吐能力(因此它现在应该支持超过 300000 次写入/小时),但处理一个包含大约8000 条记录。
我读到一个批处理操作中的最佳写入次数是 25 次,并且一条记录的大小低于 1kb。我在本地机器(我知道由于流量开销会比较慢)和 AWS 工作环境中都对其进行了测试,但结果都很慢。有什么方法可以优化这个过程吗?
【问题讨论】:
-
您配置的写入吞吐量是多少?执行此操作时消耗了什么?您是否在这些电话中受到限制(可能是single partition throughput exceeded)?您是否在单个线程上编写所有这些记录(可能是 IO 绑定的)?您是否尝试过增加连接池的大小?
-
我强烈建议您通过分析器运行您的代码(即:JProfiler)以缩小问题范围。根据给定的信息,它可以是任何东西——使用遥远的区域(增加延迟)、写入限制、热哈希键、转换记录的问题,或者完全其他的东西。来自分析器的信息会让您知道调查的重点。另外,您的记录/表格是什么样的?如果您有很多具有相同哈希键(或定义不明确的 LSI/GSI)的记录,这可能是罪魁祸首。
标签: java amazon-web-services amazon-dynamodb