Создание облегченной конфигурации Trino
Алгоритм создания стабильной и высокопроизводительной конфигурации Trino, занимающей всего 391 МБ
Многие фреймворки для работы с данными слишком сложны при работе с небольшими масштабами. С помощью всего нескольких настроек можно создать легковесную и при этом высокопроизводительную версию Trino.
Официальный Docker-образ достаточно тяжелый
Docker-образ, разработанный командой Trino (trinodb/trino), занимает 1,32 ГБ. Он включает в себя полный дистрибутив CentOS, что достаточно удобно. Но, если Вы собираетесь встраивать Trino в другие приложения, то, конечно, это слишком большой объем памяти.
Уменьшаем размер основного Docker-образа
Большая часть «веса» официального контейнера Trino приходится на базовый образ CentOS.
FROM azul/zulu-openjdk-centos:11
Переход на дистрибутив на основе Alpine, такой как adoptopenjdk, значительно сокращает объем загрузки.
FROM adoptopenjdk/openjdk11:jdk-11.0.10_9-alpine-slim
Выбирайте дистрибутив Alpine тщательно! Мы стали свидетелями значительного снижения производительности работы Java-приложений при использовании дистрибутивов Alpine, не включающих в себя glibc. Контейнеры adoptopenjdk обладают хорошей производительностью, оставаясь при этом относительно легкими.
Уменьшение числа коннекторов
Следующий шаг является необязательным, но он сильно влияет на размер контейнера. Trino поставляется с множеством предустановленных коннекторов, каждый из которых требует вспомогательных библиотек.
Однако не все эти коннекторы являются обязательными. В наших одноконтейнерных дистрибутивах мы удаляем все необязательные коннекторы (кроме собственного коннектора Resurface).
rm -rf /opt/trino/plugin/accumulo &&\rm -rf /opt/trino/plugin/atop &&\rm -rf /opt/trino/plugin/bigquery &&\rm -rf /opt/trino/plugin/blackhole &&\rm -rf /opt/trino/plugin/cassandra &&\rm -rf /opt/trino/plugin/clickhouse &&\rm -rf /opt/trino/plugin/druid &&\rm -rf /opt/trino/plugin/elasticsearch &&\rm -rf /opt/trino/plugin/example-http &&\rm -rf /opt/trino/plugin/geospatial &&\rm -rf /opt/trino/plugin/google-sheets &&\rm -rf /opt/trino/plugin/hive-hadoop2 &&\rm -rf /opt/trino/plugin/iceberg &&\rm -rf /opt/trino/plugin/jmx &&\rm -rf /opt/trino/plugin/kafka &&\rm -rf /opt/trino/plugin/kinesis &&\rm -rf /opt/trino/plugin/kudu &&\rm -rf /opt/trino/plugin/local-file &&\rm -rf /opt/trino/plugin/memsql &&\rm -rf /opt/trino/plugin/ml &&\rm -rf /opt/trino/plugin/mongodb &&\rm -rf /opt/trino/plugin/mysql &&\rm -rf /opt/trino/plugin/oracle &&\rm -rf /opt/trino/plugin/phoenix &&\rm -rf /opt/trino/plugin/phoenix5 &&\rm -rf /opt/trino/plugin/pinot &&\rm -rf /opt/trino/plugin/postgresql &&\rm -rf /opt/trino/plugin/prometheus &&\rm -rf /opt/trino/plugin/raptor-legacy &&\rm -rf /opt/trino/plugin/redis &&\rm -rf /opt/trino/plugin/redshift &&\rm -rf /opt/trino/plugin/sqlserver &&\rm -rf /opt/trino/plugin/teradata-functions &&\rm -rf /opt/trino/plugin/thrift &&\rm -rf /opt/trino/plugin/tpcds &&\rm -rf /opt/trino/plugin/tpch
Настройка параметров памяти
Trinoдает возможность гибкой настройки памяти в зависимости от Ваших потребностей. Когда я спросил об этом Мартина Траверсо, одного из разработчика Trino, он ответил, что Trino должна успешно пройти все тесты при запуске как на небольшой конфигурации (ноутбук), так и на более масштабном проекте. Тот факт, что Мартин отреагировал именно так, дал нам новую уверенность в том, что мы сможем продолжать экспериментировать с меньшими конфигурациями.
Для наших самых небольших контейнеров мы выделили Trino 1 ГБ памяти, используя следующие стандартные параметры:
query.max-length=1000000query.max-memory=1000MBquery.max-memory-per-node=1000MBquery.max-total-memory=1000MBquery.max-total-memory-per-node=1000MB
Если Вы все еще пытаетесь решить проблемы с нехваткой памяти, возможно, Вам следует уменьшить объем памяти, используемой кэшем запросов. Это особенно важно, если Ваши SQL-запросы достаточно велики или если скорость транзакций достаточно высока, что приводит к тому, что кэшируется слишком много данных истории запросов.
query.max-history=20 query.min-expire-age=1s
Окончательные результаты
Следуя этим шагам, Вы получите стабильную и высокопроизводительную конфигурацию Trino размером 391 МБ. Это всего лишь 30 % от размера стандартного контейнера Trino! Конечно, это не означает, что мы сможем обойтись без компромиссов, но такой диапазон гибкости - это действительно здорово!
Если Вы ищете максимально легкий образ контейнера Trino, Вы можете использовать наш вариант.
FROM resurfaceio/trino-minimal:358
Если же Вы хотите создать свой собственный облегченный образ Trino, обязательно изучите этот Dockerfile: https://github.com/resurfaceio/containers/blob/master/trino/trino-minimal.dockerfile




