gpt4 book ai didi

java - DynamoDB - 写入操作非常慢

转载 作者:行者123 更新时间:2023-11-30 08:11:28 25 4
gpt4 key购买 nike

我有一个在 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 次写入/小时)但是处理一个包含大约的列表需要超过 15 分钟。 8000 条记录。

我读到,一次批处理操作中的最佳写入次数是 25,一条记录的大小低于 1kb。我在我的本地机器(我知道由于流量开销,它会变慢)和 AWS worker 环境中都测试了它,但结果都很慢。有什么方法可以优化这个过程?

最佳答案

首先,为了避免在多个线程中有多个 DynamoDBMapper/client 实例,请将 Mapper 和 AmazonDynamoDB 客户端设为静态。其次,您应该使用 Guava RateLimiter 或类似工具进行 self 节流。将速率设置为等于您在表上配置的每秒写入次数,并在每次 batchWrite 调用之前获得 25 个许可,只要您的项目小于 1KB。第三,您可以并行运行 mapper.batchWrite 调用。每小时 300000 次写入大约是每秒 83 次写入。这意味着您的表可能有 1 个分区,只要存储在表中的数据量小于 10GB(我假设这是真的)。第四,您可以减少客户端配置中的 dynamodb.timeout。这可能会有所帮助,因为 BatchWrite 操作与批处理中最潜在的单个 PutRequest 一样潜在。您也可以尝试减少或关闭 SDK 重试。

请注意,一个分区每秒支持的最大写入次数为 1000。您过去可能预配太多,导致您的表因 IOPS 而 split 。如果您有一个 Hash+Range 模式,并且您将许多项目写入相同的哈希键但不同的范围键,那么所有这些写入都将写入同一个分区。因此,即使您的表上所有写入容量的总和可能是每秒 83 次写入,您也可能遇到这样的情况:您有很多分区并且分区级别的写入配置不足以支持您的负载。

在这种情况下,有两种可能的方法。您可以开始对您的散列键进行分区,并使用 key1、key2、key3 等作为相同逻辑“键”的散列键,并在您的项目的范围键上使用散列和模除法来决定该项目应该对哪个散列键进行分区被写入。第二个也是更好的选择是评估您的架构,以确保您的写入在哈希范围键空间中均匀分布。

关于java - DynamoDB - 写入操作非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31003311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com