Comece com Trino e Alluxio em Cinco Minutos

Trino é um mecanismo de consulta SQL distribuído de código aberto projetado para consultar grandes conjuntos de dados distribuídos em um ou mais repositórios de dados heterogêneos. Trino foi projetado para lidar com data warehousing, ETL e análise interativa por meio de grandes quantidades de dados e produzindo relatórios. 

Alluxio é uma plataforma de orquestração de dados de código aberto para análise em larga escala e AI. Alluxio está entre os frameworks de computação, como Trino e Apache Spark, e vários sistemas de armazenamento como Amazon S3, Google Cloud Storage, HDFS e MinIO. 

Este é um tutorial para implantar Alluxio como camada de cache para Trino usando o conector Iceberg.

Por que precisamos de cache para 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 possui um mecanismo de cache interno, Rubix, em seu conector Hive. Embora esse sistema seja conveniente, pois vem com Trino, é limitado ao conector Hive e não tem sido mantido desde 2020. Também carece de recursos de segurança e suporte para outros motores de computação.

Trino em Alluxio

Alluxio conecta Trino a vários sistemas de armazenamento, fornecendo APIs e um namespace unificado para aplicativos orientados a dados. Alluxio permite que Trino acesse dados independentemente da fonte de dados e cache de forma transparente dados acessados com frequência (por exemplo, tabelas comumente usadas) no armazenamento distribuído Alluxio.

Usando o cache Alluxio via conector Iceberg sobre o armazenamento de arquivos MinIO

Criamos uma demonstração que mostra como configurar Alluxio para usar cache write-through com MinIO. Isso é alcançado usando o conector Iceberg e fazendo uma única alteração na propriedade de localização na tabela do ponto de vista de Trino.

Neste demo, o Alluxio é executado em servidores separados; no entanto, é recomendado executá-lo nos mesmos nós que o Trino. Isso significa que todas as configurações para o Alluxio estarão localizadas nos servidores onde o Alluxio é executado, enquanto a configuração do Trino permanece inalterada. A vantagem de executar o Alluxio externamente é que ele não competirá por recursos com o Trino, mas a desvantagem é que os dados precisarão ser transferidos pela rede ao ler do Alluxio. É crucial para o desempenho que o Trino e o Alluxio estejam na mesma rede.

Para seguir este demo, copie o código localizado aqui.

Configuração do Trino

O Trino é configurado de forma idêntica a uma configuração padrão do Iceberg. Como o Alluxio está sendo executado externamente ao Trino, a única configuração necessária é na hora da consulta e não no início.

Configuração do Alluxio

A configuração do Alluxio pode ser definida usando o arquivo alluxio-site.properties. Para manter todas as configurações no arquivo docker-compose.yml, estamos configurando-as usando propriedades Java através da variável de ambiente ALLUXIO_JAVA_OPTS. Este tutorial também se refere ao nó mestre como líder e aos trabalhadores como seguidores.

Configurações do Mestre

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

O líder expõe portas 19998 e 19999, sendo esta última a porta para a interface web.

Configurações dos Trabalhadores

 

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

O seguidor expõe portas 29999 e 30000, e configura uma memória compartilhada usada pelo Alluxio para armazenar dados. Isso é definido como 1G através da propriedade shm_size e é referenciado a partir da propriedade alluxio.worker.ramdisk.size.

Configurações Compartilhadas Entre Líder e Seguidor

 

alluxio.master.hostname=alluxio-leader

# Configurações do 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

# Configurações apenas para demonstração
alluxio.security.authorization.permission.enabled=false

O alluxio.master.hostname precisa estar em todos os nós, líderes e seguidores. A maioria das configurações compartilhadas aponta o Alluxio para o underfs, que neste caso é o MinIO.

alluxio.security.authorization.permission.enabled é definido como “false” para manter simples a configuração do Docker.

Nota: Não é recomendado fazer isso em um ambiente de produção ou CI/CD.

Executando Serviços

Primeiro, você deseja iniciar os serviços. Certifique-se de estar no diretório trino-getting-started/iceberg/trino-alluxio-iceberg-minio. Agora, execute o seguinte comando:

 
docker-compose up -d

Você deve esperar ver a seguinte saída. O Docker também pode precisar baixar as imagens do Docker antes de você ver as mensagens “Criado/Iniciado”, então pode haver saída extra:

 

[+] 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

Abrir Trino CLI

Assim que isso estiver completo, você pode fazer login no nó coordenador do Trino. Faremos isso usando o comando exec e executar o executável CLI trino como o comando que executamos nesse contêiner. Observe que o ID do contêiner é trino-alluxio-iceberg-minio-trino-coordinator-1, então o comando que você executará é:

 

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

Ao iniciar este passo, você deve ver o cursor trino assim que a inicialização estiver completa. Quando estiver pronto, deve parecer com isto:

 
trino>

Para entender melhor como esta configuração funciona, vamos criar uma tabela Iceberg usando uma consulta CTAS (CREATE TABLE AS) que empurra dados de um dos conectores TPC para o Iceberg, apontando para o MinIO. Os conectores TPC geram dados em tempo real, permitindo que realizemos testes simples como este.

Primeiro, execute um comando para mostrar os catálogos e veja os catálogos tpch e iceberg, pois estes são os que usaremos na consulta CTAS:

 
SHOW CATALOGS;

Você deve perceber que o catálogo Iceberg está registrado.

Buckets MinIO e Esquemas Trino

Ao iniciar, o seguinte comando é executado em um contêiner de inicialização que inclui o CLI mc para o MinIO. Isso cria um bucket no MinIO chamado /alluxio, o que nos dá um local para escrever nossos dados e podemos informar ao Trino onde encontrá-lo:

 

/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;
"

Nota: Este bucket atuará como ponto de montagem para o Alluxio, portanto, o diretório do esquema alluxio://lakehouse/ no Alluxio será mapeado para s3://alluxio/lakehouse/.

Consultando o Trino

Vamos criar nosso SCHEMA que nos direciona ao bucket no MinIO e então executar nossa consulta CTAS. De volta ao terminal, crie o iceberg.lakehouse SCHEMA. Esta será a primeira chamada ao metastore para salvar a localização do esquema na namespace do Alluxio. Observe que precisaremos especificar o hostname alluxio-leader e a porta 19998 já que não configuramos o Alluxio como sistema de arquivos padrão. Tome isso em consideração se deseja que o cache do Alluxio seja usado por padrão e seja transparente para os usuários que gerenciam instruções DDL:

 

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

Agora que temos um SCHEMA que referencia o bucket onde armazenamos nossas tabelas no Alluxio, que sincroniza com o MinIO, podemos criar nossa primeira tabela.

Opcional: Para visualizar suas consultas em execução, faça login na IU do Trino e faça login usando qualquer nome de usuário (não importa já que não há segurança configurada).

Mova os dados do cliente do pequeno conjunto gerado de dados TPCH para o MinIO usando uma consulta CTAS. Execute a seguinte consulta e, se desejar, observe-a em execução na IU do Trino:

 

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

Vá para a IU do Alluxio e a IU do MinIO, e navegue pelos arquivos do Alluxio e MinIO. Você verá agora um diretório lakehouse que contém um diretório customer que contém os dados escritos pelo Trino para o Alluxio e o Alluxio escrevendo-os para o MinIO.

Agora, há uma tabela sob Alluxio e MinIO, você pode consultar esses dados verificando o seguinte:

 
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;

Como temos certeza de que o Trino está realmente lendo a partir de Alluxio e não de MinIO? Vamos deletar os dados em MinIO e executar a consulta novamente apenas para ter certeza. Uma vez que você delete esses dados, ainda deve ver dados retornando.

Parando Serviços

Uma vez que você complete este tutorial, os recursos utilizados para esta atividade podem ser liberados executando o seguinte comando:

 
docker-compose down

Conclusão

Neste ponto, você deve ter uma melhor compreensão do Trino e Alluxio, como começar com a implantação do Trino e Alluxio, e como usar o cacheamento de Alluxio com um conector Iceberg e armazenamento de arquivos MinIO. Espero que tenha gostado deste artigo. Não se esqueça de curtir este artigo e comentar se tiver alguma dúvida!

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