36

Amazon docs http://aws.amazon.com/dynamodb/等其他地方建议您可以使用 Elastic Map Reduce 备份您的 dynamodb 表,
我对它的工作原理有一个大致的了解,但我不能查找有关此的任何指南或教程,

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

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

任何评论,澄清,代码示例,更正表示赞赏。

4

9 回答 9

38

随着 AWS Data Pipeline 的引入,以及用于 dynamodb 到 S3 备份的现成模板,最简单的方法是在 Data Pipeline [链接]中安排备份,

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

于 2013-02-04T15:19:11.277 回答
14

有一些很好的使用 MapReduce 和 DynamoDB 的指南。前几天我关注了这个,并将数据导出到 S3 相当轻松。我认为您最好的选择是创建一个执行备份任务的配置单元脚本,将其保存在 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;

下面是一个 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",
            )
        );

}
于 2012-11-30T17:21:32.327 回答
12

随着 DynamoDB Streams 和 Lambda 的引入,您应该能够对 DynamoDB 数据进行备份和增量备份。

您可以将您的 DynamoDB 流与 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

高温高压

于 2016-06-07T10:40:46.337 回答
11

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

亚马逊推广 Data Pipeline 是因为他们从中获利。我想说只有当你有一个非常大的数据库(> 3GB)时它才真正有意义,因为性能改进将证明它是合理的。

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

请记住,由于带宽/延迟问题,这些在 EC2 实例中的性能总是比您的本地网络更好。

于 2017-04-23T02:21:06.703 回答
5

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

于 2013-06-02T08:56:12.290 回答
3

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

于 2014-04-15T06:59:27.537 回答
2

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

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

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

于 2018-07-11T22:39:50.867 回答
1

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

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

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

于 2016-12-03T10:25:51.650 回答
0

您现在可以将 DynamoDB 数据直接备份到 S3,而无需使用 Data Pipeline 或编写自定义脚本。这可能是实现您想要的最简单的方法,因为它不需要您编写任何代码并运行任何任务/脚本,因为它是完全托管的。

于 2021-04-11T18:44:05.950 回答