web-dev-qa-db-fra.com

Sauvegarde d'AWS Dynamodb vers S3

Il a été suggéré sur Amazon docshttp://aws.Amazon.com/dynamodb/ entre autres, que vous pouvez sauvegarder vos tables dynamodb en utilisant Elastic Map Reduce,
J'ai une compréhension générale de la façon dont cela pourrait fonctionner mais je n'ai trouvé aucun guide ou tutoriel à ce sujet,

Ma question est donc de savoir comment automatiser les sauvegardes dynamodb (à l'aide d'EMR)?

Jusqu'à présent, je pense que je dois créer un travail de "streaming" avec une fonction de carte qui lit les données de dynamodb et une réduction qui les écrit dans S3 et je crois que cela pourrait être écrit en Python (ou Java ou quelques autres langues).

Tous les commentaires, clarifications, échantillons de code, corrections sont appréciés.

29
Ali

Avec l'introduction d'AWS Data Pipeline, avec un modèle prêt à l'emploi pour dynamodb vers la sauvegarde S3, le moyen le plus simple est de planifier une sauvegarde dans le Data Pipeline [link] ,

Au cas où vous auriez des besoins particuliers (transformation de données, contrôle très fin des grains ...) réfléchissez à la réponse de @greg

33
Ali

Il existe de bons guides pour travailler avec MapReduce et DynamoDB. J'ai suivi ceci l'un l'autre jour et j'ai réussi à exporter les données vers S3 sans douleur. Je pense que votre meilleur pari serait de créer un script Hive qui exécute la tâche de sauvegarde, de l'enregistrer dans un compartiment S3, puis d'utiliser l'API AWS pour votre langue pour lancer de manière pragmatique un nouveau flux de travail EMR, terminer la sauvegarde. Vous pouvez définir cela comme un travail cron.

Exemple de script Hive exportant des données de Dynamo vers 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;

Voici un exemple de script PHP qui fera tourner un nouveau flux de travail 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",
            )
        );

}
14
greg

Avec l'introduction de DynamoDB Streams et Lambda - vous devriez pouvoir effectuer des sauvegardes et des sauvegardes incrémentielles de vos données DynamoDB.

Vous pouvez associer votre DynamoDB Stream à une fonction Lambda pour déclencher automatiquement le code pour chaque mise à jour de données (c'est-à-dire: les données vers un autre magasin comme S3)

Une fonction lambda que vous pouvez utiliser pour vous associer à DynamoDb pour les sauvegardes incrémentielles:

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

J'ai fourni une explication détaillée de la façon dont vous pouvez utiliser DynamoDB Streams, Lambda et des compartiments version S3 pour créer des sauvegardes incrémentielles pour vos données dans DynamoDb sur mon blog:

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

Éditer:

Depuis décembre 2017, DynamoDB a publié des sauvegardes/restaurations à la demande. Cela vous permet de prendre des sauvegardes et de les stocker en mode natif dans DynamoDB. Ils peuvent être restaurés dans une nouvelle table. Une marche à suivre détaillée est fournie ici, y compris le code pour les planifier:

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

HTH

10
Abhaya Chauhan

AWS Data Pipeline est coûteux et la complexité de la gestion d'un processus basé sur des modèles ne peut être comparée à la simplicité d'une commande CLI à laquelle vous pouvez apporter des modifications et l'exécuter selon un calendrier (en utilisant cron, Teamcity ou l'outil CI de votre choix)

Amazon fait la promotion de Data Pipeline car ils en tirent un profit. Je dirais que cela n'a de sens que si vous avez une très grande base de données (> 3 Go), car l'amélioration des performances le justifiera.

Pour les petites et moyennes bases de données (1 Go ou moins), je vous recommande d'utiliser l'un des nombreux outils disponibles, les trois ci-dessous peuvent gérer les processus de sauvegarde et de restauration à partir de la ligne de commande:

Gardez à l'esprit qu'en raison de problèmes de bande passante/latence, ceux-ci fonctionneront toujours mieux à partir d'une instance EC2 que de votre réseau local.

6
Steven de Salas

Vous pouvez utiliser mon simple script node.js dynamo-archive.js , qui analyse une table Dynamo entière et enregistre la sortie dans un fichier JSON. Ensuite, vous le téléchargez sur S3 en utilisant s3cmd.

5
yegor256

Vous pouvez utiliser cet outil dynamodump pratique qui est basé sur python (utilise boto ) pour vider les tables dans des fichiers JSON. S3 avec s3cmd

3
250R

le pipeline de données aws a des régions limites.

Il m'a fallu 2 heures pour déboguer le modèle.

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

2
xichen

J'ai trouvé la fonction dynamodb-backup lambda très utile. Il m'a fallu 5 minutes pour l'installation et peut facilement être configuré pour utiliser un événement Cloudwatch Schedule (n'oubliez pas d'exécuter npm install au début).

C'est aussi beaucoup moins cher pour moi venant de Data Pipeline (~ 40 $ par mois), j'évalue les coûts à environ 1,5 centimes par mois (les deux sans stockage S3). Notez qu'il sauvegarde toutes les tables DynamoDB à la fois par défaut, ce qui peut facilement être ajusté dans le code.

La seule partie manquante doit être notifiée si la fonction échoue, ce que le pipeline de données a pu faire.

1
Ben Romberg