Все,
Я пытаюсь перенести в DynamoDB примерно 6 ГБ данных Mongo, состоящих из сотен коллекций. Я написал несколько сценариев с использованием 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>";
Тест-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...");
Я подозреваю, что DynamoDB подавляет вас, особенно если пропускная способность ваших таблиц низкая. SDK повторяет запросы, до 11 раз на запрос, но в конечном итоге запросы не выполняются, что должно вызвать исключение.
Вы должны взглянуть на WriteRequestBatch объект. Этот объект в основном представляет собой очередь элементов, которые отправляются партиями, но любые элементы, которые не могут быть переданы, автоматически помещаются в очередь. Должны предоставить более надежное решение для того, что вы делаете.
Других решений пока нет …