3 совета по ускорению Apache Spark

В прошлой статье мы говорили об устройстве оптимизатора Apache Spark. Теперь мы знаем, как сложный и продуманный механизм оптимизации Spark обеспечивает быстрый и эффективный анализ данных. Но не стоит думать, что фреймворк всегда даст вам желаемые результаты с высокой скоростью. SparkSQL творит чудес сам по себе, но с помощью некоторых приемов вы можете вывести его на новый уровень. В этой статье мы дадим вам три совета по для достижения еще более высоких результатов в рамках обработки больших данных (Big Data).

Заглядывайте под капот

Первое, что следует помнить при работе со Spark, — это то, что время выполнения само по себе не имеет большого значения. Чтобы оценить эффективность работы, важно знать, что происходит под капотом во время выполнения вычислений. На этапах разработки и тестирования применяйте функцию explain, чтобы увидеть физический план, а для более глубокого анализа вы можете добавить extend для просмотра распарсенного, проанализированного и оптимизированного логического плана. Это отличный способ обнаружить потенциальные проблемы и ненужные этапы, даже не выполняя задание. Ниже показан пример в Spark для вывода физического плана.

EXPLAIN select k, sum(v) from values (1, 2), (1, 3) t(k, v) group by k;
+----------------------------------------------------+
|                                                plan|
+----------------------------------------------------+
| == Physical Plan ==
 *(2) HashAggregate(keys=[k#33], functions=[sum(cast(v#34 as bigint))])
 +- Exchange hashpartitioning(k#33, 200), true, [id=#59]
    +- *(1) HashAggregate(keys=[k#33], functions=[partial_sum(cast(v#34 as bigint))])
       +- *(1) LocalTableScan [k#33, v#34]
|
+----------------------------------------------------

Как можем заметить, на физическом плане нет каких-либо лишних действий.

Кэшируем правильно

Кэширование очень важно при работе с большими наборами данных и сложными вычислениями. Кэширование позволяет сохранять наборы данных, которые вы планируете использовать на последующих этапах, чтобы Spark не создавал их снова с нуля. Это преимущество иногда подталкивает разработчиков и Data Scientist’ов к чрезмерному кэшированию, в результате чего такие наборы данных становятся излишними, и скорость вычислений замедляется. Чтобы решить, какие данные нужно кэшировать, следует подготовить все свои преобразования, а затем в ходе тестирования попытаться выяснить, какие наборы данных действительно стоит кэшировать, и в какой момент вы могли бы распаковать их, чтобы освободить место, которое они занимают в памяти. Эффективное использование кеша позволяет Spark выполнять определенные вычисления в десятки раз быстрее, что может значительно сократить общее время выполнения вашего задания (о кэшировании тут).
Создание кэшированных данных в Spark выполняется либо через функцию cache, либо через функцию persist. Различие состоит в том, что функция cache кэширует в памяти, а persist кэширует как в памяти, так и на диске. Например, вот так выглядит код для кэширования в Spark данных, представленных в виде DataFrame:

df.cache()

Настраивайте свой кластер и изучите данные

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

Вы можете узнать в документации о вариантах настройки Apache Spark. Например, по умолчанию Spark сериализует данные с помощью библиотек Java. Но вы можете попробовать на своей машине использовать Kyro, который сериализует в 8 раз быстрее, но не поддерживает некоторые форматы:

sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")

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

 

Еще больше подробностей о принципах работы Spark, его ускорении для более эффективной обработки данных вы узнаете на специализированном курсе по машинному обучению «Анализ данных с Apache Spark» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Записаться на курс

Смотреть раcписание

Добавить комментарий

Поиск по сайту