융무의 기술블로그
article thumbnail

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


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

Trino와 MinIO 설정

MinIO 설정

MinIO 클라이언트 초기 설정

  • MinIO 클라이언트(mc)를 사용해 MinIO 서비스에 접속합니다.
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)
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

네트워크 정책 적용

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

네트워크 정책 확인

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

Trino 설치 및 설정

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

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

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

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 카탈로그를 정의합니다.

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 리소스 할당량을 조정합니다.

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를 설치합니다.

helm install trino . -f values.yaml -n hive

Trino로 MinIO 데이터 쿼리하기

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

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의 스키마를 확인합니다.

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

l0 스키마를 만듭니다.

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

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

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의 버킷에서 불러온 데이터를 질의합니다.

trino> SELECT * FROM minio.test.nyc_data;

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

kubectl port-forward $POD_NAME 8080:8080 -n hive

profile

융무의 기술블로그

@융무

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