DynamoDB JSONファイルからOracle NoSQL Databaseへの移行
この例では、Oracle NoSQL Database Migratorを使用してDynamoDB JSONファイルをNoSQL Databaseにコピーする方法を示します。
ユースケース:
ある組織が、複数のオプションを評価した後、最終的に、DynamoDBデータベースの使用を止めてOracle NoSQL Databaseを使用することにします。その組織は、表とデータをDynamoDBからOracle NoSQL Database (オンプレミス)に移行する必要があります。
詳細は、「DynamoDB表からOracle NoSQL表へのマッピング」 を参照してください。
ソース構成テンプレートでパスを指定することで、DynamoDBがエクスポートしたJSONデータを含むファイルまたはディレクトリをファイル・システムから移行できます。
{"Item":{"Id":{"N":"101"},"Phones":{"L":[{"L":[{"S":"555-222"},{"S":"123-567"}]}]},"PremierCustomer":{"BOOL":false},"Address":{"M":{"Zip":{"N":"570004"},"Street":{"S":"21 main"},"DoorNum":{"N":"201"},"City":{"S":"London"}}},"FirstName":{"S":"Fred"},"FavNumbers":{"NS":["10"]},"LastName":{"S":"Smith"},"FavColors":{"SS":["Red","Green"]},"Age":{"N":"22"},"ttl": {"N": "1734616800"}}}
{"Item":{"Id":{"N":"102"},"Phones":{"L":[{"L":[{"S":"222-222"}]}]},"PremierCustomer":{"BOOL":false},"Address":{"M":{"Zip":{"N":"560014"},"Street":{"S":"32 main"},"DoorNum":{"N":"1024"},"City":{"S":"Wales"}}},"FirstName":{"S":"John"},"FavNumbers":{"NS":["10"]},"LastName":{"S":"White"},"FavColors":{"SS":["Blue"]},"Age":{"N":"48"},"ttl": {"N": "1734616800"}}}
エクスポートしたDynamoDB表データをAWS S3ストレージからローカルにマウントされたファイル・システムにコピーします。
次に例を示します。
このデモでは、DynamoDB JSONファイルをOracle NoSQL Database (オンプレミス)に移行する方法について学習します。この例では、手動で作成した構成ファイルを使用します。
前提条件
- 移行するソースとシンクを指定します。
- ソース: DynamoDB JSONファイル
- シンク: Oracle NoSQL Database (オンプレミス)
- DynamoDB表データをOracle NoSQL Databaseにインポートするには、まずDynamoDB表をS3にエクスポートする必要があります。表をエクスポートするには、Amazon S3へのDynamoDB表のエクスポートで示すステップを参照してください。エクスポート時に、DynamoDB JSONとして形式を選択します。エクスポートされたデータには、次に示すように、複数の
gzip
ファイルにDynamoDB表データが含まれています。/ 01639372501551-bb4dd8c3 |-- 01639372501551-bb4dd8c3 ==> exported data prefix |----data |------sxz3hjr3re2dzn2ymgd2gi4iku.json.gz ==>table data |----manifest-files.json |----manifest-files.md5 |----manifest-summary.json |----manifest-summary.md5 |----_started
- AWS S3からそれらのファイルをダウンロードする必要があります。ダウンロード後のファイルの構造は、次のようになります。
download-dir/01639372501551-bb4dd8c3 |----data |------sxz3hjr3re2dzn2ymgd2gi4iku.json.gz ==>table data |----manifest-files.json |----manifest-files.md5 |----manifest-summary.json |----manifest-summary.md5 |----_started
手順
- 識別されたソースおよびシンクの詳細を含む構成ファイル(JSON形式)を準備します。詳細は、「ソース構成テンプレート」と「シンク構成テンプレート」を参照してください。
ノート:
DynamoDBのエクスポートしたJSON表アイテムにTTL属性が含まれている場合に、オプションでTTL値をインポートするには、ソース構成テンプレートのttlAttributeName構成パラメータにその属性を指定し、シンク構成テンプレートでincludeTTL構成パラメータをtrueに設定します。次の2つのオプションのいずれかを選択できます。- オプション1: デフォルトのスキーマ構成を使用して、DynamoDB表をJSONドキュメントとしてインポートします。
ここでは、defaultSchema構成パラメータをtrueに設定します。そのため、NoSQL Database Migratorによってシンクにデフォルト・スキーマが作成されます。
DDBPartitionKey
および対応するNoSQL列タイプを指定する必要があります。それ以外の場合は、エラーが表示されます。DynamoDBのエクスポートしたJSONソースのデフォルト・スキーマの詳細は、「Oracle NoSQL Database Migratorのワークフロー」の「ソースとシンクの指定」のトピックを参照してください。{ "source" : { "type" : "file", "format" : "dynamodb_json", "ttlAttributeName" : "ttl", "dataPath" : "<complete/path/to/the/DynamoDB/Formatted/JSON/file>" }, "sink" : { "type" : "nosqldb", "storeName" : "kvstore", "helperHosts" : ["<hostname>:5000"], "table" : "sampledynDBImp", "includeTTL" : true, "schemaInfo" : { "DDBPartitionKey" : "Id:INTEGER", "defaultSchema" : true }, "overwrite" : true, "requestTimeoutMs" : 5000 }, "abortOnError" : true, "migratorVersion" : "1.6.5" }
この例では、次のデフォルト・スキーマが使用されています:CREATE TABLE IF NOT EXISTS sampledynDBImp (Id INTEGER, document JSON, PRIMARY KEY(SHARD(Id)))
- オプション2: ユーザー指定のスキーマ・ファイルを使用して、DynamoDB表を固定列としてインポートします。
ここでは、defaultSchema構成パラメータをfalseに設定します。そのため、schemaPathパラメータに、シンク表のDDL文を含むファイルを指定します。詳細は、「DynamoDB型からOracle NoSQL型へのマッピング」 を参照してください。
この例では、次のユーザー定義スキーマが使用されています:CREATE TABLE IF NOT EXISTS sampledynDBImp (Id INTEGER, document JSON, PRIMARY KEY(SHARD(Id)))
NoSQL Database Migratorにより、移行の一部として、そのスキーマ・ファイルを使用してシンクに表が作成されます。主キー・データが指定されていれば、入力JSONレコードが挿入されます。それ以外の場合は、エラーが表示されます。
ノート:
- NoSQL Databaseでサポートされていないデータ型がDynamo DB表にある場合は、移行に失敗します。
- 入力データに特定の列(主キー以外)の値が含まれていない場合は、列のデフォルト値が使用されます。そのデフォルト値は、表の作成中に、列定義に含まれている必要があります。たとえば、
id INTEGER not null default 0
です。列にデフォルト定義がない場合は、その列に値が指定されていないと、SQL NULLが挿入されます。 - DynamoDB表をJSONドキュメントとしてモデル化する場合は、主キー以外のデータをJSON列に集計するために、
AggregateFields
変換を使用してください。詳細は、「aggregateFields」を参照してください。
{ "source" : { "type" : "file", "format" : "dynamodb_json", "ttlAttributeName" : "ttl", "dataPath" : "<complete/path/to/the/DynamoDB/Formatted/JSON/file>" }, "sink" : { "type" : "nosqldb", "storeName" : "kvstore", "helperHosts" : ["<hostname>:5000"], "table" : "sampledynDBImp", "includeTTL" : true, "schemaInfo" : { "schemaPath" : "<full path of the schema file with the DDL statement>" }, "overwrite" : true, "requestTimeoutMs" : 5000 }, "transforms": { "aggregateFields" : { "fieldName" : "document", "skipFields" : ["Id"] } }, "abortOnError" : true, "migratorVersion" : "1.6.5" }
- オプション1: デフォルトのスキーマ構成を使用して、DynamoDB表をJSONドキュメントとしてインポートします。
- コマンド・プロンプトを開き、NoSQL Database Migratorユーティリティを展開したディレクトリに移動します。
- オプション1と2で別個の構成ファイルを渡すことで
runMigrator
コマンドを実行します。--config
または-c
オプションを使用します。./runMigrator --config <complete/path/to/the/JSON/config/file>
- 次の例で示すように、ユーティリティでデータ移行が続行されます:
[INFO] creating source from given configuration: [INFO] source creation completed [INFO] creating sink from given configuration: [INFO] sink creation completed [INFO] creating migrator pipeline [INFO] [nosqldb sink] : start loading DDLs [INFO] [nosqldb sink] : executing DDL: CREATE TABLE IF NOT EXISTS sampledynDBImp (Id INTEGER, document JSON, PRIMARY KEY(SHARD(Id))) [INFO] [nosqldb sink] : completed loading DDLs [INFO] migration started [INFO] Start writing data to OnDB Sink [INFO] executing for source:DynamoSample [INFO] [DDB file source] : start parsing JSON records from file: DynamoSample.json.gz [INFO] Writing data to OnDB Sink completed. [INFO] migration completed. Records provided by source=2, Records written to sink=2, Records failed=0,Records skipped=0. Elapsed time: 0min 0sec 45ms Migration completed.
検証
java -jar lib/sql.jar -helper-hosts localhost:5000 -store kvstore
SELECT * FROM sampledynDBImp
出力
_metadata
JSONオブジェクトにTTL情報が含まれていることに注目してください。{"Id":102,"document":{"Address":{"City":"Wales","DoorNum":1024,"Street":"32 main","Zip":560014},"Age":48,"FavColors":["Blue"],"FavNumbers":[10],"FirstName":"John","LastName":"White","Phones":[["222-222"]],"PremierCustomer":false,"_metadata":{"expiration":1734616196000}}}
{"Id":101,"document":{"Address":{"City":"London","DoorNum":201,"Street":"21 main","Zip":570004},"Age":22,"FavColors":["Red","Green"],"FavNumbers":[10],"FirstName":"Fred","LastName":"Smith","Phones":[["555-222","123-567"]],"PremierCustomer":false,"_metadata":{"expiration":1734616196000}}}