Подтвердить что ты не робот

Резервное копирование AWS Dynamodb на S3

Было предложено Amazon docs http://aws.amazon.com/dynamodb/ среди других мест, что вы можете создавать резервные копии ваших таблиц dynamodb с помощью Elastic Map Reduce,
У меня есть общее представление о том, как это может работать, но я не мог найти никаких руководств или руководств по этому вопросу,

Итак, мой вопрос в том, как я могу автоматизировать резервное копирование dynamodb (используя EMR)?

До сих пор я думаю, что мне нужно создать "потоковое" задание с помощью функции карты, которая считывает данные из dynamodb и сокращения, которые записывают его на S3, и я считаю, что они могут быть написаны на Python (или java или несколько Другие языки).

Любые комментарии, пояснения, примеры кода, исправления оценены.

4b9b3361

Ответ 1

С введением AWS Data Pipeline с готовым шаблоном для резервного копирования dynamodb в S3 самый простой способ - запланировать резервное копирование в Data Pipeline [ ссылка],

Если у вас есть особые потребности (преобразование данных, очень тонкое управление зерном...), рассмотрим ответ @greg

Ответ 2

Есть несколько хороших руководств для работы с MapReduce и DynamoDB. Я последовал за этим один день и получил данные, экспортирующие на S3, без проблем безболезненно. Я считаю, что лучше всего создать улей script, который выполнит задачу резервного копирования, сохранит ее в ведро S3, а затем применит AWS API для вашего языка, чтобы прагматично развернуть новый поток заданий EMR, завершить резервное копирование. Вы можете установить это как задание cron.

Пример улья script экспорт данных из 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 script, который запустит новый поток заданий 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",
            )
        );

}

Ответ 3

С введением потоков DynamoDB и Lambda - вы должны иметь возможность делать резервные копии и инкрементные резервные копии данных DynamoDB.

Вы можете связать свой поток DynamoDB с помощью лямбда-функции, чтобы автоматически запускать код для каждого обновления данных (т.е.: данные в другое хранилище, например S3)

Лямбда-функция, которую вы можете использовать для связи с DynamoDb для инкрементных резервных копий:

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

Я представил подробное объяснение того, как вы можете использовать потоки DynamoDB Streams, Lambda и S3 для создания инкрементных резервных копий ваших данных в DynamoDb в моем блоге:

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

Edit:

По состоянию на декабрь 2017 года DynamoDB выпустил On Demand Backups/Restores. Это позволяет вам делать резервные копии и хранить их изначально в DynamoDB. Их можно восстановить в новую таблицу. Здесь представлен подробный проезд, в том числе код для их расписания:

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

НТН

Ответ 4

Вы можете использовать мой простой node.js script dynamo-archive.js, который сканирует всю таблицу Dynamo и сохраняет выходной файл в файл JSON. Затем вы загружаете его на S3 с помощью s3cmd.

Ответ 5

AWS Data Pipeline является дорогостоящим, и сложность управления шаблоном процессами не может сравниться с простотой команды CLI, которую вы можете вносить в расписание и выполнять по расписанию (используя cron, Teamcity или ваш инструмент CI выбора)

Amazon продвигает Data Pipeline, поскольку они получают прибыль от нее. Я бы сказал, что это действительно имеет смысл, если у вас очень большая база данных ( > 3 ГБ), так как улучшение производительности оправдает ее.

Для небольших и средних баз данных (1 ГБ или меньше) я бы рекомендовал использовать один из многих доступных инструментов, все три ниже могут обрабатывать процессы резервного копирования и восстановления из командной строки:

  • dynamo-backup-to-s3 == > Потоковое восстановление на S3, используя NodeJS/npm
  • SEEK-Jobs dynamotools == > Потоковое восстановление на S3, используя Golang
  • dynamodump == > Локальное резервное копирование/восстановление с использованием python, загрузка/загрузка S3 с помощью aws s3 cp

Помните, что из-за проблем с пропускной способностью/латентностью они всегда будут лучше работать с экземпляром EC2, чем ваша локальная сеть.

Ответ 6

Вы можете использовать этот удобный dynamodump инструмент, основанный на python (использует boto), чтобы выгрузить таблицы в файлы JSON. А затем загрузите на S3 с помощью s3cmd

Ответ 7

Я нашел функцию dynamodb-backup lambda, чтобы быть действительно полезной. Потребовалось 5 минут для настройки и может быть легко настроено на использование события Schedulewatch Schedule (не забудьте запустить npm install в начале, хотя).

Это также намного дешевле для меня, исходя из Data Pipeline (~ 40 долл. США в месяц). По моим оценкам, затраты составляют около 1,5 цента в месяц (оба без хранения S3). Обратите внимание, что он по умолчанию поддерживает все таблицы DynamoDB, которые можно легко настроить внутри кода.

Единственная недостающая часть должна быть уведомлена, если функция завершилась с ошибкой, которую мог выполнить Data Pipeline.

Ответ 9

Я создал несколько шаблонов, которые вы можете использовать для реализации решения AWS Pipeline.

Есть 4 шаблона, которые вы можете использовать для установки и импорта или экспорта данных.

Активировать конвейер импорта DynamoDB

S3 для импортера DynamoDB

Активировать экспортный конвейер DynamoDB

AWS DynamoDB для S3 экспортер