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

Смешно медленно пишет 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 моих предметов, которые также находятся под 1Kb, но это не гарантируется (и не имеет значения, так как я понимаю, поскольку для 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 ( "Ожидаем:" особенно ") в API для ускорения запросов, но я не думаю, что это правильный способ, а также API был обновлен после этого совета был опубликован.

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

У меня был хороший успех, используя php sdk, используя пакетный метод класса AmazonDynamoDB. Я смог запустить около 50 экземпляров в секунду из экземпляра EC2. Метод работает путем очередности запросов до тех пор, пока вы не вызовете метод отправки, и в этот момент он выполняет несколько одновременных запросов с помощью Curl. Вот несколько хороших ссылок:

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

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

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