Смешно медленная запись в Amazon DynamoDB (PHP API)

Этот вопрос уже размещен на форумах AWS, но остается без ответаhttps: //forums.aws.amazon.com/thread.jspa ThreadId = 94589

Я пытаюсь выполнить первоначальную загрузку длинного списка коротких элементов (около 120 миллионов из них), чтобы потом извлечь их по уникальному ключу, и это кажется идеальным случаем для DynamoDb.

Однако моя текущая скорость записи очень низкая (примерно 8-9 секунд на 100 записей), что делает первоначальную загрузку практически невозможной (при текущей скорости это займет около 3 месяцев).

Я прочитал форумы AWS в поисках ответа и уже попробовал следующее:

Я переключился с одиночных вызовов «put_item» на пакетную запись из 25 элементов (рекомендуемый максимальный размер пакетной записи), и каждый из моих элементов меньше 1 КБ (что также рекомендуется). Даже для 25 моих элементов очень характерно, что их размер не превышает 1 КБ, но это не гарантируется (и в любом случае это не имеет значения, поскольку я понимаю, что для DynamoDB важен только один размер элемента).

Я использую недавно введенный регион ЕС (я нахожусь в Великобритании), определяя его точку входа напрямую, вызывая set_region ('dynamodb.eu-west-1.amazonaws.com'), так как, очевидно, нет другого способа сделать это в PHP API. Консоль AWS показывает, что таблица в правильном регионе, так что работает.

Я отключил SSL, вызвав disable_ssl () (получая 1 секунду на 100 записей).

Тем не менее, тестовый набор из 100 элементов (4 вызова пакетной записи для 25 элементов) никогда не занимает менее 8 секунд для индексации. Каждый запрос на пакетную запись занимает около 2 секунд, поэтому первый запрос не является мгновенным, а последующие запросы - медленными.

Моя пропускная способность для таблицы равна 100 единицам записи и 100 единицам чтения, чего должно быть достаточно (пробовали и более высокие пределы на всякий случай, безрезультатно).

Я также знаю, что существуют некоторые расходы на сериализацию запросов, поэтому я, вероятно, могу использовать очередь для «накопления» своих запросов, но действительно ли это так важно для batch_writes? И я не думаю, что это проблема, потому что даже один запрос занимает слишком много времени.

Я обнаружил, что некоторые люди изменяют заголовки cURL (в частности, «Expect:») в API, чтобы ускорить запросы, но я не думаю, что это правильный путь, а также API был обновлен с момента публикации этого совета .

Сервер, на котором запущено мое приложение, тоже в порядке - я читал, что иногда загрузка процессора падает, но в моем случае все в порядке, просто сетевой запрос занимает слишком много времени.

Я застрял сейчас - что еще можно попробовать? Пожалуйста, не стесняйтесь спрашивать дополнительную информацию, если я не предоставил достаточно.

Есть и другие недавние темы, по-видимому, с той же проблемой,Во (пока ответа нет).

Предполагается, что этот сервис будет очень быстрым, поэтому я действительно озадачен этой проблемой в самом начале.

 Yuriy21 мая 2012 г., 13:29
Мне здесь не нужна реляционная БД (это плоский индекс без реальных отношений), но да, я думаю вернуться к mySQL или Solr, если у меня нет других вариантов. Пока что я все еще хочу понять, что не так с этим подходом.
 ta.speot.is21 мая 2012 г., 13:23
Звучит так, будто вам нужна реляционная база данных, такая как SQL Server. Только чтоSqlBulkCopy данные в. SQL Server масштабируется, если вы спрашиваете.
 Yuriy18 июл. 2012 г., 20:38
Спасибо, попробую еще раз, если необходимость возникнет снова.
 Jeremy Lindblom18 июл. 2012 г., 17:48
Ваше сообщение на форуме получило ответ: Forums.aws.amazon.com / thread.jspa? MESSAGEID = 365597 # 365597

Ответы на вопрос(3)

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

скорость будет зависеть от всех видов трафика / брандмауэра и т. Д. Между вами и серверами. Если я звоню в DynamoDB, то каждый запрос занимает 0,3 секунды просто из-за времени, которое нужно проехать в / из Австралии.

Моим предложением было бы создать себе экземпляр EC2 (сервер) с PHP, загрузить скрипт и все файлы на сервер EC2 в виде блока, а затем выполнить дамп оттуда. Сервер EC2 должен иметь высокую скорость работы с сервером DynamoDB.

Если вы не уверены в том, чтобы самостоятельно настроить EC2 с LAMP, то у них есть новый сервис "Elastic Beanstalk", который может сделать все для вас. Когда вы завершите загрузку, просто запишите сервер - и, надеюсь, вы сможете сделать все это в рамках их структуры цен «бесплатного уровня»:)

Не решает долгосрочные проблемы с подключением, но сократит загрузку за три месяца!

 Robbie21 мая 2012 г., 13:41
2 секунды невероятно медленны, но это может быть простой брандмауэр на сервере, выполняющий некоторые «проверки», или брандмауэр на маршрутизаторе, выполняющий другие «проверки». (Или, будучи циничным, способ для Amzon подтолкнуть вас к EC2, возможно ?!) Как я уже сказал - это не долгосрочное решение, просто что-то, чтобы выполнить загрузку. Если вы хотите сохранить его локально, почему бы не посмотреть на Кассандру или Монго? Но если вы используете Amazon и платите, просто перенесите сервер туда - он будет счастлив:)
 Yuriy21 мая 2012 г., 13:46
Я пробовал два разных сервера с разными хостерами:
 Yuriy21 мая 2012 г., 13:23
Спасибо за Ваш ответ. Я не пробовал Beanstalk, но вместо этого пытался использовать Elastic MapReduce - здесь все еще есть проблема, для которой я создал еще один вопрос: / Stackoverflow.com вопросы / 10683136 / ...
 Yuriy21 мая 2012 г., 13:25
Как вы упомянули даже из Австралии, для вас это все равно менее 0,5 секунды, поэтому для меня не может быть 2 секунды от Лондона до Ирландии. Наша связь очень хорошая, пока я исключаю это.

tch в классе AmazonDynamoDB. Мне удалось запустить около 50 элементов в секунду из экземпляра EC2. Метод работает путем постановки в очередь запросов до тех пор, пока вы не вызовете метод send, после чего он выполняет несколько одновременных запросов с использованием Curl. Вот несколько хороших ссылок:

http: //docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LoadData_PHP.htm

http: //docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPItemOperationsExample.htm

Я думаю, что вы также можете использовать HIVE sql, используя Elastic Map Reduce для массовой загрузки данных из файла CSV. EMR может использовать несколько машин для распределения рабочей нагрузки и достижения высокого уровня параллелизма.

 Yuriy02 июл. 2012 г., 17:28
Спасибо, Джонатан, но я переписал функциональность для использования локального индекса. Что касается HIVE, в нем также есть проблема, когда дело доходит до DynamoDB, что было подтверждено Amazon (см. Мой другой вопрос и мой собственный ответ): / Stackoverflow.com вопросы / 10683136 / ...

Ваш ответ на вопрос