Files
mini-lakehouse-lab/plans/trino-memory-validation.md

7.5 KiB
Raw Permalink Blame History

Проверка лимита памяти Trino

Дата: 19 октября 2026 года. Это отчет о проверке; актуальная конфигурация находится в docker-compose.yml и trino/jvm.config, требования для учащегося — в START_HERE.md.

Что проверяли

Trino 478 в контейнере с пределом 2 ГиБ RAM, без swap, с Java heap от 512 МиБ до 1 ГиБ. JVM сама подбирает размер регионов G1; вместо настройки образа G1HeapRegionSize=32M для большого heap получен регион 1 МиБ.

Среда: Linux x86_64, Docker Engine, cgroup v2, 6 CPU и 11,14 ГиБ памяти, видимых Docker. Остальные сервисы стенда работали одновременно. Общего лимита 8 ГБ для проекта или виртуальной машины в этом прогоне не было.

Исходные файлы основного маршрута курса:

Файл Размер, байт
yellow_tripdata_2024-01.parquet 49 961 641
yellow_tripdata_2024-02.parquet 50 349 284
yellow_tripdata_2024-03.parquet 60 078 280
taxi_zone_lookup.csv 12 331

Файлы взяты из уже скачанного учебного набора, без выборки или сокращения.

Сценарий

  1. Перед изменением проверены отсутствие активных Spark-приложений и запросов Trino, чтение существующей таблицы lakehouse.default.spark_trino_smoke.

  2. Пересоздан только Trino. Запуск до SERVER STARTED занял около 25 секунд, healthcheck прошел.

  3. Созданы отдельная временная схема trino_memory_<id> и собственный префикс validation/trino_memory_<id>/raw/ в MinIO. Таблицы курса не перезаписывались.

  4. Spark подготовил bronze и справочник по SQL Модуля 4; фильтры, нормализации, два JOIN со справочником и silver выполнены кодом Модуля 5. Проверки качества этого модуля также прошли. Получены 9 554 778 строк bronze, 9 418 184 строк silver и 265 строк справочника.

  5. Через Python-клиент Trino выполнены 11 запросов из Модуля 6: просмотр схем, таблиц и колонок, выборки, подсчет строк, общие метрики, агрегаты по районам и топ-10 зон. Имена таблиц заменены на временные; SQL сохранен.

  6. Дополнительно дважды выполнен JOIN всей bronze со справочником зон и группировкой по району:

    SELECT z.Borough, count(*) AS trips, avg(b.fare_amount) AS avg_fare
    FROM <bronze> b
    LEFT JOIN <zones> z ON b.PULocationID = z.LocationID
    GROUP BY z.Borough
    ORDER BY trips DESC;
    
  7. Подсчет строк, общие метрики, агрегаты по районам, топ зон, чтение созданной Spark таблицы итогов и оба JOIN сверены с результатами Spark. Для чисел с плавающей точкой использован допуск 1e-8. Ошибки Python-клиента Trino пробрасывались наружу, без обработчика исключений из ноутбука.

  8. Повторно прочитана прежняя smoke-таблица: результат 1 / from_spark сохранен. Всего завершились успешно 14 запросов. Временные таблицы удалены с PURGE, затем удалены временная схема и собственный raw-префикс. После PURGE отдельно удалены восемь пустых маркеров каталогов в собственном warehouse-префиксе. Проверено отсутствие временных объектов; исходные Parquet/CSV на хосте сохранены.

Измерения

Показатель Результат
Лимит контейнера (memory.max) 2 147 483 648 байт
Лимит swap (memory.swap.max) 0
Фактический MaxHeapSize через jcmd 1 VM.flags 1 073 741 824 байта
Пик контейнера Trino (memory.peak) 1 340 874 752 байта, около 1,25 ГиБ
События oom, oom_kill, max в memory.events 0
Перезапуски Trino 0
Пик суммы memory.current восьми контейнеров около 5,89 ГиБ
Пик той же суммы за вычетом inactive_file около 5,44 ГиБ

Суммарная память снималась раз в секунду, получено 165 отсчетов во время подготовки таблиц, запросов и очистки. Пик Trino взят из счетчика cgroup, который учитывает и запуск контейнера. Вычитание inactive_file приближает сумму к показателю памяти в docker stats; файловый кэш показан отдельно.

Агрегаты по silver обработали 9 418 184 строки каждый, что подтверждено статистикой запросов Trino. count(*) по bronze использовал метаданные Iceberg; проверкой чтения bronze служил также JOIN со справочником.

Границы вывода

Бюджет Trino 2 ГиБ / heap 1 ГиБ достаточен для проверенных запросов на основном наборе курса при одном учащемся. Измерение не подтверждает работу всех восьми модулей под общим жестким лимитом 8 ГБ. В сумму контейнеров не входят Docker daemon, ядро и другие процессы Linux/WSL2. Docker Desktop, Windows, ARM64, параллельные занятия и расширенный набор Taxi за 12 месяцев не проверялись.

Для повторной проверки подними стенд с этой конфигурацией и пройди модули 3–6 на трех месяцах Taxi, добавив JOIN выше. Временная схема нужна, если важно сохранить существующие учебные таблицы. Примененный лимит можно проверить с хоста:

docker inspect --format '{{.HostConfig.Memory}} {{.HostConfig.MemorySwap}}' trino
docker compose exec trino jcmd 1 VM.flags
docker compose exec trino cat /sys/fs/cgroup/memory.peak
docker compose exec trino cat /sys/fs/cgroup/memory.events

Последние два пути относятся к cgroup v2; счетчики накапливаются с запуска контейнера. Числа нового прогона могут отличаться.