가짜연구소 내 Python - Data Engineering 스터디를 위해 작성했습니다.
https://www.notion.so/chanrankim/PseudoLab-c42db6652c1b45c3ba4bfe157c70cf09
(가짜연구소 링크)
https://www.notion.so/chanrankim/Data-Engineer-Python-83c206a662004120a8211a800581e124
(스터디상세 링크)
핵심 내용
리눅스는 GCP를 이용하여 설치했습니다. 관련해서는 아래 블로그 글을 참고하실 수 있습니다. 스크롤이 긴데, 설치 과정에서 있었던 삽질기를 다루는 글입니다. 저처럼 엔지니어링도 클라우드도 잘 모르지만, Airflow를 설치하고 간단한 Dag파일을 생성해보고 싶은 분들께 참고가 될 수 있을 것 같습니다.
본 글에서 다루는 내용들은 다음과 같습니다.
- docker 설치
- docker compose 설치
- airflow docker 설치
- 방화벽 설정
- 간단한 dag 생성
https://gibles-deepmind.tistory.com/116?category=954919
설치 과정
docker 설치
공식 문서의 repository를 이용하여 설치하는 방법을 참조했습니다.
https://docs.docker.com/engine/install/ubuntu/
Update the apt package index and install packages to allow apt to use a repository over HTTPS:
https(HTTP + 보안 기능) 에서 파일을 다운로드 받기 위해 아래와 같은 패키지들을 설치하는 것 같습니다.
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
다음으로, GPG key 파일을 추가해줍니다. GPG key는 배포된 파일이 타당한지 체크해주는 public key입니다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
/usr/share/keyrings 폴더를 체크해보시면 docker-archive-keyring.gpg 파일이 추가된 것을 확인할 수 있습니다.
이어서, repository를 stable로 설정할 건지, nightly로 설정할 건지, test로 설정할 건지에 대한 얘기가 나옵니다. 일반 사용자들은 가이드 그대로 stable 버전으로 설치하면 될 것 같습니다.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
이제 도커 파일을 설치해주도록 합시다. 참고로 docker-ce 는 docker 커뮤니티에디션의 준말입니다.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
이어서 Y를 입력해주면, 설치가 완료됩니다.
도커 버젼을 확인해봅니다. (docker --version)
컨테이너 리스트를 확인할 수 있는 docker ps 명령어를 입력해봅니다. 웁스 뭔가 permission이 없다네요. (docker ps)
사용자를 도커 그룹에 추가해줍니다.
sudo usermod -aG docker ${USER}
그리고, 다시 터미널을 재실행 합니다. 잘 실행되네요.
테스트 삼아, hello-world 이미지를 받아, 실행시켜 보겠습니다.
docker pull hello-world
docker images를 실행해보면 hello-world 이미지가 추가된 것을 확인해볼 수 있습니다.
Hello from Docker! 라는 메시지와 함께, 이 메시지를 생성하기 위해 어떤 과정을 거쳤는지 내용이 나와있습니다. 저처럼 잘 모르시는 분들은 한번 읽어보셔도 좋을 것 같네요.
docker run hello-world
hello-world라는 이미지를 이용하여 컨테이너를 실행후 종료(Exited)한 것을 알 수 있습니다.
docker ps -a
컨테이너를 삭제해주도록 합시다.
docker rm containerID
잘 삭제된 것을 확인할 수 있습니다. 지금까지, 배운 내용을 정리하면 이미지를 다운 받는다 -> 이미지를 실행하면 컨테이너가 생성된다 -> 컨테이너는 실행하거나 중지할 수 있고, 사용하지 않는 컨테이너는 삭제할 수도 있다.
이렇게 정리할 수 있을 것 같네요.
docker-compose 설치
airflow를 docker상에 설치하기 위해서는 docker-compose를 추가적으로 설치해야 합니다. 관련된 내용은 아래 문서에서 확인 하실 수 있습니다. 현재 기준 최신 버젼은 2.5.0인데요. 저는 그 이전 버전인 2.4.1로 설치했습니다.
https://github.com/docker/compose/blob/master/INSTALL.md
아래와 같이 명령어를 입력해주면 됩니다.
sudo curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
단, 아래와 같이 docker-compose 버젼을 확인할 수 있어야 합니다.
airlfow 설치
공홈 가이드 대로 설치하는 방법을 다뤘습니다. 다만, dag를 생성하는 과정에서 문제가 생겨 최종 버젼은 다른 이미지를 다운 받았습니다. 해당 챕터는 설치 방법만 참고 부탁드립니다. 공홈 설치 가이드를 따르지 않으실 분은 바로 DAG생성 페이지로 넘어가셔도 됩니다.
공식문서를 참고해서 airflow를 설치했습니다.
https://airflow.apache.org/docs/apache-airflow/stable/start/docker.html
우선, Airflow를 설치할 폴더를 먼저 만들어줍니다.
mkdir airflow-docker
아래 명령어를 실행하면 명령어를 실행한 디렉토리에서 docker-compose.yaml 파일이 생성되는데요.
sudo curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.3.0/docker-compose.yaml'
docker-compose.yaml에는 다음과 같은 내용들이 정의되어 있다고 합니다.
cat docker-compose.yaml
일단은?그냥 그런가보다 하고 넘어가도 될 것 같습니다. 아래와 같이 DB는 postgre, 기본 포트는 8080으로 설정되어 있는 것을 확인할 수 있습니다.
조금 더 내려가보면 컨테이너 내의 어떤 디렉토리들이 "마운트"되어 있다. 라는 표현이 나옵니다.
이 글에 잘 설명되어 있는데, USB를 꼽으면 자동으로 폴더가 생성된다!라는 설명이 와닿았습니다. 즉, 컨테이너에서의 작업을 해당 폴더들을 통해 동기화 시킨다고 생각하면 될 것 같습니다.
https://jhnyang.tistory.com/12
아래와 같이 컨테이너의 작업을 VM 인스턴스에 마운트 시키는 폴더들을 만들어 줍니다.
mkdir -p ./dags ./logs ./plugins
또한, user id를 받아올 수 있도록 환경 변수를 설정해주어야 합니다. (참고로, 2.2 버전 이전에는 AIRFLOW_GID도 설정해주었으나, 2.3부터는 해당 파라미터를 삭제한 것 같습니다. 그래서, AIRFLOW_UID만 설정하면 되는 것 같습니다.) 참고로 id -u를 찍어보면 사용자의 uid를 출력해줍니다. 저는 혹시 몰라서 GID도 같이 설정해 주었습니다.
echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
다음으로, 해당 명령어를 통해 airflow 이용에 필요한 db 마이그레이션 및 최초 유저 계정을 생성해줍니다.
docker-compose up airflow-init
완료가 되면 아래와 같은 문구가 나옵니다. 공홈 설명에 따르면 아이디/비번 airflow인 계정이 생성된다고 하네요.
이제 airflow를 실행해봅시다.
docker-compose up
어랏? 어디선가 8080포트로 실행되고 있는 프로세스가 있는 것 같습니다.
사뿐히 죽여줍니다.
sudo lsof -i tcp:8080
kill -9 5110 5111 5112 5113 27530
아래 명령어를 이용하면 한번에 모든 컨테이너를 죽일 수 있습니다.
docker kill $(docker ps -q)
그리고, 나서 다시 실행해봅니다. 이번에는 또 도커를 위한 메모리가.. 없다네요 ㅜ 쉽지 않습니다.
혹시, 제 머신 메모리 탓일까요...?
글을 찾아보니, 기본적으로 Linux에서 Docker를 설치하는 경우 host memory를 모두 이용할 수 있다고 하네요. 혹여나, 돈이 나올까봐 무섭기는 하지만 VM instance의 메모리를 좀 더 늘려주도록 하겠습니다.
메모리 유형을 변경하려면 인스턴스를 중지해야 합니다(GCP)
그리고, 인스턴스를 클릭한 후 수정 버튼을 눌러줍니다.
8GB로 우선 늘려보겠습니다. 변경 후 저장 버튼을 눌러준 다음, 완료가 되면 시작/재개 아이콘을 눌러줍니다.
8GB도 만족스럽지 않은가 봅니다.
어쨌든, 다른 ssh 브라우저를 실행 후 docker ps를 입력해보겠습니다. 아래와 같이, docker-compose에 포함된 컨테이너들이 각각 실행된 것을 알 수 있습니다.
GCP VM 인스턴스의 외부IP:8080을 입력하면 아래와 같이 Airflow webserver로 접속 가능합니다. username과 password에 각각 airflow를 입력해줍니다.
그전에...! GCP에서 방화벽 설정을 통해 8080포트를 열어주어야 합니다. 방화벽 규칙 만들기로 들어간 다음 아래와 같이 설정해줍니다.
그러면, 짜잔 Airflow webserver ui를 살펴볼 수 있습니다.
기존 docker-compose up를 실행했던 shell을 살펴보면 아래와 같은 로그들이 찍히는데요. 컨테이너들이 healthy 한지 확인해주는 것 같습니다.
crtl + c를 눌러 강제 종료해주면 아래와 같이 나옵니다.
컨테이너 STATUS가 Exited로 변경된 것을 확인할 수 있습니다.
docker ps -a
(삭제가 필요한 경우 아래 명령어를 활용 할 수 있습니다.)
docker-compose down --volumes --rmi all
DAG 생성해보기
우선, GCP의 외부IP:8080 으로 airflow-webserver로 접속해줍니다. 그리고, 아이디: airflow/ 비밀번호: airflow를 입력해줍니다.
이렇게 화면이 나오면 정상적으로 접속한 것입니다.
Sample DAG 생성해보기
샘플 DAG를 생성해봅시다. docker-airflow폴더 하위에 dags라는 폴더가 있는데요. 해당 폴더 안에서 간단한 python code를 작성해주겠습니다.
cd dags
nano aa.py
테스트 코드는 아래 레퍼런스를 참고 했습니다. aa.py에 아래 코드를 복사 붙여넣기 해줍니다. 참고로, 여기서 생성하는 파이썬 파일 이름은 실제 dag이름과는 전혀! 상관없습니다. + 파일 생성후 조금 기다려주어야 합니다.
https://hevodata.com/learn/running-airflow-in-docker/
from datetime import datetime
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
def print_firstdag():
return 'My First DAG from HevoData!'
dag = DAG('first_dag', description='HevoData Dag',
schedule_interval='0 8 * * *',
start_date=datetime(2022, 2, 24), catchup=False)
print_operator = PythonOperator(task_id='first_task', python_callable=print_firstdag, dag=dag)
print_operator
crtl + o -> crtl + x 를 눌러 저장후 나와줍니다. 그리고, 다시 airflow webserver로 돌아가면 first_dag가 생성된 것을 알 수 있습니다.
DAG안에 파라미터로 지정해준 first_dag가 airflow ui에서 표시됩니다!
트리뷰 내에서 초록색 네모 박스를 클릭하면 아래와 같은 화면을 확인할 수 있습니다. View Log를 클릭해줍시다.
프린트 메시지가 정확하게 출력된 것을 알 수 있습니다.
'딥상어동의 딥한 프로그래밍 > 엔지니어링' 카테고리의 다른 글
[ubuntu] Mysql 원격 접속 허용후 Python(pd.to_sql)과 연동해보기 (0) | 2022.06.04 |
---|---|
[ubuntu]에서 jupyterlab background 서버 구축하기 (0) | 2022.05.24 |
[Airflow] 설치(pip install) 및 webserver 실행 (0) | 2022.05.08 |
[linux] Python과 crontab을 이용하여 카카오톡 메시지 보내는 배치 실행하기(카카오 API) (2) | 2022.04.10 |
[Linux] Python 가상환경 세팅하기 (bdist_wheel 에러 해결) (0) | 2022.04.10 |
제 블로그에 와주셔서 감사합니다! 다들 오늘 하루도 좋은 일 있으시길~~
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!