блог о bi, №1 в рунете

Настройка компонентов Kylin (Spark)

Apache Kylin

Не так давно наша компания начала осваивать новый стек технологий Apache. Спустя несколько успешных проектов мы хотим поделиться опытом разработки и некоторыми фичами.

После развёртывания docker-образа Apache Kylin от разработчиков (apachekylin/apache-kylin-standalone:4.0.0), при работе с аналитическими решениями, столкнулись с проблемой ограничений ресурсов, установленных в Kylin по умолчанию. В этой статье будут рассмотрены варианты изменения конфигурации Spark для кластера с одной нодой (узлом), технические характеристики которой 150 Гб ОЗУ, 981.46 Гб ПЗУ, 10 ядерный процессор с базовой тактовой частотой 2.40 Гц.


Для изменения конфигурации Spark необходимо после подключения к серверу перейти в командную строку контейнера Kylin, найти необходимый файл и отредактировать его посредством vi (команды приведены на рисунке 1). Всеми конфигурациями Spark можно управлять в файле kylin.properties с префиксом «kylin.engine.spark-conf». В статье рассмотрены параметры конфигурации, которые были изменены относительно стандартной.


Рисунок 1 – команды перехода в контейнер Kylin, поиска файла по имени

Для формирования конфигурации Spark было выполнено тестирование различных вариантов, и таким образом найдено оптимальное решение для конкретного рабочего сервера. Изменениям подлежат следующие параметры (листинг 1):


1) spark.driver.memory – объем памяти, используемый для процесса драйвера, где инициализируется SparkContext. Оптимально 4G.


2) spark.driver.memoryOverhead – объем некучной памяти, выделяемой каждому процессу драйвера в кластерном режиме. Это память, которая учитывает такие вещи, как накладные расходы виртуальной машины, интернированные строки, другие собственные накладные расходы и т. д. Она имеет тенденцию расти с размером контейнера (обычно 6-10%). Оптимально 2G.


3) spark.executor.memory – объем памяти, используемый каждым процессом-исполнителем. Оптимально 8G.


4) spark.executor.memoryOverhead – объем дополнительной памяти, выделяемой для каждого процесса-исполнителя. Это память, которая учитывает такие вещи, как накладные расходы виртуальной машины, интернированные строки, другие собственные накладные расходы и т. д. Оптимально 2G.


5) spark.executor.cores – количество виртуальных ядер для использования на каждом исполнителе. Оптимально 1.


6) spark.executor.instances – количество физических ядер для использования всеми исполнителями. Оптимально 8.


7) spark.hadoop.dfs.replication – коэффициент репликации в HDFS. Оптимально 1.


8) spark.sql.shuffle.partitions – количество разделов по умолчанию, используемое при перетасовке данных для соединений или агрегаций. Оптимально 16.


Листинг 1 – параметры конфигурации Spark

kylin.engine.spark-conf.spark.driver.memory=4G
kylin.engine.spark-conf.spark.driver.memoryOverhead=2G
kylin.engine.spark-conf.spark.executor.memory=8G
kylin.engine.spark-conf.spark.executor.memoryOverhead=2G
kylin.engine.spark-conf.spark.executor.cores=1
kylin.engine.spark-conf.spark.executor.instances=8
kylin.engine.spark-conf.spark.hadoop.dfs.replication=1
kylin.engine.spark-conf.spark.sql.shuffle.partitions=16

Важно понимать, что при конфигурации, соответствующей листингу 1, во время запуска сборки куба первым делом выделяется 4G (+2G) ОЗУ для драйвера, затем процесс делится на 16 подпроцессов, выполняемых восемью исполнителями, каждый из которых использует 8G (+2G) ОЗУ. Таким образом во время выполнения сборки куба задействовано не более 86G оперативной памяти сервера. Кроме того, само приложение spark занимает ещё 25G (рисунок 2). Доступные ресурсы кластера (сервера) указываются при конфигурации Hadoop (описано в предыдущей статье). В случае выхода необходимых ресурсов для запуска задания обработки куба за доступные ресурсы кластера Application manager отправляет задание в ожидание до того момента, как ресурсы в кластере освободятся.


Рисунок 2 – resource manager spark application

Sparder (spardercontext) – распределенный механизм запросов Kylin4, реализованный серверной частью приложения spark. Конфигурациями можно управлять в файле kylin.properties с префиксом «kylin.query.spark-conf» (листинг 2).


Листинг 2 – параметры конфигурации Sparder

kylin.query.spark-conf.spark.driver.memory=4G
kylin.query.spark-conf.spark.driver.memoryOverhead=2G
kylin.query.spark-conf.spark.executor.memory=16G
#kylin.query.spark-conf.spark.executor.instances=8
kylin.query.spark-conf.spark.executor.memoryOverhead=4G
kylin.query.spark-conf.spark.executor.cores=1
kylin.query.spark-conf.spark.sql.shuffle.partitions=16

Чтобы изменения вступили в силу, контейнер необходимо перезапустить (листинг 3) или в разделе System веб-интерфейса Kylin (рисунок 3) перезагрузить конфигурацию (Reload Config).


Листинг 3 – перезапуск контейнера

sudo docker restart kylin

Рисунок 3 – раздел System веб-интерфейса Kylin