MongoDB - ›Миграция DynamoDB

Все,

Я пытаюсь перенести примерно 6 ГБ данных Mongo, состоящих из сотен коллекций, в DynamoDB. Я написал несколько скриптов с использованием AWS PHP SDK и могу переносить очень маленькие коллекции, но когда я пробую те, которые содержат более 20 тысяч документов (все еще очень маленькая коллекция, учитывая все обстоятельства), это либо занимает невероятное количество времени, либо тихо. терпит неудачу.

Есть ли у кого-нибудь советы / рекомендации по извлечению данных из Mongo (или любой другой базы данных NoSQL) и их миграции в Dynamo или любую другую базу данных NoSQL. Я считаю, что это должно быть относительно легко, потому что документы очень плоские / простые.

Будем очень признательны за любые мысли / предложения!

Спасибо!

header.php

<?

require './aws-autoloader.php';
require './MongoGet.php';

set_time_limit(0);

use \Aws\DynamoDb\DynamoDbClient;

$client = \Aws\DynamoDb\DynamoDbClient::factory(array(
    'key' => 'MY_KEY',
    'secret' => 'MY_SECRET',
    'region' => 'MY_REGION',
    'base_url' => 'http://localhost:8000'
));

$collection = "AccumulatorGasPressure4093_raw";

function nEcho($str) {
    echo "{$str}<br>\n";
}

echo "<pre>";

test-store.php

<?

include('test-header.php');

nEcho("Creating table(s)...");

// create test table

$client->createTable(array(
'TableName' => $collection,
'AttributeDefinitions' => array(
        array(
            'AttributeName' => 'id',
            'AttributeType' => 'N'
        ),
        array(
            'AttributeName' => 'count',
            'AttributeType' => 'N'
        )
    ),
    'KeySchema' => array(
        array(
            'AttributeName' => 'id',
            'KeyType'       => 'HASH'            
        ),
        array(
            'AttributeName' => 'count',
            'KeyType'       => 'RANGED'
        )
    ),
    'ProvisionedThroughput' => array(
        'ReadCapacityUnits'  => 10,
        'WriteCapacityUnits' => 20
    )
));

$result = $client->describeTable(array(
    'TableName' => $collection
));

nEcho("Done creating table...");

nEcho("Getting data from Mongo...");

// instantiate class and get data
$mGet = new MongoGet();
$results = $mGet->getData($collection);

nEcho ("Done retrieving Mongo data...");

nEcho ("Inserting data...");

$i = 0;
foreach($results as $result) {
    $insertResult = $client->putItem(array(
        'TableName' => $collection,
        'Item' => $client->formatAttributes(array(
            'id'    => $i,
            'date'  => $result['date'],
            'value' => $result['value'],
            'count' => $i
            )),
        'ReturnConsumedCapacity' => 'TOTAL'
    ));

    $i++;
}

nEcho("Done Inserting, script ending...");

person Nicholas Kreidberg    schedule 25.09.2014    source источник


Ответы (1)


Я подозреваю, что DynamoDB ограничивает вас, особенно если пропускная способность ваших таблиц низкая. SDK повторяет запросы до 11 раз на запрос, но в конечном итоге запросы не выполняются, что должно вызывать исключение.

Вам следует взглянуть на Объект WriteRequestBatch. Этот объект в основном представляет собой очередь элементов, которые отправляются партиями, но любые элементы, которые не могут быть отправлены, автоматически повторно ставятся в очередь. Должен предоставить более надежное решение для того, что вы делаете.

person Jeremy Lindblom    schedule 25.09.2014
comment
Если таблицы регулируются, это действительно легко проверить. Посмотрите на графики монитора, которые показывают количество регулируемых запросов и объем потребляемой пропускной способности. - person kurtzbot; 02.10.2014