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

15

Этот вопрос уже размещен на форумах 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 был обновлен с момента публикации этого совета .

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

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

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

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

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

Ваш Ответ

3   ответа
10

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

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

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

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

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

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

0

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

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

Похожие вопросы