Обзор DuckDB
Обзор
DuckDB — это аналитическая реляционная система управления базами данных, предназначенная для быстрой обработки данных и выполнения аналитических нагрузок.
В отличие от традиционных клиент-серверных систем управления базами данных, DuckDB представляет собой встраиваемый механизм баз данных, который работает внутри процесса хоста и не требует отдельного сервера.
DuckDB оптимизирован для выполнения аналитических запросов и может обрабатывать данные из локальных файлов и внешних источников данных.
Например, Airflow может использовать DuckDB для:
-
чтения данных из внешнего хранилища;
-
выполнения SQL-запросов непосредственно над данными в формате Parquet и другими;
-
преобразования и агрегации наборов данных;
-
записи результатов аналитической обработки;
-
проверки доступности необходимых данных;
-
объединения данных из локальных файлов и внешних источников.
Сервис DuckDB в ADO предоставляет управляемую среду выполнения DuckDB для создания аналитических SQL-запросов. Сервис поставляется в виде среды выполнения командной строки и может использоваться в DAG и другими компонентами ADO. Сервис не является постоянно работающим демоном и не предоставляет сетевой эндпоинт или веб-интерфейс.
Сервис DuckDB предоставляет:
-
предварительно установленный DuckDB CLI на выбранных хостах ADO;
-
централизованное управление конфигурацией через ADCM;
-
интеграцию с внешними источниками данных и системами хранения через расширения DuckDB;
-
интеграцию с Airflow через провайдер DuckDB;
-
общую среду выполнения DuckDB и конфигурацию.
Архитектура
DuckDB использует внутрипроцессную архитектуру. При отправке запроса в DuckDB CLI механизм DuckDB выполняет разбор, связывание, построение плана, оптимизацию и выполнение запроса в рамках одного процесса.
Основные этапы обработки запроса:
-
Парсер — преобразует SQL-запрос во внутреннее представление. На этом этапе DuckDB еще не сопоставляет таблицы и столбцы с объектами базы данных и не определяет типы данных.
-
Binder — сопоставляет таблицы и столбцы с использованием каталога, определяет типы данных и извлекает агрегатные функции и оконные функции.
-
Логический планировщик — создает логическое дерево запроса на основе связанного запроса.
-
Оптимизатор — преобразует логическое дерево запроса в оптимизированный план запроса. Среди прочего, DuckDB может упрощать выражения, перемещать фильтры ближе к источнику данных (filters pushdown), изменять порядок соединений и устранять общие подвыражения.
-
Механизм сопоставления привязки столбцов — сопоставляет ссылки на столбцы с их позициями в структурах данных, используемых при выполнении запроса.
-
Генератор физического плана — преобразует оптимизированный логический план в дерево физических операторов.
-
Механизм выполнения — выполняет физические операторы и формирует результат запроса. DuckDB использует векторизованное выполнение и обрабатывает данные блоками.
DuckDB может работать как с файлами базы данных .duckdb, так и с данными, к которым осуществляется прямой доступ из внешних источников. Механизм расширений предоставляет поддержку дополнительных форматов данных, систем хранения и интеграций.
Компоненты
Сервис DuckDB включает компонент DuckDB CLI, который предоставляет среду выполнения DuckDB в командной строке, используемую для выполнения SQL-запросов.
ADCM устанавливает DuckDB CLI на выбранных хостах по пути /usr/bin/duckdb. Исполняемый файл является оболочкой ADO, которая применяет конфигурацию сервиса перед запуском DuckDB CLI.
Сервис DuckDB использует следующие конфигурационные файлы:
-
/etc/duckdb/conf/duckdb-env.sh — определяет среду DuckDB и пути к установке DuckDB, расширениям и внешним средам выполнения.
-
/etc/duckdb/conf/duckdb-conf.sql — содержит глобальную конфигурацию DuckDB в формате SQL.
Обработка запросов
Запросы DuckDB в ADO выполняются локально на хосте, на котором установлен DuckDB CLI.
Процесс выполнения запроса выглядит следующим образом:
-
Пользователь или приложение отправляет SQL-запрос DuckDB.
-
Оболочка DuckDB CLI запускает среду выполнения DuckDB.
-
Оболочка применяет переменные окружения и глобальную конфигурацию SQL.
-
DuckDB выполняет разбор и связывание запроса.
-
DuckDB создает логический план запроса и применяет оптимизацию запроса.
-
Оптимизированный логический план преобразуется в физический план выполнения.
-
DuckDB выполняет физические операторы с использованием векторизованного механизма выполнения.
-
Сервис возвращает результат выполнения запроса.
Провайдер DuckDB использует тот же исполняемый файл /usr/bin/duckdb для DAG . Провайдер выполняет SQL через DuckDB CLI и предоставляет доступ к выполнению через стандартный интерфейс Airflow.
Провайдер включает:
-
DuckDBHook— для выполнения SQL через среду выполнения DuckDB; -
DuckDBOperator— для выполнения SQL, заданного непосредственно в DAG, или SQL-файлов в задачах DAG; -
DuckDBSqlSensor— для ожидания, пока запрос DuckDB не вернет валидное значение.
Соединение DuckDB в Airflow может определять путь к базе данных, альтернативный исполняемый файл DuckDB и дополнительные параметры CLI. Настройки уровня оператора могут переопределять значения уровня соединения, если это предусмотрено.
Интеграция с сервисами ADO
Основная интеграция выполняется с Airflow. Воркеры Airflow могут использовать сервис DuckDB для выполнения аналитических SQL-запросов в рамках рабочих процессов DAG. Это позволяет включать операции DuckDB в конвейеры обработки данных без ручного вызова CLI через BashOperator.
DuckDB также может получать доступ к данным, хранящимся за пределами локальных файлов базы данных, через поддерживаемые расширения. В зависимости от установленных расширений и их конфигурации DuckDB могут работать с внешним объектным хранилищем и платформами данных, включая S3-совместимые хранилища, Arenadata Hyperwave (ADH), HDFS, Ozone и Hive Metastore.
Конфигурация
Сервис DuckDB настраивается через ADCM. Конфигурация включает среду DuckDB, глобальные настройки SQL, ограничения ресурсов, параметры хранения и ввода-вывода, настройки расширений, параметры совместимости с SQL, а также настройки выполнения и оптимизации.
Полный список доступных параметров приведен в статье Конфигурационные параметры DuckDB.
Провайдер DuckDB для Airflow
DuckDB CLI доступен после установки компонента DuckDB на хосте по адресу:
$ /usr/bin/duckdb
CLI можно использовать непосредственно на хосте или через компоненты ADO, интегрированные с DuckDB.
В Airflow для выполнения SQL-запросов в DAG через DuckDB используйте провайдер DuckDB. Провайдер использует DuckDB CLI в качестве серверной части выполнения и применяет ту же среду DuckDB и глобальную конфигурацию.
Более подробно о провайдере читайте в статье Провайдер DuckDB.