Dynamodb-batch-writing
DynamoDB-バッチ書き込み
バッチ書き込みは、複数のアイテムを作成または削除することにより、複数のアイテムで動作します。 これらの操作は、 BatchWriteItem を使用します。これには、16MBの書き込みと25のリクエストしか制限されません。 各アイテムは400KBのサイズ制限に従います。 バッチ書き込みもアイテムの更新を実行できません。
バッチライティングとは何ですか?
バッチ書き込みでは、複数のテーブルにわたってアイテムを操作できます。 操作の呼び出しは個々の要求ごとに発生します。つまり、操作は互いに影響を与えず、異種混合が許可されます。たとえば、バッチ内の1つの PutItem リクエストと3つの DeleteItem リクエストがあり、PutItemリクエストの失敗は他に影響しません。 リクエストが失敗すると、失敗した各リクエストに関連する情報(キーとデータ)が返されます。
注-DynamoDBがアイテムを処理せずに返す場合、それらを再試行します。ただし、過負荷に基づく別の要求の失敗を回避するには、バックオフメソッドを使用します。
DynamoDBは、次のステートメントの1つ以上が真であることが判明した場合、バッチ書き込み操作を拒否します-
- 要求は、プロビジョニングされたスループットを超えています。
- リクエストは BatchWriteItems を使用してアイテムを更新しようとします。
- 要求は、単一のアイテムに対して複数の操作を実行します。
- 要求テーブルが存在しません。
- リクエストのアイテム属性がターゲットと一致しません。
- 要求がサイズ制限を超えています。
バッチ書き込みには、特定の RequestItem パラメーターが必要です-
- 削除操作には、属性名と値を意味する DeleteRequest キー subelements が必要です。
- PutRequest アイテムには、属性および属性値マップを意味する* Itemサブ要素*が必要です。
応答-操作が成功するとHTTP 200応答が発生します。これは、消費されたキャパシティーユニット、テーブル処理メトリック、未処理アイテムなどの特性を示します。
Javaを使用したバッチ書き込み
DynamoDBクラスインスタンス、すべての操作を記述する TableWriteItems クラスインスタンスを作成し、 batchWriteItem メソッドを呼び出してTableWriteItemsオブジェクトを使用することにより、バッチ書き込みを実行します。
注-複数のテーブルへのバッチ書き込みでは、すべてのテーブルに対してTableWriteItemsインスタンスを作成する必要があります。 また、未処理のリクエストがないかリクエストレスポンスを確認してください。
次のバッチ書き込みの例を確認できます-
DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(
new ProfileCredentialsProvider()));
TableWriteItems forumTableWriteItems = new TableWriteItems("Forum")
.withItemsToPut(
new Item()
.withPrimaryKey("Title", "XYZ CRM")
.withNumber("Threads", 0));
TableWriteItems threadTableWriteItems = new TableWriteItems(Thread)
.withItemsToPut(
new Item()
.withPrimaryKey("ForumTitle","XYZ CRM","Topic","Updates")
.withHashAndRangeKeysToDelete("ForumTitle","A partition key value",
"Product Line 1", "A sort key value"));
BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (
forumTableWriteItems, threadTableWriteItems);
次のプログラムは、バッチがJavaで書き込む方法をよりよく理解するためのもう1つの大きな例です。
注-次の例では、以前に作成されたデータソースを想定しています。 実行を試みる前に、サポートライブラリを取得し、必要なデータソース(必要な特性を備えたテーブル、または他の参照ソース)を作成します。
この例では、Eclipse IDE、AWS認証情報ファイル、およびEclipse AWS Javaプロジェクト内のAWS Toolkitも使用します。
package com.amazonaws.codesamples.document;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.BatchWriteItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableWriteItems;
import com.amazonaws.services.dynamodbv2.model.WriteRequest;
public class BatchWriteOpSample {
static DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(
new ProfileCredentialsProvider()));
static String forumTableName = "Forum";
static String threadTableName = "Thread";
public static void main(String[] args) throws IOException {
batchWriteMultiItems();
}
private static void batchWriteMultiItems() {
try {
//Place new item in Forum
TableWriteItems forumTableWriteItems = new TableWriteItems(forumTableName)
//Forum
.withItemsToPut(new Item()
.withPrimaryKey("Name", "Amazon RDS")
.withNumber("Threads", 0));
//Place one item, delete another in Thread
//Specify partition key and range key
TableWriteItems threadTableWriteItems = new TableWriteItems(threadTableName)
.withItemsToPut(new Item()
.withPrimaryKey("ForumName","Product
Support","Subject","Support Thread 1")
.withString("Message", "New OS Thread 1 message")
.withHashAndRangeKeysToDelete("ForumName","Subject", "Polymer Blaster",
"Support Thread 100"));
System.out.println("Processing request...");
BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (
forumTableWriteItems, threadTableWriteItems);
do {
//Confirm no unprocessed items
Map<String, List<WriteRequest>> unprocessedItems
= outcome.getUnprocessedItems();
if (outcome.getUnprocessedItems().size() == 0) {
System.out.println("All items processed.");
} else {
System.out.println("Gathering unprocessed items...");
outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems);
}
} while (outcome.getUnprocessedItems().size() > 0);
} catch (Exception e) {
System.err.println("Could not get items: ");
e.printStackTrace(System.err);
}
}
}