将AWS Dynamodb备份到S3

时间:2012-11-29 16:49:28

标签: amazon-s3 backup amazon-dynamodb elastic-map-reduce

在其他地方Amazon docs http://aws.amazon.com/dynamodb/建议您使用Elastic Map Reduce备份您的dynamodb表格,
我对这如何运作有一个大致的了解,但我找不到任何指南或教程,

所以我的问题是如何自动化dynamodb备份(使用EMR)?

到目前为止,我认为我需要使用map函数创建一个“流”作业,该函数从dynamodb读取数据,并将reduce写入S3,我相信这些可以用Python(或java或者几个)编写其他语言)。

欢迎任何评论,澄清,代码示例,更正。

9 个答案:

答案 0 :(得分:33)

随着AWS Data Pipeline的推出,以及用于Dynamodb到S3备份的现成模板,最简单的方法是在数据管道中安排备份[link]

如果您有特殊需求(数据转换,非常精细的谷物控制......),请考虑@greg的答案

答案 1 :(得分:14)

使用MapReduce和DynamoDB有一些很好的指南。前几天我跟踪了this一个,并且数据导出到S3顺利无痛。我认为最好的办法是创建一个执行备份任务的配置单元脚本,将其保存在S3存储桶中,然后使用AWS API为您的语言实用地启动新的EMR作业流程,完成备份。您可以将其设置为cron作业。

将数据从Dynamo导出到S3的配置单元示例:

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;

以下是一个PHP脚本示例,它将启动新的EMR作业流程:

$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",
            )
        );

}

答案 2 :(得分:10)

随着DynamoDB Streams和Lambda的推出 - 您应该能够对DynamoDB数据进行备份和增量备份。

您可以将DynamoDB Stream与Lambda函数关联,以自动触发每次数据更新的代码(即:数据到另一个商店,如S3)

可用于绑定DynamoDb以进行增量备份的lambda函数:

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

我已经详细解释了如何使用DynamoDB Streams,Lambda和S3版本的存储桶在我的博客上为DynamoDb中的数据创建增量备份:

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

编辑:

截至2017年12月,DynamoDB已发布按需备份/恢复。这允许您进行备份并将它们本地存储在DynamoDB中。它们可以恢复到新表。 这里提供了详细的演练,包括安排它们的代码:

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

HTH

答案 3 :(得分:5)

您可以使用我的简单node.js脚本dynamo-archive.js,它扫描整个Dynamo表并将输出保存到JSON文件。然后,使用s3cmd将其上传到S3。

答案 4 :(得分:5)

AWS Data Pipeline成本高昂,管理模板化流程的复杂性无法与CLI命令的简单性相比较,您可以对计划进行更改并按计划运行(使用cron,Teamcity或您选择的CI工具)

亚马逊推广数据管道,因为它们可以从中获利。我会说,只有拥有一个非常大的数据库(> 3GB)才真正有意义,因为性能提升是合理的。

对于中小型数据库(1GB或更少),我建议您使用众多可用工具中的一种,以下三种工具都可以从命令行处理备份和恢复过程:

请记住,由于带宽/延迟问题,从EC2实例开始,这些问题总是比本地网络更好。

答案 5 :(得分:2)

您可以使用这个基于python(使用dynamodump)的方便boto工具将表转储到JSON文件中。然后使用s3cmd

上传到S3

答案 6 :(得分:1)

我发现dynamodb-backup lambda功能非常有用。我花了5分钟进行设置,并且可以轻松配置为使用Cloudwatch Schedule事件(不要忘记在开始时运行npm install)。

对于我来自Data Pipeline(每月约40美元)来说,它也便宜很多,我估计每月的成本约为1.5美分(两者都没有S3存储)。请注意,它默认备份所有DynamoDB表,可以在代码中轻松调整。

唯一缺失的部分是在函数失败时通知,数据管道能够做到。

答案 7 :(得分:1)

aws数据管道具有限制区域。

我花了2个小时来调试模板。

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

答案 8 :(得分:1)

您现在可以在本地backup your DynamoDB data straight to S3,无需使用数据管道或编写自定义脚本。这可能是实现您想要的最简单方法,因为它不需要您编写任何代码和运行任何任务/脚本,因为它是完全托管的。