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

108 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Проверка лимита памяти 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 со справочником зон и
группировкой по району:
```sql
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 выше. Временная схема нужна, если важно
сохранить существующие учебные таблицы. Примененный лимит можно проверить
с хоста:
```bash
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; счетчики накапливаются с запуска
контейнера. Числа нового прогона могут отличаться.