트리노와 알루시오로 5분 안에 시작하기

Trino는 오픈 소스 분산 시스템 SQL 쿼리 엔진으로, 하나 이상의 이질적인 데이터 소스에 분산된 대량의 데이터 세트를 쿼리하도록 설계되었습니다. Trino는 많은 양의 데이터를 처리하고 보고서를 생성하여 데이터 货파우함, ETL, 대화형 분석을 수행하도록 설계되었습니다. 

Alluxio는 대규모 분석 및 AI를 위한 오픈 소스 데이터 오케스트레이션 플랫폼입니다. Alluxio는 Trino 및 Apache Spark와 같은 계산 프레임워크와 Amazon S3, Google Cloud Storage, HDFS, MinIO와 같은 다양한 스토리지 시스템 사이에 위치합니다. 

이것은 Trino용 Iceberg 커넥터를 사용하여 Alluxio를 캐싱 계층으로 배포하는 방법에 대한 튜토리얼입니다.

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는 Hive 커넥터에 Rubix라는 내장 캐싱 엔진을 가지고 있습니다. 이 시스템은 Trino와 함께 제공되므로 편리하지만 2020년부터 유지 보수되지 않았으며 보안 기능 및 추가 계산 엔진 지원이 부족합니다.

Alluxio의 Trino

Alluxio는 Trino를 다양한 스토리지 시스템에 연결하고 데이터 기반 애플리케이션에 대한 API 및 통합 네임스페이스를 제공합니다. Alluxio를 사용하면 데이터 소스에 관계없이 데이터에 액세스하고 자주 액세스되는 데이터(일반적으로 사용되는 테이블 등)를 Alluxio 분산 스토리지에 투명하게 캐싱할 수 있습니다.

MinIO 파일 스토리지를 통한 Iceberg 커넥터를 사용하여 Alluxio 캐싱 사용

우리는 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에 함께 유지하기 위해, ALLUXIO_JAVA_OPTS 환경 변수를 통해 Java 속성을 사용하여 설정하고 있습니다. 이 튜토리얼에서는 마스터 노드를 리더로, 작업자를 팔로워로 언급합니다.

마스터 구성

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

리더는 1999819999 포트를 노출하며, 후자는 웹 UI용 포트입니다.

작업자 구성

 

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

팔로워는 2999930000 포트를 노출하고, Alluxio가 데이터를 저장하는 데 사용하는 공유 메모리를 설정합니다. 이는 shm_size 속성을 통해 1G로 설정되며, 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는 모든 노드, 리더 및 팔로워에 설정되어야 합니다. 대부분의 공유 설정은 이 경우 MinIO인 underfs를 가리키도록 Alluxio를 지정합니다.

alluxio.security.authorization.permission.enabled는 Docker 설정을 간단하게 유지하기 위해 “false”로 설정되어 있습니다.

참고: 이러한 작업은 프로덕션 또는 CI/CD 환경에서 권장되지 않습니다.

서비스 실행

먼저 서비스를 시작해야 합니다. trino-getting-started/iceberg/trino-alluxio-iceberg-minio 디렉토리에 있는지 확인하세요. 다음 명령어를 실행하세요:

 
docker-compose up -d

다음과 같은 출력을 기대할 수 있습니다. Docker는 “Created/Started” 메시지를 보여주기 전에 Docker 이미지를 다운로드해야 할 수도 있으므로 추가 출력이 있을 수 있습니다:

 

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

Trino CLI 열기

이 작업이 완료되면 Trino 코디네이터 노드에 로그인할 수 있습니다. exec 명령을 사용하여 trino CLI 실행 파일을 해당 컨테이너에서 실행할 명령으로 사용합니다. 컨테이너 ID가 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>

이 구성이 어떻게 작동하는지 가장 잘 이해하기 위해, TPC 커넥터의 데이터를 푸시하여 Iceberg에 테이블을 생성하는 CTAS (CREATE TABLE AS) 쿼리를 사용하여 Iceberg을 MinIO에 가리키도록 합니다. TPC 커넥터는 데이터를 동적으로 생성하므로 이와 같은 간단한 테스트를 실행할 수 있습니다.

먼저, CTAS 쿼리에서 사용할 tpchiceberg 카탈로그를 보려면 카탈로그를 표시하는 명령을 실행하세요:

 
SHOW CATALOGS;

Iceberg 카탈로그가 등록되었음을 확인해야 합니다.

MinIO 버킷 및 Trino 스키마

시작 시, mc CLI for MinIO를 포함하는 intiailization 컨테이너에서 다음 명령이 실행됩니다. 이 명령은 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의 스키마 디렉토리 alluxio://lakehouse/s3://alluxio/lakehouse/에 매핑됩니다.

Trino 쿼리

이제 MinIO의 버킷을 가리키는 SCHEMA를 생성한 후 CTAS 쿼리를 실행해 보겠습니다. 터미널로 돌아가서 iceberg.lakehouse SCHEMA를 생성하세요. 이는 스키마 위치를 Alluxio 네임스페이스에 저장하기 위해 메타스토어에 대한 첫 번째 호출이 될 것입니다. 기본 파일 시스템으로 Alluxio를 설정하지 않았기 때문에 호스트명 alluxio-leader와 포트 19998를 지정해야 함에 유의하세요. Alluxio 캐싱을 기본적으로 사용하고 DDL 문을 관리하는 사용자에게 투명하게 적용하려는 경우 이를 고려하세요.

 

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

이제 Alluxio에서 테이블을 저장하는 버킷을 참조하는 SCHEMA가 있으며, 이는 MinIO와 동기화되므로 첫 번째 테이블을 생성할 수 있습니다.

선택: 쿼리 실행을 보려면 Trino UI에 로그인하고 보안이 설정되지 않았으므로 어떤 사용자명을 사용하든 관계없이 로그인하세요.

생성된 작은 TPCH 데이터에서 고객 데이터를 CTAS 쿼리를 사용하여 MinIO로 이동합니다. 다음 쿼리를 실행하고 Trino UI에서 실행 중인 것을 보고 싶다면 지켜보세요.

 

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

Alluxio UIMinIO UI로 이동하여 Alluxio와 MinIO 파일을 찾아보세요. 이제 Trino가 Alluxio에 쓴 데이터와 Alluxio가 MinIO에 쓴 데이터를 포함하는 lakehouse 디렉토리와 customer 디렉토리를 볼 수 있습니다.

현재 Alluxio와 MinIO 아래에 테이블이 있으며, 다음을 확인하여 이 데이터를 쿼리할 수 있습니다:

 
SELECT * FROM iceberg.lakehouse.customer LIMIT 10;

Trino가 실제로 Alluxio에서 읽고 있는지 아니면 MinIO에서 읽고 있는지 어떻게 확신할 수 있나요? MinIO의 데이터를 삭제하고 다시 쿼리를 실행해 보겠습니다. MinIO의 데이터를 삭제한 후에도 데이터가 반환되어야 합니다.

서비스 중지

이 튜토리얼을 완료한 후, 이 연습에 사용된 리소스를 다음 명령어를 실행하여 해제할 수 있습니다:

 
docker-compose down

결론

이 시점에서 Trino와 Alluxio에 대한 이해가 더 깊어졌으며, Trino와 Alluxio를 배포하는 시작 방법, 그리고 Iceberg 커넥터와 MinIO 파일 스토리지에 Alluxio 캐싱을 사용하는 방법에 대해 알게 되었을 것입니다. 이 글을 즐겼기를 바랍니다. 이 글을 좋아요 누르고 질문이 있으면 댓글을 남겨주세요!

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