在其他地方Amazon docs http://aws.amazon.com/dynamodb/建议您使用Elastic Map Reduce备份您的dynamodb表格,
我对这如何运作有一个大致的了解,但我找不到任何指南或教程,
所以我的问题是如何自动化dynamodb备份(使用EMR)?
到目前为止,我认为我需要使用map函数创建一个“流”作业,该函数从dynamodb读取数据,并将reduce写入S3,我相信这些可以用Python(或java或者几个)编写其他语言)。
欢迎任何评论,澄清,代码示例,更正。
答案 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或更少),我建议您使用众多可用工具中的一种,以下三种工具都可以从命令行处理备份和恢复过程:
aws s3 cp
请记住,由于带宽/延迟问题,从EC2实例开始,这些问题总是比本地网络更好。
答案 5 :(得分:2)
您可以使用这个基于python(使用dynamodump)的方便boto工具将表转储到JSON文件中。然后使用s3cmd
答案 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,无需使用数据管道或编写自定义脚本。这可能是实现您想要的最简单方法,因为它不需要您编写任何代码和运行任何任务/脚本,因为它是完全托管的。