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

Amazon redshift: объемная вставка против COPYing из s3

У меня есть кластер красных смещений, который я использую для некоторых аналитических приложений. У меня есть входящие данные, которые я хотел бы добавить в таблицу clicks. Допустим, у меня есть ~ 10 новых "кликов", которые я хочу хранить каждую секунду. Если возможно, я бы хотел, чтобы мои данные были доступны как можно скорее в режиме красного смещения.

Из того, что я понимаю, из-за столбчатого хранилища производительность вставки плохая, поэтому вставлять ее нужно партиями. Мой рабочий процесс заключается в том, чтобы хранить клики в Redis, и каждую минуту я вставляю ~ 600 кликов из Redis в красное смещение в виде пакета.

У меня есть два способа вставить партию кликов в красное смещение:

Я провел несколько тестов (это было сделано для таблицы clicks с уже 2 миллионами строк):

             | multi-row insert stragegy |       S3 Copy strategy    |
             |---------------------------+---------------------------+
             |       insert query        | upload to s3 | COPY query |
-------------+---------------------------+--------------+------------+
1 record     |           0.25s           |     0.20s    |   0.50s    |
1k records   |           0.30s           |     0.20s    |   0.50s    |
10k records  |           1.90s           |     1.29s    |   0.70s    |
100k records |           9.10s           |     7.70s    |   1.50s    |

Как вы можете видеть, с точки зрения производительности, похоже, я ничего не получаю, сначала скопировав данные в s3. Время upload + copy равно времени insert.

Вопросы:

Каковы преимущества и недостатки каждого подхода? Какова лучшая практика? Я что-то пропустил?

И дополнительный вопрос: возможно ли для красного смещения COPY данные из s3 автоматически через манифест? Я имею в виду КОПИРОВАНИЕ данных, как только новые файлы .csv добавляются в s3? Док здесь и здесь. Или я должен сам создать фонового работника для запуска команд COPY?

Мой быстрый анализ:

В документации о согласованности нет упоминания о загрузке данных через многорядные вставки. Похоже, что предпочтительным способом является COPY с s3 с уникальными объектными ключами (каждый .csv на s3 имеет свое уникальное имя)...

  • S3 Copy strategy:
    • ПРОФИ: похоже на хорошую практику из документов.
    • CONS: больше работы (мне нужно управлять ведрами и манифестами и cron, который запускает команды COPY...)
  • Multi-row insert strategy
    • ПРОФИ: Меньше работы. Я могу вызвать запрос insert из моего кода приложения
    • Минусы: не похоже на стандартный способ импорта данных. Я что-то пропустил?
4b9b3361

Ответ 1

Redshift - это аналитическая БД, и она оптимизирована, чтобы вы могли запрашивать миллионы и миллиарды записей. Он также оптимизирован для быстрого доступа к этим записям в Redshift с помощью команды COPY.

Конструкция команды COPY предназначена для параллельной загрузки нескольких файлов в несколько узлов кластера. Например, если у вас есть 5 небольших кластеров node (dw2.xl), вы можете копировать данные в 10 раз быстрее, если у вас есть несколько файлов (например, 20). Существует баланс между количеством файлов и количеством записей в каждом файле, так как каждый файл имеет небольшие накладные расходы.

Это должно привести к балансу между частотой COPY, например, каждые 5 или 15 минут, а не каждые 30 секунд, а также размером и количеством файлов событий.

Еще один момент для рассмотрения - 2 типа узлов Redshift, которые у вас есть: SSD (dw2.xl и dw2.8xl) и магнитные (dx1.xl и dw1.8xl). SSD быстрее с точки зрения проглатывания. Поскольку вы ищете очень свежие данные, вы, вероятно, предпочитаете работать с SSD-устройствами, которые, как правило, дешевле для менее 500 ГБ сжатых данных. Если со временем у вас будет более 500 ГБ сжатых данных, вы можете рассмотреть возможность запуска двух разных кластеров, один для "горячих" данных на SSD с данными прошлой недели или месяца, а другой для "холодных" данных на магнитных дисках со всеми ваши исторические данные.

Наконец, вам действительно не нужно загружать данные в S3, что является основной частью вашего времени приема пищи. Вы можете скопировать данные непосредственно с ваших серверов с помощью опции SSH COPY. Подробнее об этом здесь: http://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-remote-hosts.html

Если вы можете разделить очереди Redis на несколько серверов или, по крайней мере, несколько очередей с разными файлами журналов, вы, вероятно, получите очень хорошую скорость чтения в секунду.

Другим шаблоном, который вы, возможно, захотите рассмотреть, чтобы разрешить почти аналитику в реальном времени, является использование Amazon Kinesis, потоковой службы. Он позволяет запускать аналитику данных в задержке секунд и в то же время подготавливать данные для копирования в Redshift более оптимизированным способом.

Ответ 2

S3 копия работает быстрее в случае больших нагрузок данных. когда вы скажете, что тысячи миллионов записей нужно загрузить в redshift, тогда s3 upload + copy будет работать быстрее, чем вставлять запросы.

Копия S3 работает в параллельном режиме.

Когда вы создаете таблицу и вставляете ее, существует ограничение на размер партии. Максимальный размер для одного SQL - 16 МБ. Поэтому вам нужно позаботиться о размере пакета SQL (зависит от размера каждого запроса на вставку)

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

Но если вы используете команду insert для начала, вы заметите, что не было применено сжатие, что в некоторых случаях приведет к большему количеству места для таблицы в красном смещении и медленном времени обработки запросов.

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

Ответ 3

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

http://blogs.aws.amazon.com/bigdata/post/Tx2ANLN1PGELDJU/Best-Practices-for-Micro-Batch-Loading-on-Amazon-Redshift

Ответ 4

Результаты моего теста немного отличаются. Я загружал файл CSV в Redshift с рабочего стола ОС Windows.

  • Строка вставки была самой медленной.
  • Многорядная вставка была в 5 раз быстрее, чем вставка строк.
  • S3 + COPY была в 3 раза быстрее, чем многорядная вставка.

Что поспособствовало ускорению объемной вставки S3 + COPY.

  • Тот факт, что вам не нужно анализировать оператор вставки из строки CSV.
  • Поток был сжат перед многочастной загрузкой на S3.
  • Команда COPY была чрезвычайно быстрой.

Я собрал все свои выводы в один скрипт Python CSV_Loader_For_Redshift

Ответ 5

Как вы можете видеть в результатах загрузки в RedShift indipendent review, команда COPY - это, безусловно, путь.