융무의 기술블로그
article thumbnail

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

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


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

Dockerfile 생성

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

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"]

Docker 배포

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

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

Docker 이미지 빌드

docker build -t hive-metastore .

Docker 이미지 푸시

docker push hive-metastore

Docker 컨테이너 실행

docker run -d -p 9083:9083 hive-metastore

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

Docker 이미지 빌드

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

Docker 이미지 푸시

docker push gcr.io/ggke-401900/hive-metastore

metastore 설정 

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

kubectl create configmap metastore-cfg --from-file=metastore.xml -n hive
  • metastore.xml은 다음과 같습니다.
<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 데이터베이스에 연결하여 필요한 스키마를 생성합니다.
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 파일을 적용합니다.

kubectl apply -f hive-initschema.yaml

Metastore 배포 (meta.yaml)

  • Hive Metastore 서비스를 위한 Kubernetes Deployment와 Service를 정의합니다.
  • 이 설정은 Trino가 Hive Metastore와 통신할 수 있도록 합니다.
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 파일을 적용합니다.

kubectl apply -f meta.yaml

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

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 관련 리소스가 올바르게 실행되고 있는지 확인합니다.

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

융무의 기술블로그

@융무

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