web-dev-qa-db-ja.com

AWS DynamodbをS3にバックアップする

Amazon docshttp://aws.Amazon.com/dynamodb/ では、Elastic Map Reduceを使用してdynamodbテーブルをバックアップできることが提案されています。
これがどのように機能するかについては一般的に理解していますが、これに関するガイドやチュートリアルは見つかりませんでした。

だから私の質問は、どのようにdynamodbバックアップを自動化できますか(EMRを使用して)?

これまでのところ、dynamodbからデータを読み取り、S3に書き込むreduce関数でマップ関数を使用して「ストリーミング」ジョブを作成する必要があると思います。これらはPython (またはJavaまたは他のいくつかの言語)。

コメント、説明、コードサンプル、修正を歓迎します。

29
Ali

AWS Data Pipelineの導入により、dynamodbからS3へのバックアップ用の既製のテンプレートを使用する最も簡単な方法は、Data Pipelineでバックアップをスケジュールすることです [link]

特別なニーズ(データ変換、非常にきめ細かい制御など)がある場合は、@ gregによる答えを検討してください。

33
Ali

MapReduceとDynamoDBを操作するための優れたガイドがいくつかあります。先日 this oneに従い、S3へのデータのエクスポートを無理なく行えるようにしました。バックアップタスクを実行するHiveスクリプトを作成し、それをS3バケットに保存し、言語のAWS APIを使用して、新しいEMRジョブフローを実用的にスピンアップし、バックアップを完了することをお勧めします。これをcronジョブとして設定できます。

DynamoからS3にデータをエクスポートするHiveスクリプトの例:

CREATE EXTERNAL TABLE my_table_dynamodb (
    company_id string
    ,id string
    ,name string
    ,city string
    ,state string
    ,postal_code string)
 STORED BY 'org.Apache.hadoop.Hive.dynamodb.DynamoDBStorageHandler'
 TBLPROPERTIES ("dynamodb.table.name"="my_table","dynamodb.column.mapping" = "id:id,name:name,city:city,state:state,postal_code:postal_code");

CREATE EXTERNAL TABLE my_table_s3 (
    ,id string
    ,name string
    ,city string
    ,state string
    ,postal_code string)
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
 LOCATION 's3://yourBucket/backup_path/dynamo/my_table';

 INSERT OVERWRITE TABLE my_table_s3
 SELECT * from my_table_dynamodb;

以下に、新しいEMRジョブフローを起動するPHPスクリプトの例を示します。

$emr = new AmazonEMR();

$response = $emr->run_job_flow(
            'My Test Job',
            array(
                "TerminationProtected" => "false",
                "HadoopVersion" => "0.20.205",
                "Ec2KeyName" => "my-key",
                "KeepJobFlowAliveWhenNoSteps" => "false",
                "InstanceGroups" => array(
                    array(
                        "Name" => "Master Instance Group",
                        "Market" => "ON_DEMAND",
                        "InstanceType" => "m1.small",
                        "InstanceCount" => 1,
                        "InstanceRole" => "MASTER",
                    ),
                    array(
                        "Name" => "Core Instance Group",
                        "Market" => "ON_DEMAND",
                        "InstanceType" => "m1.small",
                        "InstanceCount" => 1,
                        "InstanceRole" => "CORE",
                    ),
                ),
            ),
            array(
                "Name" => "My Test Job",
                "AmiVersion" => "latest",
                "Steps" => array(
                    array(
                        "HadoopJarStep" => array(
                            "Args" => array(
                                "s3://us-east-1.elasticmapreduce/libs/Hive/hive-script",
                                "--base-path",
                                "s3://us-east-1.elasticmapreduce/libs/Hive/",
                                "--install-Hive",
                                "--Hive-versions",
                                "0.7.1.3",
                            ),
                            "Jar" => "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
                        ),
                        "Name" => "Setup Hive",
                        "ActionOnFailure" => "TERMINATE_JOB_FLOW",
                    ),
                    array(
                        "HadoopJarStep" => array(
                            "Args" => array(
                                "s3://us-east-1.elasticmapreduce/libs/Hive/hive-script",
                                "--base-path",
                                "s3://us-east-1.elasticmapreduce/libs/Hive/",
                                "--Hive-versions",
                                "0.7.1.3",
                                "--run-Hive-script",
                                "--args",
                                "-f",
                                "s3n://myBucket/Hive_scripts/Hive_script.hql",
                                "-d",
                                "INPUT=Var_Value1",
                                "-d",
                                "LIB=Var_Value2",
                                "-d",
                                "OUTPUT=Var_Value3",
                            ),
                            "Jar" => "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
                        ),
                        "Name" => "Run Hive Script",
                        "ActionOnFailure" => "CANCEL_AND_WAIT",
                    ),
                ),
                "LogUri" => "s3n://myBucket/logs",
            )
        );

}
14
greg

DynamoDB StreamsとLambdaの導入により、DynamoDBデータのバックアップと増分バックアップを取得できるようになります。

DynamoDBストリームをLambda関数に関連付けて、データの更新ごとにコードを自動的にトリガーできます(つまり、S3などの別のストアへのデータ)

増分バックアップのためにDynamoDbと連携するために使用できるラムダ関数:

https://github.com/PageUpPeopleOrg/dynamodb-replicator

私のブログで、DynamoDB Streams、Lambda、およびS3バージョン管理バケットを使用して、DynamoDbのデータの増分バックアップを作成する方法について詳しく説明しました。

https://www.abhayachauhan.com/category/aws/dynamodb/dynamodb-backups

編集:

2017年12月の時点で、DynamoDBはOn Demand Backups/Restoresをリリースしました。これにより、バックアップを取り、DynamoDBにネイティブに保存できます。新しいテーブルに復元できます。それらをスケジュールするコードを含む、詳細なウォークスルーがここに提供されます。

https://www.abhayachauhan.com/2017/12/dynamodb-scheduling-on-demand-backups

HTH

10
Abhaya Chauhan

AWS Data Pipelineは高価であり、テンプレートプロセスの管理の複雑さは、スケジュールを変更して実行できるCLIコマンドの単純さと比較できません(cron、Teamcityまたは選択したCIツールを使用)

Amazonは、利益を上げるData Pipelineを宣伝しています。非常に大きなデータベース(> 3GB)がある場合にのみパフォーマンスが向上するので、それは本当に意味があると思います。

中小規模のデータベース(1GB以下)の場合、利用可能な多くのツールのいずれかを使用することをお勧めします。以下の3つはすべて、コマンドラインからバックアップおよび復元プロセスを処理できます。

帯域幅/遅延の問題により、これらは常にローカルネットワークよりもEC2インスタンスからの方がパフォーマンスが高いことに注意してください。

6
Steven de Salas

シンプルなnode.jsスクリプト dynamo-archive.js を使用できます。これは、Dynamoテーブル全体をスキャンし、出力をJSONファイルに保存します。次に、s3cmdを使用してS3にアップロードします。

5
yegor256

この便利な dynamodump ツールを使用して、python based(uses boto )を使用して、テーブルをJSONファイルにダンプします。 S3とs3cmd

3
250R

aWSデータパイプラインには制限領域があります。

テンプレートのデバッグに2時間かかりました。

https://docs.aws.Amazon.com/general/latest/gr/rande.html#datapipeline_region

2
xichen

dynamodb-backup lambda 関数が本当に役立つことがわかりました。セットアップに5分かかり、Cloudwatchスケジュールイベントを使用するように簡単に設定できます(忘れずにnpm install最初に)。

また、Data Pipelineを利用する方がずっと安く(1か月あたり約40ドル)、1か月あたり約1.5セント(両方ともS3ストレージなし)になると見積もっています。デフォルトですべてのDynamoDBテーブルを一度にバックアップすることに注意してください。これはコード内で簡単に調整できます。

唯一の欠落部分は、機能が失敗した場合に通知されることであり、Data Pipelineはそれを実行できました。

1
Ben Romberg