Получение ошибки «Disk Full» от Redshift Spectrum - PullRequest
0 голосов
/ 26 июня 2019

Я сталкиваюсь с проблемой частых Disk Full error на Redshift Spectrum, в результате мне приходится многократно увеличивать кластер. Похоже, что кеширование будет удалено.

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

Есть ли какой-нибудь документ, в котором говорится о кешировании Redshift Spectrum, или они используют тот же механизм для Redshift?

РЕДАКТИРОВАТЬ: По просьбе Джона Скотта, я обновляю свой вопрос

SELECT p.postcode,
         SUM(p.like_count),
         COUNT(l.id)
FROM post AS p
INNER JOIN likes AS l
    ON l.postcode = p.postcode
GROUP BY 1;

Общее количество сжатых данных на S3 составляет около 1,8 ТБ. Афина заняла 10 минут, отсканировала 700 ГБ и сказала мне Query exhausted resources at this scale factor

РЕДАКТИРОВАТЬ 2: Я использовал кластер SSD 16 ТБ.

1 Ответ

1 голос
/ 27 июня 2019

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

Проблема возникает из-за того, что Redshift Spectrum не может перенести выполнение полного объединения на слой Spectrum.Большая часть данных возвращается в кластер Redshift просто для выполнения объединения.

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

SELECT p.postcode
     , p.like_count
     , l.like_ids
FROM (--Summarize post data
      SELECT p.postcode
           , SUM(p.like_count)
      FROM post AS p 
      GROUP BY 1
     ) AS p
INNER JOIN (--Summarize likes data
            SELECT l.postcode
                 , COUNT(l.id) like_ids
            FROM likes AS l 
            GROUP BY 1
          ) AS l
    -- Join pre-summarized data only
    ON l.postcode = p.postcode
;
...