108 lines
7.5 KiB
Markdown
108 lines
7.5 KiB
Markdown
# Проверка лимита памяти 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; счетчики накапливаются с запуска
|
||
контейнера. Числа нового прогона могут отличаться.
|