Привет, Хабр! Меня зовут Станислав Габдулгазиев, и я архитектор департамента поддержки продаж Arenadata. В этом материале поделюсь впечатлениями от использования Kyuubi — инструмента, который значительно упрощает работу пользователей с SQL, а также затрону вопросы его сравнения с другими решениями для обработки больших данных.
Небольшая справка
Kyuubi — распределённый многопользовательский шлюз для предоставления serverless SQL для хранилищ, озёр данных и lakehouse.
Kyuubi — это сервис, предоставляющий механизмы для распределённого выполнения SQL-запросов поверх различных вычислительных движков, таких как Apache Spark, Hive, Flink и Impala. Он часть дистрибутива Arenadata Hadoop (ADH), который включает эти движки для обработки и анализа данных.
Проблемы Spark SQL
Использование Spark SQL в крупных корпоративных средах встречается всё чаще, однако встаёт несколько технических и эксплуатационных проблем, которые ограничивают его производительность и удобство для конечных пользователей.
Первое: если вы решили использовать JDBC-клиент, например DBeaver или что-то похожее, то, пожалуй, единственное существующее сейчас решение «из коробки», — это Spark Thrift Server (далее STS), у которого есть ряд архитектурных ограничений. Рассмотрим их более детально.
Архитектурные ограничения STS и преимущества Kyuubi
Плохая изоляция ресурсов
В STS отсутствует гибкая изоляция ресурсов для задач, что делает систему уязвимой к избыточному использованию ресурсов отдельным пользователем. Высокая нагрузка от одного участника может негативно повлиять на производительность остальных, поскольку процессы будут конкурировать за ограниченные ресурсы кластера Spark.
Как следствие, плохая изоляция ведёт к нестабильной работе и снижению производительности при выполнении сложных аналитических запросов в многопользовательской среде.
Ограниченная информационная безопасность
В STS отсутствуют механизмы полноценного разграничения прав доступа к данным. Все пользователи, работающие с кластером Spark через STS, подключаются от имени прокси-пользователя, под которым выполняется запуск. В корпоративной среде с повышенными требованиями к защите информации это создает серьёзные ограничения для применения Spark SQL, особенно при необходимости строгого соблюдения политик безопасности.
В отличие от Hive, Impala и других решений, для которых есть плагин Ranger SQL-on-Hadoop, Spark Thrift Service ограничен в управлении доступом на уровне строк и столбцов данных. Реализация сложных политик безопасности требует дополнительных решений или перехода на Kyuubi.
Отсутствие высокой доступности
STS не поддерживает встроенную высокую доступность (high availability). В случае выхода из строя одного из компонентов, например сервиса или узла, восстановление может занять длительное время, что негативно отражается на производительности системы и стабильности для пользователей.
В Kyuubi эти вопросы решаются на уровне архитектуры, обеспечивая высокую доступность за счёт масштабируемости и гибкой настройки компонентов кластера.
Нестабильная работа STS
STS не всегда обеспечивает стабильную работу при выполнении интенсивных запросов и имеет тенденцию к снижению производительности под нагрузкой. Часто возникают задержки, зависания и другие проблемы, особенно при работе с интерактивными запросами.
Kyuubi улучшает стабильность и оптимизирует работу Spark SQL, обеспечивая более предсказуемую производительность и устойчивость системы к нагрузкам.
Кроме того, помимо архитектурных ограничений Spark Thrift Service, которые рассмотрены выше, существует ряд проблем при использовании Spark SQL, с которыми, вероятно, тоже придётся столкнуться. Одна из ключевых проблем — отсутствие специализированного плагина Ranger для Spark SQL.
В Spark SQL «из коробки» отсутствует интеграция со специализированным плагином Apache Ranger, который позволял бы устанавливать детализированные политики безопасности для баз данных. Apache Ranger широко используется для контроля доступа в крупных корпоративных средах, однако отсутствие его поддержки ограничивает гибкость и безопасность данных при работе со Spark SQL.
Kyuubi даёт такую возможность и позволяет легко интегрироваться с Apache Ranger и другими системами управления безопасностью, что улучшает управляемость доступа к данным.
Ещё одна проблема Spark SQL, которую стоит отметить, — низкая интерактивность при обработке запросов. В Spark SQL отсутствует эффективная поддержка интерактивного режима работы, что делает его менее подходящим для обработки Ad Hoc запросов и оперативной аналитики. Spark более эффективен для выполнения больших и тяжеловесных задач (batch processing), но при этом теряет в производительности при работе с короткими запросами, что несколько снижает его ценность для повседневной бизнес-аналитики.
Spark SQL — это заглушенный автомобиль, в который нужно сесть, завести, прогреть его и только потом ехать до места назначения. Kyuubi позволяет запрыгнуть в движущийся автомобиль и сразу ехать к цели.
Обзор Kyuubi
Kyuubi — это промежуточный слой между пользователем и вычислительными движками, такими как Spark SQL, который предоставляет удобный SQL-интерфейс для выполнения аналитических запросов. По сути, Kyuubi обеспечивает пользователям упрощённый доступ к кластеру Spark, устраняя необходимость детально настраивать ресурсы и конфигурацию. Он добавляет уровень управляемости и интерактивности, оптимизируя работу Spark SQL в многопользовательских средах.
Архитектура
Архитектура Kyuubi построена как абстрактный уровень между пользователями и «движком исполнения». В данной статье наш фокус на движке Spark. Kyuubi создаёт гибкую, управляемую среду для многопользовательского взаимодействия с ресурсами Spark. Основной элемент архитектуры — Kyuubi Server, который представляет собой процесс Java, конфигурируемый для поддержки различных сценариев подключения.
Через Kyuubi Server пользователи могут подключаться к Spark SQL, используя JDBC, при этом сервер обеспечивает изоляцию их сессий. Это позволяет каждому пользователю запускать свою Spark-сессию с нужными параметрами, например выделяя память и количество исполнителей.
Такая структура повышает гибкость и устраняет необходимость для пользователей вручную настраивать инфраструктурные компоненты. Если требуется, сервер Kyuubi можно настроить в режиме высокой доступности (HA) с помощью кворума ZooKeeper, что позволяет горизонтально масштабировать серверы и обрабатывать больше запросов.
Особенность Kyuubi — управление уровнем изоляции пользователей, что обеспечивает безопасность и контроль доступа к ресурсам. Поддерживается несколько уровней изоляции, таких как «изоляция по подключению», при которой для каждого пользователя поднимается отдельный экземпляр Spark. Это позволяет эффективно делить ресурсы, подстраивая их под нужды конкретных групп пользователей или задач.
Мультитенантность, несколько рабочих нагрузок, изоляция
Давайте попробуем разобраться, что значит мультитенантность в Kyuubi. Представьте, что вы подключаетесь к Spark через DBeaver. В стандартной ситуации через JDBC вы получите общий экземпляр Spark с предустановленными настройками, например тремя экзекутерами с фиксированным объёмом выделенной оперативной памяти. Этот экземпляр уже может быть занят другими пользователями, и у вас не будет возможности изменить его настройки — все ресурсы будут общими, что зачастую не очень удобно.
Теперь рассмотрим подключение через Kyuubi. Подключаясь через кластер ZooKeeper, вы перенаправляетесь на сервер Kyuubi, где можно запустить собственный экземпляр Spark, адаптированный под нужные параметры и изолированный от других пользователей. Например, вы можете выделить 6 ГБ памяти для драйвера и запустить нужное количество инстансов — это обеспечивает требуемый уровень изоляции и позволяет переопределять параметры подключения. Такой подход к мультитенантности предоставляет каждому пользователю отдельный Spark-джобу, который может подстраиваться под различные типы SQL-запросов и нагрузок.
Конфигурации по умолчанию для пользователей и групп
После настройки мультитенантности важно знать, как задать стандартные параметры для различных пользователей или групп. В Kyuubi это можно сделать через настройки пользовательских конфигураций. С помощью параметров User Defaults можно определить предустановленные настройки для пользователей, что значительно упрощает управление рабочими сценариями.
Переопределение конфигураций
Если требуется больше гибкости, Kyuubi предоставляет несколько уровней для передачи конфигураций, включая возможность их переопределения во время выполнения запросов. Подробнее об этом можно прочитать в разделе Spark Configurations. Однако важно контролировать параметры переопределения, чтобы избежать ситуаций, когда пользователи запрашивают больше ресурсов, чем это допустимо.
Управление ограничениями конфигураций
Для управления переопределением конфигураций в Kyuubi доступны следующие параметры:
1. kyuubi.session.conf.ignore.list. Позволяет игнорировать определённые конфигурации, заданные пользователем на уровне сеанса.
2. kyuubi.session.conf.restrict.list. Задаёт список конфигураций, которые пользователи могут изменять на уровне сеанса.
3. kyuubi.session.conf.profile. Позволяет применять предопределённые профили конфигураций для сеансов.
Как пример, эти параметры позволят обеспечить контроль над ресурсами и предотвращают злоупотребление ими.
Дополнительные возможности: server/engine side extensions
Помимо гибкой настройки конфигураций, Kyuubi поддерживает расширения на уровне сервера и движка, что позволяет адаптировать систему под различные сценарии.
Engine Side Extensions
Расширения на уровне движка позволяют добавлять или изменять функциональность Spark-движка, в том числе:
-
поддержку дополнительных SQL-функций и оптимизаций;
-
интеграцию с библиотеками, например, для машинного обучения;
-
кастомные функции (UDF) для специфичных рабочих задач;
-
поддержку дополнительного функционала, как пример — Z-Ordering и SQL Linage.
Подробнее: Engine Side Extensions.
Server Side Extensions
Серверные расширения позволяют улучшать работу сервера Kyuubi. Это может быть:
-
аутентификация и авторизация, например интеграция с Kerberos или LDAP;
-
мониторинг и логирование запросов;
-
расширение API для кастомизации различных интерфейсов.
Подробнее: Server Side Extensions.
Использование этих расширений повышает гибкость, производительность и безопасность Kyuubi при работе с большими данными.
Уровни изоляции
Они позволяют гибко управлять ресурсами и разделять рабочие нагрузки между пользователями. Система поддерживает несколько вариантов изоляции, каждый из которых может быть адаптирован под конкретные задачи. Например, один из базовых вариантов — это изоляция на уровне подключения (connection), при которой каждому пользователю выделяется отдельный экземпляр Spark-кластера. Это удобно, так как можно работать с кластером как с готовой СУБД, без необходимости каждый раз разворачивать инфраструктуру. Когда работа завершена, кластер автоматически завершает свою работу, что снижает затраты на ресурсы. Это особенно полезно для задач ETL, где важно автоматическое управление жизненным циклом кластера.
Другой вариант изоляции предлагает более экономичный подход, при котором сессия запускается при подключении пользователя, а после завершения работы автоматически закрывается, освобождая ресурсы. Также можно выделять кластеры на уровне группы пользователей, чтобы у разных команд были свои настройки и изолированные кластеры. В целом Kyuubi позволяет гибко настраивать изоляцию в зависимости от рабочих потребностей, будь то длительная работа в течение дня или необходимость в краткосрочных сессиях.
GUI
Kyuubi предоставляет графический интерфейс, который, несмотря на простоту, охватывает основные потребности для управления сессиями и пользователями. Разработчики могут видеть все активные сессии и при необходимости завершать их, что особенно полезно для служб информационной безопасности. Интерфейс также позволяет отслеживать активные движки, например Spark или другие, а также контролировать работу серверов Kyuubi. Встроенная поддержка REST API даёт возможность тестировать запросы и выполнять SQL-код через интерфейс, что упрощает работу с системой и позволяет быстро получать результаты.
Высокая доступность
Высокая доступность (High Availability, HA) обеспечивается с помощью ZooKeeper, который позволяет динамически управлять отказоустойчивыми подключениями пользователей. «Из коробки» такая функциональность не включена, но Kyuubi предоставляет необходимые возможности для реализации HA. Пользователь подключается не напрямую к серверу Kyuubi, а через кластер ZooKeeper. При этом ZooKeeper направляет запрос пользователя на доступный сервер Kyuubi, случайным образом выбирая один из работающих серверов. Это позволяет равномерно распределять нагрузку и сохранять доступность системы при сбоях отдельных серверов.
Если сервер Kyuubi выходит из строя, ZooKeeper автоматически перенаправляет подключение пользователя на другой активный сервер. В ZooKeeper хранится информация обо всех доступных серверах Kyuubi. Когда один из серверов недоступен, остальные серверы остаются активными, и запросы перенаправляются на них. После выбора доступного сервера подключение пользователя происходит к запущенной сессии, если та ещё активна, или к новому движку Spark, если предыдущий завершил работу.
Безопасность превыше всего
В Arenadata Hadoop для Kyuubi безопасность реализована через три ключевых элемента: аутентификацию, авторизацию и аудит.
Аутентификация обеспечивается с использованием всех популярных методов, включая Kerberos — широко используемый в индустрии стандарт, который защищает сетевые ресурсы. Kerberos гарантирует, что доступ к данным получают только аутентифицированные пользователи.
Авторизация и аудит настраиваются через Arenadata Platform Security, а именно сервис Apache Ranger. Плагин Ranger для Spark SQL и Kyuubi предоставляет тонкие (fine-grained) настройки доступа и даёт возможность ограничивать доступ к конкретным таблицам, базам данных и строкам. Это особенно полезно для защиты конфиденциальных данных и соблюдения корпоративных политик. Централизованное управление доступом через Ranger также упрощает мониторинг и настройку разрешений в масштабной инфраструктуре данных.
Преимущество Ranger заключается ещё и в его интеграции с другими распространёнными инструментами, такими как Hive и Impala, что позволяет унифицировать политику безопасности в различных компонентах системы. Это значительно упрощает администрирование и делает управление безопасностью в организации более прозрачным.
Кроме того, Ranger поддерживает аудит операций, записывая подробную информацию о каждом запросе к данным. Это позволяет контролировать доступ на всех уровнях и выполнять требования безопасности, сохраняя полный учёт действий пользователей. В результате Kyuubi и Spark SQL соответствует требованиям безопасности, предоставляет средства удобного управления доступом и позволяет полностью контролировать доступ к данным.
Интерфейсы взаимодействия
Поговорим об интерфейсах взаимодействия в Kyuubi. Вот ключевые интерфейсы, доступные в Kyuubi, и их особенности:
-
JDBC и ODBC.
Классические интерфейсы взаимодействия с базами данных, позволяющие работать с Kyuubi практически из любого популярного SQL-клиента.
-
RESTful API.
Через RESTful API можно отправлять HTTP-запросы к Kyuubi, что позволяет интегрироваться с веб-приложениями, автоматизировать процессы и взаимодействовать с Kyuubi удалённо. REST API удобен для задач, где требуется доступ через веб-приложения или если необходима автоматизация из внешних систем.
-
Kyuubi CTL.
Это клиент командной строки для оркестрации задач в Kyuubi, который поддерживает создание и запуск конфигураций из YAML-файлов. Вы можете определить в YAML-файле множество параметров для настройки кластера и выполнить их через Kyuubi CTL с командами create, get, list, submit. Этот подход позволяет гибко управлять настройками, особенно в сценариях автоматизации и DevOps, где важно быстро настраивать и управлять кластерами.
apiVersion: v1
request:
batchType: spark
name: kyuubi_spark_batch
resource: hdfs:/user/kyuubi/spark-examples_2.12-3.3.0.jar
className: org.apache.spark.examples.SparkPi
args:
- 100
configs:
spark.executor.memory: 8g
spark.executor.cores: 2
options:
verbose: true
-
Поддержка разных языков в JDBC.
Сюрприз! В Kyuubi реализована поддержка выполнения кода не только на SQL, но и на других языках, таких как Scala и Python. С помощью установки параметра сессии kyuubi.operation.language можно переключаться между языками. Например, выбрав Python, можно создавать DataFrames прямо в Kyuubi и передавать их в DBeaver или Zeppelin. Это расширяет возможности для специалистов, работающих с данными, и позволяет запускать Spark-код без необходимости переключаться на другой интерфейс. Для начинающих пользователей такой подход может быть полезным, так как они могут программировать в Spark через DBeaver, не меняя среду работы.
set kyuubi.operation.language=python;
from datetime import datetime, date
import pandas as pd
from pyspark.sql import Row
df = spark.createDataFrame([
Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),
Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0)),
Row(a=4, b=5., c='string3', d=date(2000, 3, 1), e=datetime(2000, 1, 3, 12, 0))
])
df.show()
set kyuubi.operation.language=scala;
import org.apache.spark.ml.clustering.KMeans
val dataset = spark.table("item")
dataset.show(10)
Заключение
Kyuubi представляет собой мощный инструмент, который существенно расширяет возможности работы с Spark SQL, обеспечивая стабильность и высокую доступность при управлении данными. Его архитектура позволяет обеспечить изоляцию пользователей, что не только оптимизирует нагрузку на систему, но и гарантирует высокую степень безопасности благодаря интеграции с Ranger. С помощью Kyuubi пользователи получают уникальную возможность работать с данными в привычном формате, адаптируя свои запросы под индивидуальные требования, что делает Kyuubi не просто очередным инструментом, а настоящим прорывом в мире больших данных.
Опыт работы с Kyuubi откроет новые горизонты в области анализа данных, облегчая взаимодействие с большими объёмами информации и предоставляя пользователям инструменты для эффективного принятия решений.
Автор: StanislavRG