융무의 기술블로그
article thumbnail

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

원천 데이터 소스의 경우 환경을 먼저 구축한 뒤에 데이터를 배치하려고 합니다. 


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

1. Dockerfile 생성

Hive Metastore를 실행하기 위한 Docker 이미지를 만들기 위한 Dockerfile을 작성합니다.

<bash />
FROM openjdk:11-slim ARG HADOOP_VERSION=3.2.1 RUN apt-get update && apt-get install -y curl --no-install-recommends && \ rm -rf /var/lib/apt/lists/* RUN curl https://archive.apache.org/dist/hadoop/common/hadoop-$HADOOP_VERSION/hadoop-$HADOOP_VERSION.tar.gz \ | tar xvz -C /opt/ \ && ln -s /opt/hadoop-$HADOOP_VERSION /opt/hadoop \ && rm -r /opt/hadoop/share/doc RUN ln -s /opt/hadoop/share/hadoop/tools/lib/hadoop-aws* /opt/hadoop/share/hadoop/common/lib/ && \ ln -s /opt/hadoop/share/hadoop/tools/lib/aws-java-sdk* /opt/hadoop/share/hadoop/common/lib/ ENV HADOOP_HOME="/opt/hadoop" ENV PATH="/opt/spark/bin:/opt/hadoop/bin:${PATH}" RUN curl https://repo1.maven.org/maven2/org/apache/hive/hive-standalone-metastore/3.1.2/hive-standalone-metastore-3.1.2-bin.tar.gz \ | tar xvz -C /opt/ \ && ln -s /opt/apache-hive-metastore-3.1.2-bin /opt/hive-metastore RUN curl -L https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/mysql-connector-j-8.0.33.jar \ -o /opt/mysql-connector-j-8.0.33.jar \ && ln -s /opt/mysql-connector-j-8.0.33.jar /opt/hadoop/share/hadoop/common/lib/ \ && ln -s /opt/mysql-connector-j-8.0.33.jar /opt/hive-metastore/lib/ RUN rm /opt/hive-metastore/lib/guava-19.0.jar && \ ls -lah /opt/hadoop/share/hadoop/common/lib/ && \ cp /opt/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive-metastore/lib/ && \ cp /opt/hadoop/share/hadoop/tools/lib/hadoop-aws-3.2.1.jar /opt/hive-metastore/lib/ && \ cp /opt/hadoop/share/hadoop/tools/lib/aws-java-sdk-bundle-1.11.375.jar /opt/hive-metastore/lib/ CMD ["/opt/hive-metastore/bin/start-metastore"]

2. Docker 배포

Dockerfile을 사용하여 Hive Metastore 이미지를 빌드하고, 이를 Docker Hub 또는 Google Container Registry에 푸시합니다.

로컬 Docker 환경 또는 Kubernetes 클러스터에서 이미지를 실행합니다.

Docker 이미지 빌드

<bash />
docker build -t hive-metastore .

Docker 이미지 푸시

<bash />
docker push hive-metastore

Docker 컨테이너 실행

<bash />
docker run -d -p 9083:9083 hive-metastore

로컬에서 빌드한 Docker 이미지를 GCR에 업로드할 수 있습니다.

Docker 이미지 빌드

<bash />
docker build -t gcr.io/ggke-401900/hive-metastore .

Docker 이미지 푸시

<bash />
docker push gcr.io/ggke-401900/hive-metastore

3. metastore 설정 

metastore.xml은 Hive 메타스토어 서비스에 대한 중요한 설정을 포함하는 XML 파일입니다. 이 파일은 Hive 메타스토어가 어떻게 데이터베이스와 연결되고, 어떤 드라이버를 사용하는지 추가적인 설정 옵션들을 정의합니다.

<bash />
kubectl create configmap metastore-cfg --from-file=metastore.xml -n hive
  • metastore.xml은 다음과 같습니다.
<bash />
<configuration> <property> <name>metastore.thrift.uris</name> <value>thrift://localhost:9083</value> <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description> </property> <property> <name>metastore.task.threads.always</name> <value>org.apache.hadoop.hive.metastore.events.EventCleanerTask</value> </property> <property> <name>metastore.expression.proxy</name> <value>org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://mysql.mysql.svc.cluster.local:3306/test?createdatabaseifnotexist=true&amp;useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>mjs</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>1234</value> </property> <property> <name>fs.s3a.server-side-encryption-algorithm</name> <value>AES256</value> </property> <property> <name>fs.s3a.endpoint</name> <value>http://minio-service.minio-dev.svc.cluster.local:9000</value> </property> <property> <name>fs.s3a.access.key</name> <value>minioadmin</value> </property> <property> <name>fs.s3a.secret.key</name> <value>minioadmin</value> </property> <property> <name>fs.s3a.path.style.access</name> <value>true</value> </property> <property> <name>fs.s3a.impl</name> <value>org.apache.hadoop.fs.s3a.S3AFileSystem</value> </property> </configuration>

Hive Metastore 초기화 (hive-initschema.yaml)

  • Hive Metastore 스키마 초기화를 위한 Kubernetes Job을 정의합니다.
  • MySQL 데이터베이스에 연결하여 필요한 스키마를 생성합니다.
<bash />
apiVersion: batch/v1 kind: Job metadata: name: hive-initschema namespace: hive spec: template: spec: containers: - name: hivemeta image: gcr.io/ggke-401900/hive-metastore command: ["/opt/hive-metastore/bin/schematool"] args: ["--verbose", "-initSchema", "-dbType", "mysql", "-userName", "mjs", "-passWord", "1234", "-url", "jdbc:mysql://mysql.mysql.svc.cluster.local:3306/test?useSSL=false"] restartPolicy: Never backoffLimit: 4

yaml 파일을 적용합니다.

<bash />
kubectl apply -f hive-initschema.yaml

Metastore 배포 (meta.yaml)

  • Hive Metastore 서비스를 위한 Kubernetes Deployment와 Service를 정의합니다.
  • 이 설정은 Trino가 Hive Metastore와 통신할 수 있도록 합니다.
<bash />
apiVersion: apps/v1 kind: Deployment metadata: name: metastore namespace: hive spec: selector: matchLabels: app: metastore strategy: type: Recreate template: metadata: labels: app: metastore spec: containers: - name: metastore image: gcr.io/ggke-401900/hive-metastore ports: - containerPort: 9083 volumeMounts: - name: metastore-cfg-vol mountPath: /opt/hive-metastore/conf/metastore-site.xml subPath: metastore.xml command: ["/opt/hive-metastore/bin/start-metastore"] args: ["-p", "9083"] resources: requests: memory: "2Gi" cpu: "1" imagePullPolicy: Always volumes: - name: metastore-cfg-vol configMap: name: metastore-cfg --- apiVersion: v1 kind: Service metadata: name: metastore namespace: hive spec: ports: - port: 9083 targetPort: 9083 selector: app: metastore

yaml 파일을 적용합니다.

<bash />
kubectl apply -f meta.yaml

mysql에 접속하여 metastore와 관련된 테이블들을 확인해 봅니다.

<bash />
mysql> SHOW databases; +--------------------+ | Database | +--------------------+ | information_schema | | my_database | | mysql | | performance_schema | | sys | | test | +--------------------+ 6 rows in set (0.00 sec) mysql> USE test; Database changed mysql> SHOW TABLES; +-------------------------------+ | Tables_in_test | +-------------------------------+ | AUX_TABLE | | BUCKETING_COLS | | CDS | | COLUMNS_V2 | | COMPACTION_QUEUE | | COMPLETED_COMPACTIONS | | COMPLETED_TXN_COMPONENTS | | CTLGS | | DATABASE_PARAMS | | DBS | | DB_PRIVS | | DELEGATION_TOKENS | | FUNCS | | FUNC_RU | | GLOBAL_PRIVS | | HIVE_LOCKS | | IDXS | | INDEX_PARAMS | | I_SCHEMA | | KEY_CONSTRAINTS | | MASTER_KEYS | | MATERIALIZATION_REBUILD_LOCKS | | METASTORE_DB_PROPERTIES | | MIN_HISTORY_LEVEL | | MV_CREATION_METADATA | | MV_TABLES_USED | | NEXT_COMPACTION_QUEUE_ID | | NEXT_LOCK_ID | | NEXT_TXN_ID | | NEXT_WRITE_ID | | NOTIFICATION_LOG | | NOTIFICATION_SEQUENCE | | NUCLEUS_TABLES | | PARTITIONS | | PARTITION_EVENTS | | PARTITION_KEYS | | PARTITION_KEY_VALS | | PARTITION_PARAMS | | PART_COL_PRIVS | | PART_COL_STATS | | PART_PRIVS | | REPL_TXN_MAP | | ROLES | | ROLE_MAP | | RUNTIME_STATS | | SCHEMA_VERSION | | SDS | | SD_PARAMS | | SEQUENCE_TABLE | | SERDES | | SERDE_PARAMS | | SKEWED_COL_NAMES | | SKEWED_COL_VALUE_LOC_MAP | | SKEWED_STRING_LIST | | SKEWED_STRING_LIST_VALUES | | SKEWED_VALUES | | SORT_COLS | | TABLE_PARAMS | | TAB_COL_STATS | | TBLS | | TBL_COL_PRIVS | | TBL_PRIVS | | TXNS | | TXN_COMPONENTS | | TXN_TO_WRITE_ID | | TYPES | | TYPE_FIELDS | | VERSION | | WM_MAPPING | | WM_POOL | | WM_POOL_TO_TRIGGER | | WM_RESOURCEPLAN | | WM_TRIGGER | | WRITE_SET | +-------------------------------+ 74 rows in set (0.00 sec)

Hive 관련 리소스가 올바르게 실행되고 있는지 확인합니다.

<bash />
mun_js@cloudshell:~ (ggke-401900)$ kubectl get all -n hive NAME READY STATUS RESTARTS AGE pod/hive-initschema-xd7ct 0/1 Completed 0 3d19h pod/metastore-78d4687f85-kqgm6 1/1 Running 0 3d20h pod/trino-coordinator-5bcbbcddf4-j2bml 1/1 Running 1 (3d1h ago) 3d2h pod/trino-worker-656f6c48cd-f5tfc 1/1 Running 0 89m pod/trino-worker-656f6c48cd-mkkd4 1/1 Running 0 12m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/metastore ClusterIP 10.52.7.186 <none> 9083/TCP 3d20h service/trino ClusterIP 10.52.13.135 <none> 8080/TCP 3d19h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/metastore 1/1 1 1 3d20h deployment.apps/trino-coordinator 1/1 1 1 3d19h deployment.apps/trino-worker 2/2 2 2 3d19h NAME DESIRED CURRENT READY AGE replicaset.apps/metastore-78d4687f85 1 1 1 3d20h replicaset.apps/trino-coordinator-5bcbbcddf4 1 1 1 3d2h replicaset.apps/trino-coordinator-5f47dffc99 0 0 0 3d19h replicaset.apps/trino-worker-656f6c48cd 2 2 2 3d2h replicaset.apps/trino-worker-6f5fc48987 0 0 0 3d19h NAME COMPLETIONS DURATION AGE job.batch/hive-initschema 1/1 47s 3d19h

 

profile

융무의 기술블로그

@융무

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