Загрузка ЦП экземпляра RDS превышает 90% при выборе запроса с фильтром столбцов индекса

#mysql #apache-spark #jdbc #pyspark #amazon-rds

Вопрос:

Я выполняю запрос на извлечение данных, подключаясь к экземпляру MySQL RDS Aurora (размером r5.2xlarge), который запускает внутренний движок InnoDB. Объем данных составляет более 600 миллионов записей. Запрос извлекает несколько столбцов из таблицы и выполняется через PySpark в EMR. Я добавляю информацию о разделе в вызов чтения JDBC, чтобы распараллелить чтение. Столбец раздела-это автоматически добавляемый числовой столбец, который был проиндексирован для более быстрого извлечения записей. В результате предложения WHERE генерируются механизмом Spark динамически на основе значений столбца раздела. Вот запрос:

 SELECT <subset-of-columns>
FROM <db>.<table>
WHERE <index-column> BETWEEN <lower-bound> AND <max-value-of-the-partition>;
 

Я указываю количество разделов как 60. Следовательно, 60 таких запросов, каждый с разными значениями предложения WHERE, выполняются. Несколько месяцев назад все шло нормально, но не сейчас. Загрузка ЦП превышает 90%, и Spark может выполнять не более 50 задач (что равно 50 разделам) при максимальной нагрузке. Я не могу понять, что вызывает эту проблему сейчас.

Комментарии:

1. Незначительное предложение: Возможно, вы захотите избежать использования слова «крор» (а также «лакх»), так как некоторые читатели могут быть не знакомы с этими единицами измерения.

2. Каково время, когда всего 30 разделов? При запуске такого количества потоков возникают накладные расходы, а также накладные расходы на сбор результатов. В каком-то масштабе вы попадаете в «убывающую отдачу» и, возможно, в ухудшение производительности после некоторого предела.

3. Когда несколько месяцев назад я попытался использовать 30 или 20 разделов, исполнители потеряли 4-5 часов при выполнении задания Spark. Поэтому я увеличил его до 60, и это сработало. Не знаю, почему это сейчас не работает. Я ничего особо не изменил.