융무의 기술블로그
article thumbnail

플랫폼을 운영하면서 실제로 플랫폼 환경을 구축해보고 싶어 쿠버네티스 상에서 데이터 파이프라인을 구축하려고 합니다.


[GKE] Trino를 사용하여 MinIO에 저장된 데이터 쿼리하기(1) - Hive Metastore MySQL로 구성
[GKE] Trino를 사용하여 MinIO에 저장된 데이터 쿼리하기(2) - Hive Metastore 배포
[GKE] Trino를 사용하여 MinIO에 저장된 데이터 쿼리하기(3) - Trino 설치 및 연동

1. Trino와 MinIO 설정

1.1. MinIO 설정

MinIO 클라이언트 초기 설정

  • MinIO 클라이언트(mc)를 사용해 MinIO 서비스에 접속합니다.
<bash />
kubectl port-forward pod/minio 9000 9090 -n minio-dev ./mc alias set k8s-minio-dev http://127.0.0.1:9000 minioadmin minioadmin ./mc ls k8s-minio-dev/trino

trino 버킷에 있는 nyc_data.csv 파일을 trino에서 읽어드리려고 합니다.

 

MinIO 네트워크 정책 설정

  • MinIO 서비스가 Trino 서비스에 접근할 수 있도록 네트워크 정책을 설정합니다. 즉 minio-dev 네임스페이스의 MinIO 서비스가 hive 네임스페이스의 Trino 서비스에 접근할 수 있도록 하는 네트워크 정책입니다.(minio-to-trino-networkpolicy.yaml)
<bash />
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-minio-to-trino namespace: minio-dev spec: podSelector: matchLabels: app: minio policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: name: hive egress: - to: - namespaceSelector: matchLabels: name: hive

네트워크 정책 적용

  • 위에서 작성한 네트워크 정책 파일을 적용합니다.
<bash />
kubectl apply -f minio-to-trino-networkpolicy.yaml

네트워크 정책 확인

  • 새로운 네트워크 정책이 정상적으로 적용되었는지 확인합니다.
<bash />
kubectl get networkpolicies --namespace minio-dev NAME POD-SELECTOR AGE allow-minio-to-trino app=minio 23s
  • minio-dev 네임스페이스의 MinIO 서비스와 hive 네임스페이스의 Trino 서비스 간의 네트워크 통신이 가능해집니다.

1.2. Trino 설치 및 설정

Trino Helm 차트 리포지토리를 추가합니다.

<bash />
helm repo add trino https://trinodb.github.io/charts

Trino 차트를 다운로드합니다.

<bash />
mkdir trino-minio helm repo add trino https://trinodb.github.io/charts helm pull trino/trino tar xvf trino-0.13.0.tgz cd trino/

values.yaml 파일을 수정하여 Trino의 설정을 조정합니다. MinIO와의 연동을 위해 additionalCatalogs 섹션에서 MinIO 카탈로그를 정의합니다.

<bash />
additionalCatalogs: minio: |- connector.name=hive hive.metastore.uri=thrift://metastore:9083 hive.s3.endpoint=http://minio-service.minio-dev.svc.cluster.local:9000 hive.s3.aws-access-key=minioadmin hive.s3.aws-secret-key=minioadmin hive.s3.path-style-access=true

Trino 리소스 할당량을 조정합니다.

<bash />
coordinator: resources: requests: memory: "2Gi" cpu: "500m" limits: memory: "4Gi" cpu: "1000m" worker: resources: requests: memory: "2Gi" cpu: "500m" limits: memory: "4Gi" cpu: "1000m"

Helm을 사용하여 Trino를 설치합니다.

<bash />
helm install trino . -f values.yaml -n hive

2. Trino로 MinIO 데이터 쿼리하기

Trino CLI에 접속하여 MinIO 카탈로그를 확인합니다.

<bash />
export POD_NAME=$(kubectl get pods --namespace hive -l "app=trino,release=trino,component=coordinator" -o jsonpath="{.items[0].metadata.name}") kubectl exec -it $POD_NAME -n hive -- trino trino> SHOW CATALOGS; Catalog --------- minio system tpcds tpch (4 rows) Query 20231219_071108_00000_7zusv, FINISHED, 2 nodes Splits: 8 total, 8 done (100.00%) 11.91 [0 rows, 0B] [0 rows/s, 0B/s]

MinIO의 스키마를 확인합니다.

<bash />
trino> SHOW SCHEMAS FROM minio; Schema -------------------- default information_schema (2 rows)

l0 스키마를 만듭니다.

<bash />
trino> CREATE SCHEMA minio.l0 -> WITH ( -> location = 's3a://trino/' -> ); -> CREATE SCHEMA

trino 버킷 주소를 가져와서 테이블을 만듭니다.

<bash />
trino> CREATE TABLE IF NOT EXISTS minio.l0.nyc_data ( -> VendorID varchar, -> passenger_count varchar, -> trip_distance varchar -> ) -> WITH ( -> external_location = 's3a://trino/', -> format = 'CSV' -> ); CREATE TABLE

minio의 버킷에서 불러온 데이터를 질의합니다.

<bash />
trino> SELECT * FROM minio.test.nyc_data;

trino UI 실행되는 각 쿼리에 대한 세부 정보도 제공합니다. 리소스 활용도, 타임라인, 단계, 작업자가 수행한 작업 등의 세부 정보를 확인할 수 있습니다.

<bash />
kubectl port-forward $POD_NAME 8080:8080 -n hive

profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!