반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Ethan's Values

MLOps Engineering(5) - docker-compose up 시 테이블 자동 생성 본문

MLOps

MLOps Engineering(5) - docker-compose up 시 테이블 자동 생성

Ethan_hyk 2024. 3. 22. 16:46
반응형

시작

큰 목록은 아래와 같이 진행됩니다. 아직 0.환경세팅 부분입니다. 이전 글과 이어집니다.

0. 환경세팅
1. 테이블에 데이터 삽입을 위한 DAG
2. 모델링 수행을 위한 스케쥴링 DAG

이전 글

https://hykethan.tistory.com/41

 

MLOps Engineering(4) - Airflow compose-yaml 파일로 개발환경구성및 Airflow 스케쥴링 DAG 생성 개요

시작 MLOps Engineering1,2에서 작성한 내용을 기반으로 다음의 내용을 Airflow로 스케쥴링 하는 작업을 수행했습니다. 순서는 아래와 같이 진행됩니다. 0. 환경세팅 1. 테이블에 데이터 삽입을 위한 DAG 2

hykethan.tistory.com

 

 

참고 깃헙 docs

https://mlops-for-mle.github.io/tutorial/docs/intro

 

00. Introduction | ML Engineer를 위한 MLOps

Introduction

mlops-for-mle.github.io

 

이제 6번 docker compose 수행 시 테이블 생성하는 부분의 환경세팅을 하겠습니다.

1. docker 설치
2. airflow docker-compose.yaml 파일 다운
3. Initializing Environment(에어플로우 유저 권한 셋팅)
4. 도커 컨테이너 띄우기
5, Webserver 접속하기(IP:8080 테스트)
6. 컨테이너 띄울 때 테이블 자동 생성 
 6.5 테이블 생성하는 sql 문 스크립트 작성 후 chmod 755 [sql 파일이름] 으로 실행 권한 부여
 6.6 docker-compose.yaml 파일 수정
     - postgres의 volume부분의 추가
     ./:/docker-entrypoint-initdb.d/
7. docker compose up 
8. docker exec -it 컨테이너ID /bin/bash 로 컨테이너 접속
9. psql로 DB 접속 후 생성된 테이블 확인

 

 

6. 컨테이너 띄울 때 테이블 자동 생성

구현 프로세스는 다음과 같습니다. 저는 sklearn.dataset에 있는 iris_data로 샘플을 설정할거기 때문에 거기에 맞는 iris_data 테이블을 생성하는 쿼리문을 작성하여 docker compose up 실행 시 해당 쿼리문 파일을 실행하여 테이블을 자동으로 생성하는 방법입니다.

(**항상 yaml 파일 수정 시 docker compose down 후 수정하고 다시 up 해야합니다.)

 

6.1. 볼륨 마운트 될 폴더 생성 및 테이블 생성 쿼리문 작성 저장

#리눅스 command

#sql 이름의 폴더 생성(이름 상관없습니다.)
~$ mkdir sql
~$ ls
config dags docker-compose.yaml logs plugins sql

#sql 폴더로 이동
cd sql

#init.sql 파일 작성 및 저장(테이블 생성 파일)

#init.sql 파일 내용
CREATE TABLE IF NOT EXISTS iris_data (
	id SERIAL PRIMARY KEY,
    timestamp timestamp,
    sepal_length float8,
    sepal_width float8,
    petal_length float8,
    petal_width float8,
    target int
);

#확인
~/sql$ ls
init.sql

 

 

6.2. Airflow postgres DB 사용 및 볼륨 마운트 설정

docker-compose.yaml 파일의 postgres DB 컨테이너에 volume 부분의 옵션을 한개 더 추가하여 컨테이너 안에서 sql 파일을 바로 실행할 수 있게끔 설정, 그리고 yaml파일의 가장 하단 부분에 postgres-db-volume: 만 있을 텐데, 파일이름인 init.sql 파일에 대한 볼륨을 잡을 수 있도록 추가해줍니다.

#docker-compose.yaml 파일 안의 내용 수정

services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres-db-volume:/var/lib/postgresql/data
      - ./sql:/docker-entrypoint-initdb.d/


#yaml파일의 가장 하단부분 init.sql: 문구 추가로 넣어주기
 volumes:
  postgres-db-volume:
  init.sql:

 

6.3. sql 파일 실행 권한 부여

# chmod 755 [sql 파일이름]
~$ chmod 755 init.sql

# 권한 설정 완료 확인
~/sql$ ls -al
total 12
-rwxr-xr-x  1 wesleyquest04 wesleyquest04  204 Mar 22 04:35 init.sql

 

6.4. 현재 있는 볼륨 지우기

이전에 docker compose up을 통해 airflow의 postgres에 대한 DB volume이 이미 생성되어있어서 airflow 컨테이너 띄울 때 postgres db 만드는 작업을 skip 하게 된다.(Skipping a task in airflow) 그래서 6.3 까지 진행 후 docker compose up 으로 컨테이너 띄워도 iris_data 테이블이 생성되지 않는다.

#airflow postgres db 컨테이너 id 확인
~$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                    PORTS                                       NAMES
9fa75b789360   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   11 minutes ago   Up 10 minutes (healthy)   8080/tcp                                    wesleyquest04-airflow-scheduler-1
24ba4632282d   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   11 minutes ago   Up 10 minutes (healthy)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   wesleyquest04-airflow-webserver-1
ae8c8ab2b188   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   11 minutes ago   Up 10 minutes (healthy)   8080/tcp                                    wesleyquest04-airflow-triggerer-1
f6270d277a08   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   11 minutes ago   Up 10 minutes (healthy)   8080/tcp                                    wesleyquest04-airflow-worker-1
ff876db3c6a0   postgres:13            "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes (healthy)   5432/tcp                                    wesleyquest04-postgres-1
d4d2b47c0de9   redis:latest           "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes (healthy)   6379/tcp                                    wesleyquest04-redis-1

#airflow postgres db 로그 확인
~$ docker container logs ff876db3c6a0
PostgreSQL Database directory appears to contain a database; Skipping initialization

 

따라서 아래와 같이 진행하여 볼륨을 지운다.

#docker 볼륨 확인
~$ docker volume ls
DRIVER    VOLUME NAME
local     7d2ba3ffd5032b7dbd4484aa24ff16e19ae9c1a26b93d4e7b0c4e2ac0ced279c
local     81da8420c3d27c595565d38c23360ee8eb39d01b705a48817226c34f5a6b13fe
local     b2fd1d9fab8bd2a949727ebb9095292aa4ed3fd54394b2ac1a77189219b21fc3
local     b6cd9f554158b1d26c91bdfab519b58b71af7f253c3007e0c79494d3a3c27d3b
local     wesleyquest04_postgres-db-volume

#볼륨 지우기 중간에 y 입력
~$ docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
7d2ba3ffd5032b7dbd4484aa24ff16e19ae9c1a26b93d4e7b0c4e2ac0ced279c
81da8420c3d27c595565d38c23360ee8eb39d01b705a48817226c34f5a6b13fe
b2fd1d9fab8bd2a949727ebb9095292aa4ed3fd54394b2ac1a77189219b21fc3
b6cd9f554158b1d26c91bdfab519b58b71af7f253c3007e0c79494d3a3c27d3b

Total reclaimed space: 580B

#다시 볼륨 확인
~$ docker volume ls
DRIVER    VOLUME NAME
local     wesleyquest04_postgres-db-volume

#볼륨 강제 삭제
~$ docker volume rm wesleyquest04_postgres-db-volume
wesleyquest04_postgres-db-volume

#다시 볼륨 확인
~$ docker volume ls
DRIVER    VOLUME NAME

 

이후 docker compose up -d 명령어로 docker 컨테이너 올립니다.

 

6.5. docker exec -it 컨테이너ID /bin/bash 로 컨테이너 접속

주의 사항은 컨테이너ID 입력 후 꼭 한칸 띄우고 /bin/bash 입력

#컨테이너 리스트 확인
~$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                             PORTS                                       NAMES
f548410ff118   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   47 seconds ago   Up 12 seconds (health: starting)   8080/tcp                                    wesleyquest04-airflow-triggerer-1
ed34d7506615   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   47 seconds ago   Up 12 seconds (health: starting)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   wesleyquest04-airflow-webserver-1
76014ce92979   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   47 seconds ago   Up 12 seconds (health: starting)   8080/tcp                                    wesleyquest04-airflow-scheduler-1
1f64d754de33   apache/airflow:2.8.3   "/usr/bin/dumb-init …"   47 seconds ago   Up 12 seconds (health: starting)   8080/tcp                                    wesleyquest04-airflow-worker-1
0880d28d5df2   postgres:13            "docker-entrypoint.s…"   47 seconds ago   Up 46 seconds (healthy)            5432/tcp                                    wesleyquest04-postgres-1
b960a9b34516   redis:latest           "docker-entrypoint.s…"   47 seconds ago   Up 46 seconds (healthy)            6379/tcp                                    wesleyquest04-redis-1

# airflow의 postgres db 컨테이너 접속
~$ docker exec -it 0880d28d5df2 /bin/bash
root@0880d28d5df2:/#

 

 

6.6. psql로 DB 접속 후 생성된 테이블 확인

#  db 접속 포맷 PGPASSWORD=[postgres비밀번호] psql -p [포트번호] -U [유저이름]

root@0880d28d5df2:/# PGPASSWORD=airflow psql -p 5432 -U airflow
psql (13.14 (Debian 13.14-1.pgdg120+2))
Type "help" for help.

airflow=#

#테이블 확인 명령어
airflow=#\dt

                     List of relations
 Schema |              Name              | Type  |  Owner  
 public | iris_data                      | table | airflow

 

Comments