Начни работу с Trino и Alluxio за пять минут

Trino — это открытый исходный распределенный движок запросов SQL, предназначенный для запроса больших наборов данных, распределенных по одному или нескольким гетерогенным источникам данных. Trino был разработан для обработки хранилищ данных, ETL и интерактивного анализа больших объемов данных и создания отчетов. 

Alluxio — это открытый источник оркестрации данных для масштабного анализа и ИИ. Alluxio находится между вычислительными фреймворками, такими как Trino и Apache Spark, и различными системами хранения данных, такими как Amazon S3, Google Cloud Storage, HDFS и MinIO. 

Это учебник по развертыванию Alluxio в качестве кэширующего слоя для Trino с использованием соединителя Iceberg. 

Почему нам нужен кэш для Trino? 

A small fraction of the petabytes of data you store is generating business value at any given time. Repeatedly scanning the same data and transferring it over the network consumes time, compute cycles, and resources. This issue is compounded when pulling data from disparate Trino clusters across regions or clouds. In these circumstances, caching solutions can significantly reduce the latency and cost of your queries.

Trino имеет встроенный движок кэширования Rubix в своем соединителе Hive. Хотя эта система удобна, так как она идет в комплекте с Trino, она ограничена соединителем Hive и не поддерживается с 2020 года. Также она не имеет функций безопасности и поддержки дополнительных вычислительных движков. 

Trino на Alluxio 

Alluxio соединяет Trino с различными системами хранения данных, предоставляя API и единый пространство имен для приложений, управляемых данными. Alluxio позволяет Trino получать доступ к данным независимо от источника данных и прозрачно кэшировать часто используемые данные (например, часто используемые таблицы) в распределенное хранилище Alluxio. 

Использование кэширования Alluxio через соединитель Iceberg над файловым хранилищем MinIO 

Мы создали демо, которое демонстрирует, как настроить Alluxio для использования кэширования с записью через MinIO. Это достигается с помощью соединителя Iceberg и совершением одного изменения свойства расположения на таблице с точки зрения Trino.

В этом демо Alluxio запущен на отдельных серверах; однако, рекомендуется запускать его на тех же узлах, что и Trino. Это означает, что все конфигурации для Alluxio будут находиться на серверах, где запускается Alluxio, в то время как конфигурация Trino останется неизменной. Преимущество запуска Alluxio внешне заключается в том, что он не будет конкурировать за ресурсы с Trino, но недостаток заключается в том, что данные при чтении из Alluxio придется передавать по сети. Важно для производительности, чтобы Trino и Alluxio находились в одной сети.

Чтобы следовать этому демо, скопируйте код, находящийся здесь.

Конфигурация Trino

Trino настроен идентично стандартной конфигурации Iceberg. Поскольку Alluxio работает вне Trino, единственная необходимая конфигурация происходит во время запроса, а не при запуске.

Конфигурация Alluxio

Конфигурация для Alluxio может быть установлена с использованием файла alluxio-site.properties. Для сохранения всех конфигураций в одном месте в файле docker-compose.yml, мы устанавливаем их с помощью Java-свойств через переменную окружения ALLUXIO_JAVA_OPTS. В этом руководстве также упоминается главный узел как лидер, а рабочие узлы как последователи.

Конфигурации лидера

 
alluxio.master.mount.table.root.ufs=s3://alluxio/

Лидер открывает порты 19998 и 19999, последний из которых является портом для веб-интерфейса.

Конфигурации последователя

 

alluxio.worker.ramdisk.size=1G
alluxio.worker.hostname=alluxio-follower

Последователь открывает порты 29999 и 30000, и настраивает общую память, используемую Alluxio для хранения данных. Это устанавливается в 1G через свойство shm_size и ссылается из свойства alluxio.worker.ramdisk.size.

Общие конфигурации между лидером и последователем

 

alluxio.master.hostname=alluxio-leader

# Конфигурации Minio
alluxio.underfs.s3.endpoint=http://minio:9000
alluxio.underfs.s3.disable.dns.buckets=true
alluxio.underfs.s3.inherit.acl=false
aws.accessKeyId=minio
aws.secretKey=minio123

# Конфигурации только для демонстрации
alluxio.security.authorization.permission.enabled=false

Параметр alluxio.master.hostname должен быть на всех узлах, как лидерах, так и последователях. Большинство общих конфигураций указывает Alluxio на underfs, которым в данном случае является MinIO.

Параметр alluxio.security.authorization.permission.enabled установлен в “false”, чтобы упростить настройку Docker. 

Примечание: Такое решение не рекомендуется для производственной среды или CI/CD.

Запуск Сервисов

Во-первых, необходимо запустить сервисы. Убедитесь, что вы находитесь в директории trino-getting-started/iceberg/trino-alluxio-iceberg-minio. Затем выполните следующую команду:

 
docker-compose up -d

Ожидаемый результат: Docker также может скачать образы Docker перед тем, как вы увидите сообщения “Created/Started”, поэтому может быть дополнительный вывод:

 

[+] Running 10/10
 ⠿ Network trino-alluxio-iceberg-minio_trino-network          Created                                                                                                                                                                                                      0.0s
 ⠿ Volume "trino-alluxio-iceberg-minio_minio-data"            Created                                                                                                                                                                                                      0.0s
 ⠿ Container trino-alluxio-iceberg-minio-mariadb-1            Started                                                                                                                                                                                                      0.6s
 ⠿ Container trino-alluxio-iceberg-minio-trino-coordinator-1  Started                                                                                                                                                                                                      0.7s
 ⠿ Container trino-alluxio-iceberg-minio-alluxio-leader-1     Started                                                                                                                                                                                                      0.9s
 ⠿ Container minio                                            Started                                                                                                                                                                                                      0.8s
 ⠿ Container trino-alluxio-iceberg-minio-alluxio-follower-1   Started                                                                                                                                                                                                      1.5s
 ⠿ Container mc                                               Started                                                                                                                                                                                                      1.4s
 ⠿ Container trino-alluxio-iceberg-minio-hive-metastore-1     Started

Открытие CLI Trino

После завершения этого процесса вы можете войти в узел координатора Trino. Для этого мы будем использовать команду exec и запустим исполняемый файл trino CLI в качестве команды, которую мы запускаем в этом контейнере. Обратите внимание, что идентификатор контейнера – trino-alluxio-iceberg-minio-trino-coordinator-1, поэтому команда, которую вы будете запускать, выглядит следующим образом:

 

<<<<<<< HEAD
docker container exec -it trino-alluxio-iceberg-minio-trino-coordinator-1 trino
=======
docker container exec -it trino-minio_trino-coordinator_1 trino
>>>>>>> alluxio

Когда вы начнете этот шаг, вы должны увидеть курсор trino после завершения запуска. Когда это будет сделано, он должен выглядеть следующим образом:

 
trino>

Чтобы лучше понять, как работает это конфигурация, давайте создадим таблицу Iceberg с помощью запроса CTAS (CREATE TABLE AS), который передает данные из одного из соединителей TPC в Iceberg, указывающий на MinIO. Соединители TPC генерируют данные на лету, поэтому мы можем выполнять такие простые тесты.

Во-первых, выполните команду, чтобы показать каталоги, чтобы увидеть каталоги tpch и iceberg, поскольку именно их мы будем использовать в запросе CTAS:

 
SHOW CATALOGS;

Вы должны увидеть, что каталог Iceberg зарегистрирован.

MinIO Buckets и Trino Schemas

При запуске выполняется следующая команда в контейнере инициализации, который включает CLI mc для MinIO. Это создает бакет в MinIO с именем /alluxio, который дает нам место для записи наших данных, и мы можем указать Trino, где его найти:

 

/bin/sh -c "
until (/usr/bin/mc config host add minio http://minio:9000 minio minio123) do echo '...waiting...' && sleep 1; done;
/usr/bin/mc rm -r --force minio/alluxio;
/usr/bin/mc mb minio/alluxio;
/usr/bin/mc policy set public minio/alluxio;
exit 0;
"

Примечание: Этот бакет будет служить точкой монтирования для Alluxio, поэтому каталог схемы alluxio://lakehouse/ в Alluxio будет сопоставлен с s3://alluxio/lakehouse/.

Запросы к Trino

Давайте перейдем к созданию нашего SCHEMA, который указывает на бакет в MinIO, а затем запустим наш запрос CTAS. Вернемся в терминал и создадим iceberg.lakehouse SCHEMA. Это будет первый вызов в метахранилище для сохранения расположения схемы в пространстве имен Alluxio. Обратите внимание, нам нужно будет указать имя хоста alluxio-leader и порт 19998, поскольку мы не установили Alluxio в качестве файловой системы по умолчанию. Учитывайте это, если вы хотите, чтобы кэширование Alluxio было использованием по умолчанию и было прозрачным для пользователей, управляющих DDL-операциями:

 

CREATE SCHEMA iceberg.lakehouse
WITH (location = 'alluxio://alluxio-leader:19998/lakehouse/');

Теперь, когда у нас есть SCHEMA, который ссылается на бакет, где мы храним наши таблицы в Alluxio, который синхронизируется с MinIO, мы можем создать нашу первую таблицу.

Необязательно: Чтобы просмотреть запущенные запросы, войдите в интерфейс Trino и войдите, используя любое имя пользователя (неважно, так как безопасность не настроена).

Переместите данные клиентов из небольшого сгенерированного набора данных TPCH в MinIO с помощью запроса CTAS. Запустите следующий запрос, и, если хотите, наблюдайте за его выполнением в интерфейсе Trino:

 

CREATE TABLE iceberg.lakehouse.customer
WITH (
  format = 'ORC',
  location = 'alluxio://alluxio-leader:19998/lakehouse/customer/'
) 
AS SELECT * FROM tpch.tiny.customer;

Перейдите в интерфейс Alluxio и интерфейс MinIO и изучите файлы Alluxio и MinIO. Теперь вы увидите директорию lakehouse, содержащую директорию customer, в которой хранятся данные, записанные Trino в Alluxio, и Alluxio записывает их в MinIO.

Теперь, под Alluxio и MinIO находится таблица, вы можете запросить эти данные, проверив следующее:

 
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;

Как мы уверены, что Trino действительно читает из Alluxio, а не из MinIO? Давайте удалим данные в MinIO и снова запустим запрос, чтобы быть уверенными. После удаления этих данных, вы все равно должны увидеть возвращаемые данные.

Остановка Сервисов

После завершения этого руководства ресурсы, использованные для этой практики, можно освободить, выполнив следующую команду:

 
docker-compose down

Заключение

К этому моменту у вас должно быть лучшее понимание Trino и Alluxio, как начать развертывание Trino и Alluxio, и как использовать кэширование Alluxio с соединителем Iceberg и файловым хранилищем MinIO. Надеюсь, вам понравилась эта статья. Не забудьте поставить лайк и оставить комментарий, если у вас возникнут вопросы!

Source:
https://dzone.com/articles/get-started-with-trino-and-alluxio-in-five-minutes