Среда разработки: Docker, Trino CLI, песочница курса
Trino — распределённая система, и может показаться, что для практики нужен настоящий кластер из нескольких машин или облачный аккаунт. Это не так. Trino отлично запускается локально в одном контейнере Docker, где координатор и воркер совмещены в одном процессе. Этого достаточно, чтобы пройти большую часть курса: писать SQL, читать EXPLAIN, изучать системные каталоги, ставить эксперименты.
Этот урок настраивает вашу рабочую среду. Мы поднимем Trino в Docker, подключимся к нему через официальный CLI, выполним первые запросы и разберём, как устроена песочница курса — набор системных каталогов, на которых можно учиться без подключения внешних баз данных.
Почему Docker
Trino написан на Java и для запуска требует подходящей версии JDK, правильно настроенного heap и каталога с конфигурацией из нескольких файлов. Ставить всё это вручную на каждую машину — лишняя работа и источник ошибок: на одном ноутбуке не та Java, на другом конфликт версий.
Docker снимает эту проблему целиком. Официальный образ trinodb/trino уже содержит правильную JDK, сервер Trino и рабочую конфигурацию по умолчанию. Вы запускаете один контейнер — и у вас работающий Trino, идентичный у всех, кто проходит курс. Тег образа совпадает с номером версии Trino: trinodb/trino:481 — это Trino версии 481.
Для практики курса вам понадобится установленный Docker (Docker Desktop или OrbStack на Mac, Docker Engine на Linux). Проверить, что он работает:
Docker: образ против контейнераdocker --version
# Docker version 27.5.1, build 9f9e405
docker info | grep "Server Version"
# Server Version: 27.5.1
Запуск Trino одним контейнером
Самый быстрый способ поднять Trino — запустить официальный образ напрямую. Координатор и воркер в этом случае живут в одном процессе: для обучения этого полностью достаточно, разницу между ролями мы подробно разберём в модуле про MPP-архитектуру.
docker run --name trino -d -p 8080:8080 trinodb/trino:481
Разберём флаги. --name trino даёт контейнеру понятное имя, чтобы потом обращаться к нему по имени, а не по id. -d запускает контейнер в фоне (detached). -p 8080:8080 пробрасывает порт 8080 контейнера на порт 8080 вашей машины — это HTTP-порт, на котором Trino слушает и клиентов, и Web UI. trinodb/trino:481 — образ с явным тегом версии.
Trino стартует не мгновенно — JVM нужно прогреться несколько десятков секунд. Дождаться готовности можно так:
docker logs -f trino 2>&1 | grep -m1 "SERVER STARTED"
# 2026-05-20T08:14:03.512Z INFO main io.trino.server.Server ======== SERVER STARTED ========
Строка SERVER STARTED означает, что сервер принял конфигурацию и готов обслуживать запросы. Теперь можно открыть в браузере http://localhost:8080 — это Web UI Trino, где видны все запросы кластера. Логином может быть любое имя пользователя, пароль на дефолтной конфигурации не требуется.
Если порт 8080 на вашей машине занят (его часто использует другой сервис), Docker выдаст ошибку привязки порта. Поменяйте левую часть проброса: -p 8081:8080. Тогда Trino будет доступен на http://localhost:8081, а внутри контейнера он по-прежнему слушает 8080.
Trino CLI
Web UI хорош для наблюдения за запросами, но писать SQL удобнее в командной строке. Для этого есть официальный Trino CLI — клиент, который отправляет запросы на координатор и показывает результаты в терминале.
CLI — это self-executable JAR-файл, его можно скачать с trino.io. Но проще всего не ставить ничего отдельно, а воспользоваться тем же Docker-образом: внутри trinodb/trino CLI уже лежит. Подключиться к только что запущенному контейнеру можно так:
docker exec -it trino trino
Здесь docker exec -it trino запускает команду внутри уже работающего контейнера trino в интерактивном режиме, а последнее слово trino — это и есть запуск CLI. Без дополнительных аргументов CLI подключается к локальному координатору на localhost:8080. Вы увидите приглашение:
trino>
Это интерактивная сессия. Проверим, что всё работает, и заодно посмотрим версию сервера:
SELECT version();
_col0
-------
481
(1 row)
Сервер ответил номером своей версии. Если число отличается от 481 — значит, вы запустили образ с другим тегом, и это нормально: Trino выходит часто, и более свежая версия для курса вполне подходит.
Когда CLI запускают не внутри контейнера, а как отдельный JAR, ему нужно явно указать адрес сервера и каталог по умолчанию:
trino --server localhost:8080 --catalog tpch --schema sf1
Флаг --server задаёт адрес координатора, --catalog и --schema — каталог и схему по умолчанию, чтобы не писать их полное имя в каждом запросе. Что такое каталог и схема, разберём прямо сейчас.
Песочница курса: системные каталоги
Trino сам по себе не хранит данных — чтобы что-то запросить, нужен подключённый источник. Но для обучения не обязательно сразу поднимать PostgreSQL или загружать файлы на S3. У Trino есть набор встроенных системных каталогов, которые работают сразу после старта и служат идеальной песочницей. Это и есть учебная среда курса на первых модулях.
Адрес любой таблицы в Trino состоит из трёх частей: catalog.schema.table. Каталог — это подключение к источнику; схема — группа таблиц внутри него; таблица — собственно данные. Полное имя выглядит так: tpch.sf1.orders.
Самые полезные системные каталоги для песочницы:
| Каталог | Что даёт | Зачем в курсе |
|---|---|---|
tpch | Сгенерированный на лету бенчмарк-датасет (заказы, клиенты, товары) | Реалистичные данные любого объёма без загрузки |
tpcds | Более крупный и сложный бенчмарк-датасет | Сложные запросы, много таблиц, тесты оптимизатора |
system | Метаданные самого Trino: запросы, узлы, каталоги | Наблюдение за работой движка изнутри |
jmx | JMX-метрики Trino, представленные как таблицы | Мониторинг и наблюдаемость |
memory | Таблицы, которые живут в оперативной памяти кластера | Быстрые эксперименты с записью данных |
blackhole | Поглощает любые записи и не хранит ничего | Тесты записи без побочных эффектов |
faker | Генерация синтетических тестовых данных | Учебные датасеты с нужной структурой |
Каталог tpch особенно удобен. Он не хранит данные — он генерирует их в момент запроса. Схема внутри него задаёт масштаб: sf1 — это scale factor 1, примерно гигабайт данных; tiny — крошечный набор для быстрых проверок; sf100 — сто гигабайт. Посмотрим, что внутри:
SHOW SCHEMAS FROM tpch;
Schema
--------------------
information_schema
sf1
sf100
sf1000
sf300
sf3000
sf30000
tiny
(8 rows)
SHOW TABLES FROM tpch.tiny;
Table
----------
customer
lineitem
nation
orders
part
partsupp
region
supplier
(8 rows)
Теперь можно выполнить настоящий аналитический запрос, не подключив ни одной внешней базы:
SELECT
o.orderpriority,
count(*) AS orders,
sum(o.totalprice) AS revenue
FROM tpch.tiny.orders o
GROUP BY o.orderpriority
ORDER BY revenue DESC;
orderpriority | orders | revenue
-----------------+--------+----------------
1-URGENT | 3080 | 4.6258...E8
2-HIGH | 3006 | 4.5128...E8
3-MEDIUM | 2970 | 4.4790...E8
4-NOT SPECIFIED | 3014 | 4.4524...E8
5-LOW | 3009 | 4.4291...E8
(5 rows)
Это полноценный OLAP-запрос — группировка и агрегация — и он отработал на данных, которых не существует на диске: tpch сгенерировал их прямо в процессе исполнения. На таких системных каталогах построены все ранние практики курса. Внешние источники — PostgreSQL, Iceberg на MinIO — мы подключим позже, в модулях про коннекторы, lakehouse и федерацию.
Полезные команды CLI для ориентации в песочнице: SHOW CATALOGS — список всех каталогов; SHOW SCHEMAS FROM <catalog> — схемы каталога; SHOW TABLES FROM <catalog>.<schema> — таблицы; DESCRIBE <catalog>.<schema>.<table> — столбцы и их типы. Выход из CLI — команда quit или сочетание Ctrl-D.
Что дальше с лабами
Для крупных лабораторных работ одного контейнера будет мало — там нужны несколько сервисов вместе: координатор и воркеры Trino, MinIO как S3-совместимое хранилище, метастор для Iceberg, иногда PostgreSQL. Всё это описывается одним файлом docker-compose.yml, который поднимает связку контейнеров одной командой docker compose up. Каждая лаба будет приходить со своим compose-файлом и инструкцией. Базовый навык — запуск контейнера и подключение CLI — у вас уже есть, и его достаточно, чтобы начать курс.
Попробуй сам
Поднимите Trino локально по шагам из урока: запустите контейнер, дождитесь строки SERVER STARTED, откройте http://localhost:8080 в браузере и убедитесь, что Web UI открывается.
Затем подключитесь через CLI (docker exec -it trino trino) и выполните серию команд: SELECT version();, SHOW CATALOGS;, SHOW SCHEMAS FROM tpch;, SHOW TABLES FROM tpch.tiny;, DESCRIBE tpch.tiny.customer;. Прочитайте, какие столбцы и типы у таблицы customer.
В завершение напишите свой первый аналитический запрос: посчитайте по таблице tpch.tiny.customer, сколько клиентов приходится на каждый сегмент рынка (столбец mktsegment), и отсортируйте результат по убыванию количества. Запустите тот же запрос на схеме tpch.sf1 вместо tpch.tiny и обратите внимание, что числа выросли — это тот же датасет в большем масштабе, сгенерированный на лету.