Amazon Linux 2에 Airflow 설치하기

PEPPERMINT100·2023년 5월 20일
0

서론

유저의 행동 데이터를 추적하고 싶은데, RDS로 적재 및 분석하기에 커다란 사이즈인 경우가 있었다. 이 경우였는데, 정말 많은 데이터를 쌓고 싶었고 분석도 빠르게 하고 싶었다. 그러기 위해서는 RDS가 아닌 다른 형태로 데이터를 저장해야 한다. 일반적으로 CSV형태로 AWS S3와 같은 파일 스토리지(정확히는 오브젝트 스토리지지만)에 적재를 해두고 AWS의 Athena나 Redshift로 분석한다고 한다.

그렇다면 CSV는 어떻게 올릴까? 많은 고민이 있었다. 가장 처음에는 단순하게 RDS에 적재된 소량의 하루 데이터를 계속 S3에 푸시하는 것을 생각했다. AWS Glue를 이용하고 AWS Lambda에 CloudWatch 트리거를 하면 되지 않을까 했다.

근데 결국 이 방법도 RDS를 이용하고 조금 억지스럽다는 생각이 들었다.

다른 방법으로는 서버 어플리케이션이 운영체제의 파일 시스템에 CSV 데이터를 생성하고 쉘 스크립트, Cron을 사용하는 방식이었다. 근데 이렇게 하려면 AWS 배포환경에 많은 커스텀이 들어가야 했고 이 역시 조금 원시적이라는 생각이 들었다.

다른 방법을 구글링해본 결과 데이터 엔지니어링에는 ETL이라는 개념이 있다는 것을 알게 되었다.

ETL은 Extract, Transform, Load의 약자로,

  1. 데이터를 데이터 소스로부터 가져오고(Extract)
  2. 원하는 형태로 변경(Transform)
  3. 그 후 데이터 리포지토리에 저장(Load)

하는 일련의 과정을 뜻한다.

이러한 니즈가 당연히 어느 소프트웨어에나 있었을 것이고, 이를 위한 툴도 많이 당연히 존재했다.

이전에 자동차 관련 스타트업의 개발자와 커피챗을 했을 때 Airflow를 사용한다는 말을 잠깐 들은적이 있는데, Airflow가 그것이었다.

당장 회사에 도입하기에 어려울 수 있고 소프트웨어의 러닝커브가 꽤 있어보이는데, 일단 깔짝이라도 공부해보기로 했다. AWS에서 MWAA라는 완전 관리형 Airflow를 서비스하나 본데, 공부를 위해 직접 설치를 해보기로 했다. 설치 환경은 Amazon Linux 2이고 일반적인 도커 환경이나, 우분투, MacOS와 약간의 차이가 있는 운영체제여서 설치 과정에 삽질을 좀 했는데, 과정을 공유해본다.

Airflow 설치

기본적으로 EC2 인스턴스를 Amazon Linux 2 운영체제로 올려서 ssh에 접근한다. 이후에

 sudo yum update -y
$ sudo yum install group "Development tools" -y
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel python3-devel.x86_64 cyrus-sasl-devel.x86_64 -y
$ sudo yum install libevent-devel -y

# 드디어 airflow를 설치. 여기에서 sudo를 생략하면 권한문제가 발생한다.
$ sudo pip3 install apache-airflow

위 명령어를 통해 설치해준다.

이 후에 공식 가이드대로 airflow initdb를 통해 에어플로우의 기본 세팅을 하면 되는데,

Traceback (most recent call last):
  File "/usr/local/bin/airflow", line 5, in <module>
    from airflow.__main__ import main
  File "/usr/local/lib/python3.7/site-packages/airflow/__init__.py", line 52, in <module>
    from airflow import configuration
  File "/usr/local/lib/python3.7/site-packages/airflow/configuration.py", line 1818, in <module>
    conf.validate()
  File "/usr/local/lib/python3.7/site-packages/airflow/configuration.py", line 361, in validate
    self._validate_sqlite3_version()
  File "/usr/local/lib/python3.7/site-packages/airflow/configuration.py", line 468, in _validate_sqlite3_version
    f"error: SQLite C library too old (< {min_sqlite_version_str}). "
airflow.exceptions.AirflowConfigException: error: SQLite C library too old (< 3.15.0). See https://airflow.apache.org/docs/apache-airflow/2.6.1/howto/set-up

이러한 에러를 만날 수 있었다. 에러 내용은 SQLite3의 버전이 낮다는 것이다. SQLite3의 버전을 올려줘야 한다.

SQLite3 버전 업그레이드

wget https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz
tar xzf sqlite-autoconf-3410200.tar.gz 
cd sqlite-autoconf-3410200
./configure 
sudo make
sudo make install

위와 같은 명령어를 통해 sqlite 파일을 받고 압축을 푼 후 설치해주는 명령어를 구글에서 찾았는데 wget으로 가져오는 주소가 만료되었다.

그래서 https://www.sqlite.org/download.html 에 접근하여 로컬에 직접 sqlite.tar.gz을 다운받고 scp를 통해 인스턴스에 업로드했다.

업로드 한 후 tar 명령어 부터 실행해주면 된다. 하지만 Amazon Linux 2에는 gcc가 설치되어 있지 않아서 make 명령어가 작동하지 않는다.

에러 메시지는 아래와 같다.

checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports the include directive... yes (GNU style)
checking for gcc... no
checking for cc... no
checking for cl.exe... no
checking for clang... no

gcc 설치

gcc를 설치하기 위해 centos 기반인 amazon linux 2에서 yum 패키지를 통해 설치하려 했지만 amazon linux 2에서 바로 설치하는 것은 불가능하다.

sudo yum update
sudo yum groupinstall "Development Tools"

위 명령어를 통해 기본적인 리눅스 개발 툴들을 다운받을 수 있다.

이 후 sqlite3 버전업을 위해 make 명령어부터 다시 시작하면 정상적으로 버전이 업그레이드 된다. 이 후 airflow db init을 한다.

하지만 이번엔 urllib3의 버전이 맞지 않는다고 한다.

에러 메시지는 아래와 같다.

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with OpenSSL 1.0.2k-fips  26 Jan 2017. See: https://github.com/urllib3/urllib3/issues/2168

urllib3 버전 업그레이드

간단하게 pip 명령어를 통해 urllib3의 버전을 업그레이드 해준다.

sudo pip install --upgrade urllib3==1.26.15

airflow 대시보드

위 과정을 전부 마쳤다면 아마도 airflow db init이 정상적으로 작동할 것이다.

이후엔

$ airflow initdb
$ airflow users create \
--username admin \
--firstname pepper \
--lastname mint \
--role Admin \
--email peppermint100@email.com

으로 관리자 계정을 만들어준다. 마지막에 해당 계정의 비밀번호를 설정하는 것이 나오니 잘 입력해준다.

airflow webserver --port 8080

이후엔 webserver 명령어를 통해 airflow의 컴포넌트중 하나인 webserver를 기동해주면 대시보드가 실행된다.

그리고 보안 그룹에서 8080포트를 열어주고 도메인 혹은 ip주소:8080 에 접속하면 에어 플로우 대시보드를 확인할 수 있다.

출처1
출처2

profile
기억하기 위해 혹은 잊어버리기 위해 글을 씁니다.

0개의 댓글