본문 바로가기

공부/MLOps

Docker로 생성한 데이터 베이스에 자동으로 데이터를 입력하는 과정 구성하기

사용한 데이터는 AI 허브에서 제공한 여행로그 데이터를 이용한다

사실 데이터 분석이나 자세한 내용을 올리고 싶었지만 저작권때문에 문제가 될만한 부분은 삭제하고 올립니다!

 

우선 제공하는 데이터 중 여행자 정보, 여행기간, 방문한 여행지 데이터를 이용

 

tn_visit_area_info_방문지정보_A.csv

tn_traveller_master_여행객_Master_A.csv

tn_travel_여행_A.csv

 

총 세개를 이용해 데이터를 구성

 

tabel_creation.py 파일을 실행해 필요한 테이블을 만들어줍니다. (.postgresql 컨테이너가 실행중이어야합니다)

import psycopg2
from dotenv import load_dotenv
import os

HOST_URL = os.environ.get('HOST_URL')
USERNAME = os.environ.get('POSTGRES_USER')
USERPASSWORD = os.environ.get('POSTGRES_PASSWORD')
DBNAME = os.environ.get('POSTGRES_DB')
PORT = os.environ.get('PORT')

db_connect = psycopg2.connect(
    user=USERNAME, 
    password=USERPASSWORD,
    host=HOST_URL,
    port=PORT,
    database=DBNAME,
)

def create_table(db_connect):
    create_table_query = """
    #여행자 정보 테이블
    CREATE TABLE IF NOT EXISTS traveller (
        id SERIAL PRIMARY KEY,
        """
        데이터 테이블
        """
    );
    #여행 정보
    CREATE TABLE IF NOT EXISTS travel (
        id SERIAL PRIMARY KEY,
        """
        데이터 테이블
        """
    );
   #저작권때매 지워진 테이블
    CREATE TABLE IF NOT EXISTS {저작권때매 지워진 테이블 이름} (
        id SERIAL PRIMARY KEY,
        """
        데이터 테이블
        """
    );
    #여행지 정보
    CREATE TABLE IF NOT EXISTS visit_area_info (
        id SERIAL PRIMARY KEY,
        TRAVEL_ID CHAR(9),
        """
        데이터 테이블
        """
    );
    """
    print("create_table_query")
    with db_connect.cursor() as cur:
        cur.execute(create_table_query)
        db_connect.commit()

 

 실행을 하고 테이블이 잘 생성되었는지 확인하셔야합니다.

 

확인하는 방법은 

 

docker exec -it {DB 서버 컨테이너 이름} /bin/bash

su postgres #user 변경(리눅스 명령어)

psql --username={DB 사용자 이름} --dbname={DB 이름}

\d # 데이터 베이스 확인

 

비밀~~~~~~~~~~~~~~~~~~~~~~~~

 

그리고 

파일이 3개라서 데이터를 입력하는 컨테이너를 2개로 구성했습니다

 

이유는 여행과 여행자 정보는 직접적으로 관련되어있고 

방문 여행지는 여행마다 여러곳일 수도 있어서 같이 입력하게하면 문제가 생길수도 있을것 같아서 따로 구성했습니다.

 

물론 직접 관련되어있다고해도 같이 컨테이너 구성했다가 오류가 생길 수 도 있으니

추후에 오류 수정 완료하고 확인해보겠습니다.

 

traveller_data_insertion.py # 여행자, 여행 정보

visitareainfo_data_insertion.py #방문지 정보

 

두개의 파일로 구성했습니다.

 

도커파일

traveller.Dockerfile

FROM amd64/python:3.9-slim

RUN apt-get update && apt-get install -y \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/app

RUN pip install -U pip &&\
    pip install pandas psycopg2-binary python-dotenv

COPY traveller_data_insertion.py traveller_data_insertion.py
COPY .env .env
COPY Data/ Data/


ENTRYPOINT ["python", "traveller_data_insertion.py"]

 

visitareainfo.Dockerfile

FROM amd64/python:3.9-slim

RUN apt-get update && apt-get install -y \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/app

RUN pip install -U pip &&\
    pip install pandas psycopg2-binary python-dotenv

COPY visitareainfo_data_insertion.py visitareainfo_data_insertion.py
COPY .env .env
COPY Data/ Data/


ENTRYPOINT ["python", "visitareainfo_data_insertion.py"]

 

docker-compose.yaml

version: '3'

services:
  postgres-server:
    env_file:
      - .env
    image: postgres:14.0
    container_name: postgres-server
    ports:
      - ${PORT}:${PORT}
    environment:
      POSTGRES_USER: "${POSTGRES_USER}"
      POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
      POSTGRES_DB: "${POSTGRES_DB}"
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-U", "${POSTGRES_USER}", "-d", "${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  tarveller-data-generator:
    build:
      context: .
      dockerfile: traveller.Dockerfile
    container_name: traveller-data-generator
    depends_on:
      postgres-server:
        condition: service_healthy
    command: ["postgres-server"]

  visitareainfo-data-generator:
    build:
      context: .
      dockerfile: visitareainfo.Dockerfile
    container_name: visitareainfo-data-generator
    depends_on:
      postgres-server:
        condition: service_healthy
    command: ["postgres-server"]

networks:
  default:
    name: mlops-network

여기서 DB서버에 healthcheck에 의존성을 추가해줬는데

 

그 이유는

데이터를 입력하는 코드가 실행되기 전에 DB 서버가 실행되어야하기 때문에 순서를 맞추기 위해 추가해줬습니다

 

그리고 그냥 실행하면

Is the server running on that host and accepting TCP/IP connections?

 

라는 오류가 나오는데 이때문에 networks를 추가해 두 컨테이너의 네트워크를 연결해주었습니다

 

그리고 연결했는데도 오류가 나는 경우가 있는데 이때

 

데이터를 입력하는 코드에서

 

load_dotenv()

HOST_URL = os.getenv('DB_CONTAINER_HOST')
USERNAME = os.getenv('POSTGRES_USER')
USERPASSWORD = os.getenv('POSTGRES_PASSWORD')
DBNAME = os.getenv('POSTGRES_DB')
PORT = os.getenv('PORT')

를 선언할때 HOST_URL 부분을 localhost가 아닌

docker-compose에서 선언한 DB 서버 이름인 postgres-server를 입력해 주어야합니다.

 

그리고 .env 파일을 이용할때 주의할점은 USERNAME이라는 변수를 사용하면

.env의 변수가 사용되는게 아니라 사용자 PC의 이름이 사용되니 .env에서 변수를 사용할때 주의하셔야합니다

 

POSTGRES_USER="username"
-> "username"

사용자 PC 이름: myComputer
USERNAME="username"
-> myComputer

이것 때문에 오류를 2시간 넘게 수정해도 안돼서 고생한....

 

만약 docker-compose의 세팅을 실행하기 전에 확인하고 싶다면 

docker-compose config

 

를 실행해보시면 .env의 변수를 잘 가져왔는지 확인할 수 있습니다.

 

다음에는 계속해서 데이터를 입력해보는것을 완료하고 추천 모델을 어떻게 구성할지 고민해보겠습니다.

'공부 > MLOps' 카테고리의 다른 글

추천 시스템을 위한 MLFlow 환경 구축하기  (0) 2024.07.07
Docker에 데이터베이스 서버 생성하기  (0) 2024.06.29
Docker 설치 하기  (0) 2024.06.29
MLops?  (0) 2024.06.26