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データを含むファイルまたはディレクトリをファイル・システムから移行できます。

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

手順

DynamoDB JSONデータをOracle NoSQL Databaseに移行するには:
  1. 識別されたソースおよびシンクの詳細を含む構成ファイル(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"
      }
  2. コマンド・プロンプトを開き、NoSQL Database Migratorユーティリティを展開したディレクトリに移動します。
  3. オプション1と2で別個の構成ファイルを渡すことでrunMigratorコマンドを実行します。--configまたは-cオプションを使用します。
    ./runMigrator --config <complete/path/to/the/JSON/config/file>
  4. 次の例で示すように、ユーティリティでデータ移行が続行されます:
    [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.

検証

データ・ストアでSQLプロンプトを起動します。
 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}}}