Как справиться с медленно меняющимся измерением в Amazon Redshift с помощью Pentaho?

Поскольку Amazon Redshift оптимизирован для чтения, а не для записи, как я могу управлять процедурой медленно меняющегося измерения с помощью инструмента ETL, в моем случае Pentaho Data Integration?

Поскольку инструмент ETL будет выполнять обновления/вставки (поиск/обновление измерений) построчно, производительность будет крайне низкой.

Кто-нибудь уже прошел через эту проблему?


person Lucas Rezende    schedule 18.05.2016    source источник
comment
Какой процент ваших строк измерений будет фактически изменен/вставлен? Если процент небольшой (‹ 20% или около того), шаг Dimension Lookup/Update, вероятно, подойдет.   -  person Brian.D.Myers    schedule 19.05.2016
comment
Я столкнулся с тем же сомнением. Возможно, будет быстрее, если PDI поддерживает таблицы измерений в локальном экземпляре MySQL, а затем каждый раз выполняет усечение и полную загрузку в Redshift. Как ты это сделал?   -  person GGGforce    schedule 09.08.2016


Ответы (1)


Обновления в Redshift медленные, потому что обновление — это последовательность операций, выполняемых в транзакции:

  1. Выберите строки для обновления во временную таблицу
  2. Удалить эти строки
  3. Обновите эти строки во временной таблице в соответствии с условием обновления.
  4. Добавить обновленные строки в исходную таблицу

И все это должно быть скоординировано между узлами.

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

Есть 3 способа сделать это быстрее (все из опыта):

  1. Избегайте обновлений.

    Если у вас есть условие, позволяющее отличить новые строки от старых, просто добавьте новые в таблицу и измените свои запросы с этим условием. Вы будете удивлены, увидев, что Redshift работает быстрее — хотя каждый запрос может стать немного сложнее, поскольку нет обновлений, которые перегружают систему, эти запросы могут выполняться быстрее (убедитесь, что ключи dist указаны правильно).

    Например, условие максимальной временной метки для бизнес-ключа выполняется очень быстро (особенно если бизнес-ключ является удаленным ключом — все это будет выполняться параллельно).

    Это предпочтительное решение.

  2. Выполняйте обновления пакетно.

    Если ваше обновление применимо к ряду строк, обновите их все сразу с условием where. Партии по 1000 штук работают хорошо, хотя ваш пробег может отличаться.

  3. Создайте таблицу, в которой вы храните «новые» строки, а затем выполните обновление с помощью объединения после того, как эта таблица будет иметь размер не менее 1000 строк.

person denismo    schedule 23.05.2016