Amazon s3 将AWS Dynamodb备份到S3

Amazon s3 将AWS Dynamodb备份到S3,amazon-s3,backup,amazon-dynamodb,elastic-map-reduce,Amazon S3,Backup,Amazon Dynamodb,Elastic Map Reduce,在其他地方,有人建议您可以使用Elastic Map Reduce备份dynamodb表, 我大致了解这是如何工作的,但我找不到任何关于这方面的指南或教程 因此,我的问题是如何自动化dynamodb备份(使用EMR) 到目前为止,我认为我需要创建一个“流”作业,其中包含一个map函数,从dynamodb读取数据,以及一个reduce,将数据写入S3,我相信这些可以用Python(或java或其他一些语言)编写 欢迎提供任何评论、澄清、代码示例和更正。对于使用MapReduce和DynamoDB,

在其他地方,有人建议您可以使用Elastic Map Reduce备份dynamodb表,
我大致了解这是如何工作的,但我找不到任何关于这方面的指南或教程

因此,我的问题是如何自动化dynamodb备份(使用EMR)

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


欢迎提供任何评论、澄清、代码示例和更正。

对于使用MapReduce和DynamoDB,有一些很好的指南。前几天我跟踪了其中一个,数据导出到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",
            )
        );

}

随着AWS数据管道的引入,以及dynamodb到S3备份的现成模板,最简单的方法是在数据管道中安排备份


如果您有特殊需要(数据转换,非常精细的晶粒控制……),请考虑格雷戈@ < /P> > P>您可以使用我的简单NoDE.js脚本,它扫描整个DyaNo表并将输出保存到JSON文件中。然后,您可以使用

s3cmd

将其上载到S3。您可以使用这个基于python(使用)的方便工具将表转储到JSON文件中。然后通过引入DynamoDB Streams和Lambda,使用s3cmd上传到S3,您应该能够对DynamoDB数据进行备份和增量备份

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

一个lambda函数,可用于与DynamoDb配合进行增量备份:

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

编辑:

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

HTH

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

对于我来说,使用数据管道(每月约40美元)也便宜得多,我估计每月的成本约为1.5美分(两者都没有S3存储)。注意,默认情况下,它一次备份所有DynamoDB表,可以在代码中轻松地进行调整


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

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

亚马逊促进数据管道,因为他们从中获利。我想说,只有当您有一个非常大的数据库(>3GB)时,它才真正有意义,因为性能的提高将证明这一点

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

  • ==> 使用NodeJS/npm将数据流还原到S3
  • ==>使用Golang将流还原到S3
  • ==>使用python进行本地备份/恢复,使用

请记住,由于带宽/延迟问题,在EC2实例中,它们的性能始终优于本地网络。

aws数据管道具有有限的区域

调试模板花了我两个小时


您现在可以以本机方式进行操作,而无需使用数据管道或编写自定义脚本。这可能是实现您想要的最简单的方法,因为它不需要您编写任何代码和运行任何任务/脚本,因为它是完全管理的。

我真希望这是一个更简单的过程。@CoryKendall我让它变得更简单了一点。在下面添加了一个备选答案。您使用“$this”,但没有。。。“$emr=$this->get('aws_emr');”@greg是否有方法将某些函数应用于配置单元脚本中的所有行?也就是说,我知道我所有的行在DyanmoDB表中都有一些
字段
,我希望输出备份有
f(字段)
其中
f
是一些函数?@sedavidw您需要更改最后一次插入查询以插入覆盖我的表\u s3选择col1、col2、f(col3)。。。从我的表格来看,为什么不使用亚马逊提供的数据管道工具(AWS?@Ali的一部分),由于EMR集群,数据管道工具速度非常慢,成本也非常高。它通常会使这些集群运行到终止期之后。一个简单的备份脚本可以在1/第一百的时间里做同样的工作,时间可以忽略不计。虽然这个链接有很多有用的信息和细节,但我绝对不会认为它是一个“详细的演练”。走一遍实际上需要走几步。我们如何设置ddb/streams/lambda/s3?我们如何配置复制器并使lambda使用它?4个部件一起工作涉及哪些IAM许可?等等……请注意,默认情况下,数据管道使用m3.xlarge实例。我每6小时运行一次备份,结果每天的费用超过1美元——几乎是我AWS总费用的一半。对于企业来说,这完全是一个问题