본문 바로가기
분석환경구축하기/GCP

[GCP] #07 GCP Compute Engine VM에 아파치 에어플로우(Airflow) 설치하여 ETL 환경 구축하기

by DoBeFree 2020. 5. 1.
반응형

<시리즈 목차> 

1화 : [GCP] #01 GCP Compute Engine VM 으로 분석서버 구축하기
2화 : [GCP] #02 GCP Compute Engine VM 인스턴스 초기 세팅하기
3화 : [GCP] #03 GCP Compute Engine VM에 파이썬(Python) 분석환경 구성하기
4화 : [GCP] #04 GCP Compute Engine VM에 R 분석환경 구성하기
5화 : [GCP] #05 분석을 위한 Google CloudSQL SQLServer 구축&GCE 파이썬 분석서버와 연결하기
6화 : [GCP] #06 Google Bigquery GCE 파이썬서버에서 활용하기
7화 : [GCP] #07 GCP Compute Engine VM에 아파치 에어플로우(Airflow) 설치하여 ETL 환경 구축하기
8화 : [GCP] #08 GCP Compute Engine VM에 제플린(zepplien), 스파크(Spark), 스칼라(Scala) 설치하기
9화 : [GCP] #09 Google Cloud Storage 저장소를 GCE 파이썬 서버에서 활용하기

이번 글에서는 GCP Compute Engine VM에 아파치 에어플로(Apache Airflow)를 설치하여 ETL 환경을 구축하고 Google CloudSQL과 연동하는 법에 대해 다룹니다. 

설치환경
- Ubuntu 20.04 LTS
- Python 3.9
- GCP Compute Engine

 

1. 에어플로우 설치하기

VM인스턴스의 SSH버튼을 클릭하여 Shell을 실행합니다.

STEP 01 : airflow 전용 파이썬 가상환경 생성

에어플로우를 앞서 설치한 기본 파이썬에 분리 없이 설치할 경우 각 라이브러리간 의존성 문제로 설치과정에서 오류가 발생할 수 있습니다. 추가로 사용하면서 다른 라이브러리와 충돌을 일으켜 오류를 발생할 확률이 커지기 때문에 별도 가상환경으로 분리하여 설치해야합니다. 

# 가상환경 라이브러리인 virtualenv 라이브러리 생성
$ pip install virtualenv

# 기본 디렉터리로 이동
$ cd ~/

# airflowenv라는 가상환경 생성
$ virtualenv airflowenv

# 생성한 가상환경 활성화
$ source ~/airflowenv/bin/activate

가상환경 생성과 활성화가 정상적으로 완료됐다면 아래와 같이 생성한 가상환경 이름인 (airflowenv) 가 shell에 노출됩니다.

추가로 이후 DB연동에 필요한 라이브러리인 psycopg2-binary 도 설치합니다.

$ pip install psycopg2-binary

 

STEP02 : airflow 설치하기

공식홈페이지의 가이드문서에 에어플로우 설치에 대한 명령어가 존재합니다. 설치방법은 아래 공식 설치가이드에서 발췌하였습니다. 해당 명령어가 오류를 반환한다면, 공식홈페이지의 설치 명령어를 참조하길 바랍니다. (반드시 위에서 생성한 가상환경이 활성화된 상태로 아래 명령어를 실행해야합니다.)

# airflow 환경변수를 bash_profile에 추가합니다.

$ echo 'export AIRFLOW_HOME=~/airflow' >> ~/.bash_profile
$ source ~/.bash_profile
# 파이썬 버전에 맞는 2.2.3 버전의 에어플로우를 설치합니다.
AIRFLOW_VERSION=2.2.3
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"

# airflow 초기화를 진행합니다.
airflow standalone

* 공식홈페이지 설치 가이드문서 : https://airflow.apache.org/docs/apache-airflow/stable/start/local.html

 

Running Airflow locally — Airflow Documentation

 

airflow.apache.org

성공적으로 설치를 진행했다면, 아래와 같이 Listening 정보, username, password 를 확인할 수 있습니다.

STEP03 : airflow 방화벽 허용하기

  • 고정ip 설정하기 : VPC네트워크 > 외부 IP 주소 > 임시ip 를 고정ip로 변경(이미 고정IP가 인스턴스에 할당되어 있으면 넘어가도 됩니다.)
  • 방화벽 설정 변경하기 : VPC네트워크 > 방화벽 규칙 > 방화벽 규칙만들기 에서 8080 포트에 대한 접속을 허가합니다.
  • 인스턴스의 고정IP와 방화벽 규칙에 대한 자세한 사항은 [GCP] #03 GCP Compute Engine VM에 파이썬(Python) 분석환경 구성하기 에서 자세하게 확인할 수 있습니다.

STEP04 : airflow 접속 확인하기

http://<고정ip주소>:8080 에 접속하여 airflow가 잘 설치되었는지 그리고 방화벽 규칙이 잘 설정되었는지 확인합니다. 로그인은 위 설치과정에서 확인한 ID/PW를 입력하면 로그인할 수 있다. 

STEP05 : airflow 신규계정 생성하기

아래 명령어를 통해 airflow 신규계정을 생성할 수 있습니다.

airflow users create \
          --username <유저ID> \
          --firstname <유저 firstname> \
          --lastname <유저 lastname> \
          --role <유저 role> \
          --email <유저 email>

이번 글에서는 gcpdev1234567이라는 airflow 유저를 생성하기 위해 아래와 같이 입력합니다.

airflow users create \
          --username gcpdev1234567 \
          --firstname gcpdev1234567 \
          --lastname gcpdev1234567 \
          --role Admin \
          --email gcpdev1234567@ariflow.com

새로 생성한 계정을 통해 로그인하여 계정생성에 대한 작업을 체크합니다.

 

2. CloudSQL PostgreSQL 인스턴스와 airflow 연동하기

Airflow는 기본적으로 SQLlite 엔진을 사용하고 있습니다. 하지만 SQLlite의 경우 하나의 작업 후에 다음 작업을 진행하는 직렬적인 방식으로만 처리가 가능하여 병렬처리가 가능한 PostgreSQL 혹은 MySQL을 활용해야 합니다. 이번 글에서는 PostgreSQL을 통해 airflow 엔진을 구성할 예정입니다. 

CloudSQL의 세부적인 인스턴스 설정에 대해서는 [GCP] #05 분석을 위한 Google CloudSQL SQLServer 구축&GCE 파이썬 분석서버와 연결하기 에서 상세하게 확인할 수 있기 때문에 이번 글에서는 Airflow연동에 필요한 부분만 설명할 예정입니다.

STEP 01 : PostgreSQL 인스턴스 생성

메뉴 > 데이터베이스 > SQL 에서 인스턴스 만들기를 클릭하고 "PostgreSQL 선택" 을 클릭한다

인스턴스 정보를 입력하고 인스턴스를 생성합니다.

생성이 완료되면 SQL 인스턴트 페이지에서 생성한 airflow-db를 클릭하여 인스턴스 상세 페이지로 들어갑니다.

STEP 02 : VM인스턴스 IP허용하기, 사용자, DB

(1) 사용자 생성

연결 > 네트워킹 에서 승인된 네트워크 항목에서 VM인스턴스의 고정 IP를 추가합니다.

(2) 사용자 생성

사용자 탭에서 사용자 계정 추가를 클릭하여 사용자를 추가합니다. 저는 gcpdev1234567 로 추가하였습니다.

추가가 완료되면 아래와 같이 신규사용자인 gcpdev1234567이 사용자목록에 추가된것을 확인할 수 있습니다.

(3) DB 생성

데이터베이스 탭에서 데이터베이스 만들기를 클릭하여 신규데이터베이스를 추가합니다. 저는 airflow_db 로 추가하였습니다.

추가가 완료되면 아래와 같이 airflow_db가 데이터베이스 목록에 추가된것을 확인할 수 있습니다.

STEP 03 : airflow.cfg 수정

airflow.cfg 파일을 통해서 airflow에 대한 전반적인 설정을 설정할 수 있다. PostgreSQL 에 대한 연동 역시 airflow.cfg 파일에서 설정할 수 있다.  아래 명령어를 통해 airflow.cfg 파일을 수정한다.

# 기본 디렉토리로 이동
$ cd ~/

# airflow.cfg 파일 vi에디터로 수정
$ vi ~/airflow/airflow.cfg

(1)  executor와 sql_alchemy_conn수정

1. executor = SequentialExecutor 로 기본으로 설정되어 있다. 이를 executor = LocalExecutor 으로 변경합니다.
2. sql_alchemy_conn = sqlite:////home/gcpdev1234567/airflow/airflow.db 를 postgreSQL 설정에 맞게 아래와 같이 변경합니다.

postgresql+psycopg2://<postgresql 사용자명>:<postgresql 비밀번호>@<postgresql 공개ip>/<postgresql DB>

위에서 postgresql 계정/비밀번호/DB를 아래와 같이 설정하였기 때문에

  • postgresql 사용자명 : gcpdev1234567
  • postgresql 비밀번호 : 1234567890
  • postgresql DB : airflow_db
  • postgresql 공개ip : 34.64.111.195
    > airflow-db SQL 인스턴스 세부페이지에서 확인할 수 있다.  

아래와 같이 입력한다.

sql_alchemy_conn = postgresql+psycopg2://gcpdev1234567:1234567890@34.64.111.195/airflow_db

 

* 수정전

* 수정후

(선택) 추가로 아래와 같이 load_examples을 False 로 변경하여 예제로 들어있는 dag list들도 모두 삭제해줍니다.

load_examples = False 

 

STEP 04 : airflow 수정사항 반영

아래 명령어를 통해 PostgreSQL로 변경한 수정사항을 업데이트 해줍니다.

$ airflow db init

 

STEP 05 : airflow 웹서버 구동

제일 처음 airflow를 설치하고 구동하였을때 이후로 서버는 계속 진행중에 있습니다. 따라서 airflow 웹서버를 구동하여도 The webserver is already running 에러 메시지가 나올것 입니다. 안정적인 수정 반영을 위해 기존 웹서버를 중단하고 재시작해야합니다.

STEP 01 : 기존 8080 포트의 PID 중단

아래 명령어를 통해 8080포트에 대한 현재 PID 목록을 확인합니다.

$ sudo lsof -i tcp:8080

피드를 중단시키기 위해서는 아래와 같은 명령어가 필요합니다.

$ sudo lsof -i tcp:8080 | grep '<유저명>' | awk '{print $2}' | xargs kill -9

현재 PID의 USER가 모두 gcpdev1234567이기 때문에 아래 명령어로 모두 중단시킵니다.

$ sudo lsof -i tcp:8080 | grep 'gcpdev1234567' | awk '{print $2}' | xargs kill -9

다시 PID 리스트를 확인하면 모두 클리어된것을 확인할 수 있습니다.

$ sudo lsof -i tcp:8080

STEP 02 :  Airflow 웹서버 시작

아래 명령어를 통해 airflow 웹서버를 시작한다.

$ airflow webserver --port=8080

 

http://<고정ip주소>:8080 에 접속하여 airflow가 잘 설치되었는지 확인합니다.

 

반응형

댓글