gpt4 book ai didi

java - 如何通过 Java 中的 Executor Framework 在 DynamoDb 中获得最佳批量插入率?

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

我正在使用 DynamoDB SDK for Java 在本地 Dynamo DB 中进行批量写入(大约 5.5k 项)的 POC。我知道每个批量写入不能有超过 25 个写入操作,因此我将整个数据集分成 25 个项目的 block 。然后我将这些 block 作为 Executor 框架中的可调用操作传递。不过,我的结果并不令人满意,因为 5.5k 条记录的插入时间超过了 100 秒。

我不确定我还能如何优化它。在创建表时,我将 WriteCapacityUnit 设置为 400(不确定我可以提供的最大值是多少)并对其进行了一些试验,但它没有任何区别。我也尝试过更改执行程序中的线程数。

这是执行批量写入操作的主要代码:


public static void main(String[] args) throws Exception {

AmazonDynamoDBClient client = new AmazonDynamoDBClient().withEndpoint("http://localhost:8000");

final AmazonDynamoDB aws = new AmazonDynamoDBClient(new BasicAWSCredentials("x", "y"));
aws.setEndpoint("http://localhost:8000");

JSONArray employees = readFromFile();
Iterator<JSONObject> iterator = employees.iterator();

List<WriteRequest> batchList = new ArrayList<WriteRequest>();

ExecutorService service = Executors.newFixedThreadPool(20);

List<BatchWriteItemRequest> listOfBatchItemsRequest = new ArrayList<>();
while(iterator.hasNext()) {
if (batchList.size() == 25) {
Map<String, List<WriteRequest>> batchTableRequests = new HashMap<String, List<WriteRequest>>();
batchTableRequests.put("Employee", batchList);
BatchWriteItemRequest batchWriteItemRequest = new BatchWriteItemRequest();
batchWriteItemRequest.setRequestItems(batchTableRequests);
listOfBatchItemsRequest.add(batchWriteItemRequest);
batchList = new ArrayList<WriteRequest>();
}
PutRequest putRequest = new PutRequest();
putRequest.setItem(ItemUtils.fromSimpleMap((Map) iterator.next()));
WriteRequest writeRequest = new WriteRequest();
writeRequest.setPutRequest(putRequest);
batchList.add(writeRequest);
}

StopWatch watch = new StopWatch();
watch.start();

List<Future<BatchWriteItemResult>> futureListOfResults = listOfBatchItemsRequest.stream().
map(batchItemsRequest -> service.submit(() -> aws.batchWriteItem(batchItemsRequest))).collect(Collectors.toList());

service.shutdown();

while(!service.isTerminated());

watch.stop();
System.out.println("Total time taken : " + watch.getTotalTimeSeconds());

}

}

这是用于创建 dynamoDB 表的代码:

    public static void main(String[] args) throws Exception {
AmazonDynamoDBClient client = new AmazonDynamoDBClient().withEndpoint("http://localhost:8000");

DynamoDB dynamoDB = new DynamoDB(client);
String tableName = "Employee";
try {
System.out.println("Creating the table, wait...");
Table table = dynamoDB.createTable(tableName, Arrays.asList(new KeySchemaElement("ID", KeyType.HASH)

), Arrays.asList(new AttributeDefinition("ID", ScalarAttributeType.S)),
new ProvisionedThroughput(1000L, 1000L));
table.waitForActive();
System.out.println("Table created successfully. Status: " + table.getDescription().getTableStatus());

} catch (Exception e) {
System.err.println("Cannot create the table: ");
System.err.println(e.getMessage());
}
}

最佳答案

DynamoDB Local 是作为一种工具提供给需要为 DynamoDB 进行离线开发的开发人员的,并不是为规模或性能而设计的。因此,它不适用于规模测试,如果您需要测试批量负载或其他高速工作负载,最好使用真实表。在实时表上进行开发测试所产生的实际成本通常非常小,因为只需要在测试运行期间为高容量配置表。

关于java - 如何通过 Java 中的 Executor Framework 在 DynamoDb 中获得最佳批量插入率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56811061/

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