데브코스에서 진행한 강의에 docker compose에 대한 자세한 내용을 작성해두었으니 참고하시면 좋을 것 같습니다.

이번 포스팅에서는 data engineering zoomcamp에서 진행한 간단한 docker compose 파일을 작성하는 과정을 다룹니다.

 

docker compose 파일 생성하기

우선 docker-compose.yml 파일을 생성하고 안에 다음과 같이 틀을 잡았다.

services:
  pgdatabase:
    image: postgres:13
    

  pgadmin:
    image: dpage/pgadmin4

 

우선 만들고자하는 컨테이너별로 이미지를 할당했다. database는 postgre:13으로, pgadmin은 pgadmin4를 사용!

 

컨테이너 정보 입력하기

컨테이너에서 필요로하는 기본 정보들을 입력한다.

  • environment: 각 컨테이너의 환경 변수들을 설정
  • volumes: 볼륨을 설정해준다. ":rw" 라는 새로운 값이 들어가있는데 read write 권한을 준다는 의미이다.
  • ports: 내부와 외부 포트를 맵핑해준다. 로컬에서 docker 내부의 해당 포트 접근이 가능해진다.
services:
  pgdatabase:
    image: postgres:13
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=ny_taxi
    volumes:
      - "./ny_taxi_postgres_data:/var/lib/postgresql/data:rw" # read write
    ports:
      - "5432:5432"

  pgadmin:
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@admin.com
      - PGADMIN_DEFAULT_PASSWORD=root 
    ports:
      - "8080:80"

 

실행 & 결과

docker compose up 명령으로 실행해주면 다음과 같이 두개의 컨테이너가 올라온다.

 

네트워크 이름을 명시하지 않아도 둘은 같은 네트워크에 묶여있다!

 

pgAdmin에 접속하면 정상적으로 db에 연결된 것을 볼 수 있다.


전체 코드는 Github에 업로드 하였습니다.

https://github.com/poriz/data-engineering-zoomcamp-poriz/tree/main/01-docker-terraform/introduce_to_docker

'Infra & Container > Docker' 카테고리의 다른 글

Docker - Docker compose  (0) 2024.03.21
Docker - 명령어 정리 & Volume  (0) 2024.03.21
Docker - Postgres > Data Ingestion  (0) 2024.03.21
Docker - Postgres > pgadmin  (0) 2024.03.20
Docker - Postgres  (0) 2024.03.20

Data Ingestion: 데이터 수집, 데이터를 추출하여 다른 소스로 로드하는 행위라고 한다.

 

Data ingestion하는 과정을 실습해본다. 그 전에 꿀팁을 하나 가져왔다.

주피터 노트북으로 만든 ipynb 파일을 python script로 변경해주는 방법이다! (나만 몰랐을 수도..?)

Jupyter nbconvert —to=script file_name.ipynb

 

다음 코드를 사용하면 file_name.py로 변환되어 파일이 생성된다. 그러나 주의할점이 하나 있다.

주석으로 실행순서등이 따라오기 때문에 한번정도는 주석제거를해서 코드를 보기 좋게 만드는 작업이 권장된다.


수집용 파이썬 코드 생성하기

argparse를 사용해서 인자 받기.

python에서 argument를 받아서 사용하기 위해 내장 라이브러리인 argparse를 사용하였다.

parser를 설정해주고, 내가 원하는 인자들을 입력해주면된다.

parser = argparse.ArgumentParser(description='Ingest parquet to postgres') 

# user, password, host, port, database name, table_name, url
parser.add_argument('--user', help='user name for postgres')
parser.add_argument('--password', help='password for postfres')
...
parser.add_argument('--url', help='url of the parquet file')

args = parser.parse_args()

 

마지막으로 args에 parser들을 담아서 함수에 넣어 사용하면 끝!

 

함수 변경 해주기

지난 실습에서 사용한 코드를 받아와 약간의 수정을 진행했다.

ef main(params):
    user = params.user
    password = params.password
	...
    url = params.url

	...
    engine = create_engine(f'postgresql://{user}:{password}@{host}:{port}/{db}')

Docker 이미지 생성 & 실행

Dockerfile

이미지 생성 전에 파이썬을 사용하면서 설치했던 추가 라이브러리들을 같이 적용시켜야한다.

따라서 Dockerfile을 수정해준다!

FROM python:3.9

RUN apt-get install wget
RUN pip install pandas sqlalchemy psycopg2 pyarrow

WORKDIR /app
COPY ingest_data.py ingest_data.py

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

 

wget을 설치해주고, sqlalchemy, psycopg2, pyarrow 라이브러리도 같이 설치해주었다.

그리고 사용할 파이썬 파일을 copy해준 후에, ENTRYPOINT(시작 시 실행)에도 넣어주었다.

 

Image build & run

이미지 빌드는 다음 코드로 진행했다. 가벼운(?) 빌드 코드이다.

docker build -t taxi_ingest:v001 .

 

이제 docker run을 해줘야하는데 신경써야할 부분이 많다.

우선 우리의 수집용 파이썬 코드가 어떻게 동작하는지 다시 본다..

  1. wget을 이용해서 parquet 데이터를 받아오기
  2. sqlalchemy를 사용해서 postgres와 연결
  3. postgres에 데이터 전송하기

그렇다면 우리가 실행시킬 이 이미지는 postgres와 동일한 네트워크에 있어야한다!

docker run -it --network=pg-network \
    taxi_ingest:v001 \
        --user=root \
        --password=root \
        --host=pg-database \
        --port=5432 \
        --db=ny_taxi \
        --table_name=yellow_taxi_trips \
        --url='https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet'

 

host의 경우에도 postgres db를 연결해주면 완성이다.

이제 실행시켜주면 다음과 같은 결과를 볼 수 있다.

 


전체 코드는 Github에 업로드 하였습니다.

https://github.com/poriz/data-engineering-zoomcamp-poriz/tree/main/01-docker-terraform/introduce_to_docker

'Infra & Container > Docker' 카테고리의 다른 글

Docker - Docker compose  (0) 2024.03.21
Docker - 명령어 정리 & Volume  (0) 2024.03.21
Docker - Postgres > pgadmin  (0) 2024.03.20
Docker - Postgres  (0) 2024.03.20
Docker - Introduction to Docker  (0) 2024.03.18

pgadmin을 사용해서 postgres를 다루어보려한다.

Docker 명령어 작성하기

DB와 pgadmin을 연결하기 위해 docker network를 생성해주어야한다.

docker network create pg-network

 

네트워크안에서 동작하는 컨테이너를 생성하기위해 다음 코드를 작성한다!

docker run -it \
    -e POSTGRES_USER="root" \
    -e POSTGRES_PASSWORD="root" \
    -e POSTGRES_DB="ny_taxi" \
    -v $(pwd)/ny_taxi_postgres_data:/var/lib/postgresql/data \
    -p 5432:5432 \
    --network=pg-network \
    --name pg-database \
    postgres:13

docker run -it \
    -e PGADMIN_DEFAULT_EMAIL="admin@admin.com" \
    -e PGADMIN_DEFAULT_PASSWORD="root" \
    -p 8080:80 \
    --network=pg-network \
    --name pgadmin \
    dpage/pgadmin4

 

  • --network=pg-network : docker 네트워크에 접속하기위해서 위에서 작성한 네트워크를 적용해주었다.

pgadmin 결과창

pgAdmin과 DB연결하기

이제 새 서버를 추가해서 만들었던 pg-database와 연결을 진행합니다.

 

연결된 DB의 테이블을 조회하면

 

다음과 같은 화면이 나오게 된다.


전체 코드는 Github에 업로드 하였습니다.

https://github.com/poriz/data-engineering-zoomcamp-poriz/tree/main/01-docker-terraform/introduce_to_docker

 

'Infra & Container > Docker' 카테고리의 다른 글

Docker - Docker compose  (0) 2024.03.21
Docker - 명령어 정리 & Volume  (0) 2024.03.21
Docker - Postgres > Data Ingestion  (0) 2024.03.21
Docker - Postgres  (0) 2024.03.20
Docker - Introduction to Docker  (0) 2024.03.18

Docker를 활용해서 PostgreSQL을 사용하고 데이터를 적재해보는 실습을 수행했다.

Docker 명령어 작성하기 - postgres

docker run -it \
    -e POSTGRES_USER="root" \
    -e POSTGRES_PASSWORD="root" \
    -e POSTGRES_DB="ny_taxi" \
    -v $(pwd)/ny_taxi_postgres_data:/var/lib/postgresql/data \
    -p 5432:5432 \
    postgres:13

 

코드를 뜯어보자.

  • -e POSTGRES_USER ... : POSTGRES에서 사용할 환경 변수를 입력해주었다.
  • -v &(pwd)/ny_taxi_...  : 호스트의 특정 위치를 볼륨으로 지정해준다. postgresql/data를 현재 디렉토리 하위의 nv_taxi_postgres_data와 연결해주었다.

실제로 확인한 결과!

  • -p 5432:5432 : PC의 포트를 도커 내부의 포트로 연결한다. 5432포트로 접속이 가능해진다. (앞이 현재pc에서 사용하는 포트)
  • 더 자세한 커멘드들은 다음 블로그를 참고하기를 바란다. https://www.daleseo.com/docker-run/

Postgres에 접속하기

다음 명령을 이용해서 연결을 진행하였다.

pgcli -h localhost -p 5432 -u root -d ny_taxi

 

뒤에 미리 앞에서 설정해둔 password를 입력하면 다음과 같은 화면을 볼 수 있다.

 

NewYork Taxi data 받아와서 처리하기

Data Source

연습용 데이터로 Taxi Data를 받아와 사용하였다.

 

TLC Trip Record Data - TLC

TLC Trip Record Data Yellow and green taxi trip records include fields capturing pick-up and drop-off dates/times, pick-up and drop-off locations, trip distances, itemized fares, rate types, payment types, and driver-reported passenger counts. The data use

www.nyc.gov

 

  • Yellow Taxi Trip Records를 받기위해 다음 명령어를 수행했다.
wget https://d37ci6vzurychx.cloudfront.net/trip-data/yellow_tripdata_2023-01.parquet

 

Data 처리 및 SQL에 저장하기

jupyter notebook을 이용해서 데이터를 가져오고 postgreSQL과 연결해서 데이터를 업로드 하는 과정이다.

강의는 csv로 진행되었는데 ny_taxi_data가 parquet형식이여서 당황했지만 다행히 github에 parquet으로 진행하는 방법을 알려주어 참고해서 진행하였다.

 

1. 데이터 불러오기 - pyarrow 사용

import pyarrow.parquet as pq

# read metadata
pq.read_metadata('yellow_tripdata_2023-01.parquet')

file= pq.ParquetFile('yellow_tripdata_2023-01.parquet')
table = file.read()
table.schema

 

이렇게 읽어온 파일을 판다스 데이터 프레임으로 다시 변환하고 싶다면 다음 작업을 수행하면된다.

# convert to pandas
df = table.to_pandas()

 

2. postgresql 연결하기

sqlalchemy를 사용해서 postgresql과 연결한다. (sqlalchemy는 신인가...?)

# connect PostgreSQl with sqlalchemy
from sqlalchemy import create_engine
engine = create_engine('postgresql://root:root@localhost:5432/ny_taxi')
engine.connect()
  • pandas에는 테이블을 쉽게 만들기 위해서 데이터 프레임을 테이블 생성코드로 변환해주는 기능이 있다!
    (그러나 후에 to_sql을 하는 경우에는 테이블이 없어도 생성되어 크게 쓸일은 없었다..)
# Generate CREATE SQL
print(pd.io.sql.get_schema(df, name='yellow_taxi_data',con=engine))

3. batch size를 설정해서 insert하기

배치 사이즈를 10,000으로 설정해서 반복해서 insert를 수행한다.

# Insert values into the table
t_start = time()
count = 0

for batch in file.iter_batches(batch_size=100000):
    count+=1
    batch_df = batch.to_pandas()
    print(f'inserting batch {count} ...')
    b_start = time()

    batch_df.to_sql(name='ny_taxi_data', con=engine, if_exists='append')
    b_end = time()
    print(f'inserted, time taken {b_end-b_start:10.3f} seconds.\n')

t_end = time()
print(f'Completed. Total time taken was {t_end-t_start:10.3f} seconds for {count} batches.')

 

배치 수행 결과

이제 postgresql에 접속해서 데이터를 확인하면?

 

정상적으로 잘 동작한 것을 확인 가능하다.

 


전체 코드는 Github에 업로드 하였습니다.

https://github.com/poriz/data-engineering-zoomcamp-poriz/tree/main/01-docker-terraform/introduce_to_docker

 

'Infra & Container > Docker' 카테고리의 다른 글

Docker - Docker compose  (0) 2024.03.21
Docker - 명령어 정리 & Volume  (0) 2024.03.21
Docker - Postgres > Data Ingestion  (0) 2024.03.21
Docker - Postgres > pgadmin  (0) 2024.03.20
Docker - Introduction to Docker  (0) 2024.03.18

+ Recent posts