플랫폼을 운영하면서 실제로 플랫폼 환경을 구축해보고 싶어 쿠버네티스 상에서 데이터 파이프라인을 구축하려고 합니다.
원천 데이터 소스의 경우 환경을 먼저 구축한 뒤에 데이터를 배치하려고 합니다.
[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&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
'Cloud' 카테고리의 다른 글
AWS Certified Solutions Architect - Associate (SAA-C03) 합격 후기 (3) | 2024.02.12 |
---|---|
[GKE] Trino를 사용하여 MinIO에 저장된 데이터 쿼리하기(3) - Trino 설치 및 연동 (1) | 2024.01.11 |
[GKE] Trino를 사용하여 MinIO에 저장된 데이터 쿼리하기(1) - Hive Metastore MySQL로 구성 (1) | 2023.12.31 |
[GCP] GKE의 Apache Airflow에 minio 연동하기 (1) | 2023.11.19 |
[GCP] GKE에서 Prometheus와 Grafana로 클러스터 모니터링 구축하기 (0) | 2023.11.12 |