Смешно медленно пишет Amazon DynamoDB (PHP API)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

У меня был хороший успех, используя 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 может использовать несколько машин для распространения рабочей нагрузки и достижения высокой параллелизма.