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

В этом документе слово «кластер» относится к набору инстансов Amazon EC2.

Встроенные возможности AWS

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

Динамическое масштабирование. Динамическое масштабирование — это альтернатива, предоставляемая AWS, которая управляет размером кластера в ответ на текущие изменения в использовании ресурсов. Можно установить отдельные пороговые значения как для масштабирования, так и для масштабирования, а кластерное и динамическое масштабирование обеспечивает повышение или понижение масштаба при нарушении соответствующих пороговых значений. [1]

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

Прогнозное масштабирование: прогнозируемое масштабирование, как обещает AWS, должно использовать данные об использовании ресурсов за последние 2 недели и прогноз на следующие 2 дня. Затем эти прогнозы можно использовать для упреждающего изменения размера кластеров, когда ожидается более высокая нагрузка, тем самым облегчая проблему, связанную с динамическим масштабированием. [1]

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

Прогнозирование Facebook Prophet

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

AWS через свой API CloudWatch предоставляет различные показатели, такие как средняя загрузка ЦП, максимальная загрузка ЦП, количество узлов, память, используемая в определенные промежутки времени. После оценки использование ЦП и количество узлов стали метриками, используемыми для этой задачи.

Использование Facebook Prophet:

Prophet — чрезвычайно простая в использовании и эффективная библиотека временных рядов с открытым исходным кодом Facebook. То, как работает Prophet, выходит за рамки этой записи в блоге, но те, кто заинтересован, могут прочитать об этом на https://peerj.com/preprints/3190.pdf.

Что касается использования API-интерфейса пророка, следует помнить о нескольких основных вещах. Пророк допускает 2 основные модели роста: линейную и логистическую модели роста (подробности о которых можно найти в статье).

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

Одна из особенностей заключается в том, что модель Prophet работает в python, данные обучения должны быть предоставлены в виде кадра данных pandas с двумя конкретными столбцами «ds» и «y», где «ds» представляет временную метку, а «y» представляет значение показателя, которое необходимо спрогнозировать.

Ниже приведен пример кода, который использовался для создания прогнозов.

from fbprophet import Prophet
# Define parameters of model
prophet = ( Prophet(growth = ‘logistic’)
 .add_seasonality(name=’daily’, period= 1, fourier_order= specified_fourier_order_daily)
 .add_seasonality(name=’weekly’, period=7, fourier_order=specified_fourier_order_daily)
 )
# Fit prophet model on training data 
prophet.fit(df)
# Prepare future Dataframe for the time period to forecast, to store the forecasted values 
future_df = prophet.make_future_dataframe(freq='min', periods = time_period_to_forecast)
# Forecast the values for the specified time frame
 
forecast_df = prophet.predict(future_df)

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

После того, как модель обучена, можно также построить график, чтобы увидеть тенденции и сезонность в модели, используя функциональность plot_component Prophet.

fig2 = prophet.plot_components(forecast_df)
display(fig2)

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

Можно также увидеть, насколько хорошо или плохо подходит модель пророка, построив прогнозный фрейм данных.

# Code to plot prophet forecast
 
prophet.plot(forecasted_df)

Он генерирует график, как показано на изображении ниже.

Если вы видите на изображении выше, черные точки присутствуют до 2016 года, а после этого оно представляет прогнозируемое значение. Черные точки представляют реальные значения. Область синего цвета представляет прогнозируемые/прогнозируемые значения, а верхняя и нижняя области светло-голубого оттенка представляют собой верхний предел и нижний предел соответственно.

Проактивное масштабирование размера кластера AWS

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

На отдельном инстансе EC2 или с помощью лямбда-функции можно установить другой скрипт, который извлекает метрики кластера в режиме реального времени. AWS предоставляет API для сбора различных показателей, например желаемой емкости (экземпляров), текущей емкости (экземпляров) и т. д.

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

Ссылки

  1. https://docs.aws.amazon.com/autoscaling/plans/userguide/how-it-works.html
  2. https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_Operations_List.html
  3. https://peerj.com/preprints/3190.pdf