Airflow 아키텍쳐 연습

SeongGyun Hong·2024년 12월 19일

미완

1. 가상환경 셋팅 및 airflow 설치

  1. 가상환경 만들기
    conda create -n af python==3.10

  2. 내 환경에 맞는 에어플로우 설치
    pip install "apache-airflow==2.10.3" --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.10.3/constraints-3.10.txt"

2. 데이터베이스(MySQL) 설치 및 연동

  1. 패키지 목록 갱신
    sudo apt update
    sudo apt install mysql-server mysql-client

    뭐 새로운거 설치할 때마다 이거 하는데, 왜하나요?

    이거 해야지 패키지 목록이 업데이트 되면서 내가 설치할 파일을 찾을 수 있음, 이거 안하면 오래된 앱 스토어 목록에서 최신 버전을 찾는 것 과 동일

  2. MySQL과 데이터베이스 연동에 필요한 것들 설치
    sudo apt update
    sudo apt install pkg-config libmysqlclient-dev

    • pkg-config
      프로그램을 컴파일할 때 필요한 라이브러리 정보를 관리하는 도구
      쉽게 말해서 프로그램을 만들 때 필요한 부품 목록을 알려주는 도우미
    • libmysqlclient-dev
      MySQL 데이터베이스와 연결하는데 필요한 개발 파일들입니다
      프로그램이 MySQL과 통신할 수 있게 해주는 도구
      예를 들어 Python에서 MySQL을 사용하려면 이 패키지가 필요
  1. Apache Airflow에서 MySQL 데이터베이스를 연동하기 위한 프로바이더 패키지 설치
    pip install "apache-airflow-providers-mysql==4.0.0"

    • airflow.providers.mysql 파이썬 패키지에 모든 관련 클래스가 포함되어 있음
    • MySQL 연산자, 훅, 센서 등 Airflow에서 MySQL을 사용하는데 필요한 모든 구성요소를 제공
  2. 잘 설치 되었나 체크
    airflow providers list

  1. MySQL 데이터 베이스 생성
    에러발생
    mysql -u root -p
    이 명령어는 비밀번호가 필요한 경우 사용하는 올바른 방법
    -u root:
    root 계정으로 로그인하려는 옵션은 위와 동일.
    -p:
    비밀번호 입력을 요구하는 옵션.
    -p를 입력하면 비밀번호를 직접 입력하라는 메시지가 나타남

    그런데 여기서 에러 발생
    정상적으로 작동하지 못하고
    ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    이런 에러가 발생함.

    찾아보니
    MySQL에서 권한 또는 인증 문제로 인하여 root 계정으로 로그인하지 못했을 때 발생하는 에러라고 함.
    이는 기본적으로 Ubuntu 환경에서 MySQL은 보안을 강화하기 위해 auth_socket 플러그인을 사용해서 root 계정 로그인을 제한할 수있기 때문.

    소켓의 기본 개념
    소켓은 두 프로그램 간의 양방향 통신을 위한 엔드포인트로써 네트워크상에서 데이터를 주고받기 위한 통신 방식이다.
    클라이언트와 서버 간의 통신을 가능하게 한다.

    어쨌든 위와 같은 경우에 root 계정으로 접속하기 위해서는 MySQL이 운영체제 사용자와 동일한 이름의 계정을 사용하도록 강제한다.
    즉, mysql -u root 명령어로 로그인을 하는 경우 OS의 사용자도 root여야 하는것..!

    어떻게 해결하나요?

    • 우선 sudo mysql을 통해 접속
      이전에 접속이 안된 이유가 현재 OS의 사용자가 root가 아니기 때문에 sudo를 통해 root 권한으로 명령어 실행하도록 해줌.
    • 이후
      root 계정의 인증 방법을 비밀번호 기반으로 변경
      ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
      (1234는 새로운 비밀번호)
    • 그리고 다시 변경사항 적용
      FLUSH PRIVILEGES; (변경된 권한의 즉시사용)
    • 그리고 로그아웃
      EXIT;
    • 이제 mysql -u root -p로 접속이 가능하다
      (아까 비밀번호 1234 로 했었음)
  2. 에러 고친 후 다시 데이터베이스 생성
    CREATE DATABASE airflow;

  3. 데이터베이스 사용자 생성

    CREATE USER 'hsk'@'%' IDENTIFIED BY '1234';
    GRANT ALL PRIVILEGES ON airflow.* TO 'hsk'@'%';
    FLUSH PRIVILEGES;

    1234는 비밀번호

  4. Airflow 설정 파일 수정
    Airflow의 경우 설치 직후에 ~/airflow/airflow.cfg 라는 설정 파일을 만든다.

    MySQL을 DB로 쓰기위해서는
    해당 파일에서 아래와 같은 연결 문자열sql_alchemy_conn을 수정해줘야한다.

    • sql_alchemy_conn의 경우 Airflow가 데이터베이스와 연결하기 위한 연결문자열이다.
    • SQLAlchemy는 파이썬에서 데이터베이스를 사용할 수 있게 해주는 도구로써, sql_alchemy_conn은 이러한 도구가 데이터베이스를 찾아갈 수 있도록 알려주는 주소의 역할을 해준다.

      1. 드라이버 부분 (mysql+mysqldb)
      mysql: 사용할 데이터베이스 종류를 지정
      mysqldb: Python이 MySQL과 통신하는데 사용할 드라이버
      마치 컴퓨터와 프린터를 연결하는 프린터 드라이버와 같은 역할

      2. 인증 정보 (hsk:1234)
      hsk: 데이터베이스에 로그인할 사용자 이름
      1234: 해당 사용자의 비밀번호
      마치 이메일에 로그인할 때 사용하는 아이디와 비밀번호와 같음, 이전에 데이터베이스에 들어가서 생성해준 그 아이디와 비밀번호임.

      3. 위치 정보 (localhost:3306)
      localhost: 데이터베이스 서버의 주소
      3306: MySQL이 응답을 기다리는 문(포트)
      마치 우편물을 보낼 때의 주소와 우편번호와 같음

      4. 데이터베이스 이름 (airflow)
      실제로 사용할 데이터베이스의 이름
      마치 아파트 단지에서 특정 동을 지정하는 것과 같음

  5. Airflow 데이터 베이스 초기화
    airflow db init
    아 물론 ;; 이전에 자신의 airflow 프로젝트 폴더로 경로를 들어가서 환경변수 설정을 해주자..!

    export AIRFLOW_HOME=`pwd`
    source ~/.bashrc
    • Airflow 가 필요한 파일들을 어디에 저장하고 찾을지 알려주고(설정파일의 위치가 이에 해당함)
    • DAG,로그 파일들의 저장 위치를 알려주기 위해!

    에러발생
    만약 db가 없다느니, 사용자가 이상하다드니 에러가 뜨면
    아래와 같이 일단 서버 재시작하고
    sudo systemctl restart mysql

    이전에 root 계정의 인증 방법을 비밀번호 기반으로 변경하였으므로
    mysql -u root -p
    비멀번호:1234 (설정한 비밀번호)
    이렇게 접속하여
    다시 6번의 데이터베이스 생성 및 권한 부여 과정을 거침

  6. 다시 airflow db init
    다만, 자꾸 기존의 sqllite로 설치되면,이전 폴더의 설정값이 경로설정에 의해 적용되고 있는 것은 아닌지 체크할 것

    문제 없다면 airflow db init

    Initialization done 뜨면 airflow db 생성 완료

3. Airflow 서버, 스케쥴러 띄우기

  1. 서버 및 스케쥴러 띄우기
    airflow webserver
    airflow scheduler

  2. 사용자 생성

airflow users create \
    --username 로그인아이디 \
    --firstname 이름 \
    --lastname 성 \
    --email 이메일 \
    --role Admin \ (권한)
    --password 1234 (예시)

  1. 이제 로그인 하면 됩니다..!

4. DAG파일 작성하기

  • 무엇을 할 것인가?
    • NexonOpenAPI를 활용한 마비노기 영웅전 랭커 군집화
  • 왜?
    • 유저 성향 분석
  • 어떻게?
      1. API를 통해 상위 5000명 정보 수집하고
      1. 군집화 알고리즘으로 군집화를 한다음
      1. 해당 군집화된 유저군에 대하여 시각화하여
      1. slack 알림으로 전송

        airflow를 활용하여 아래 API 제약조건에 맞춰서 그리고 이후 과정까지 한번에 작동할 수 있도록 한다.

4.1 API call & MySQL

넥슨 API 관련 이용 제약은 아래와 같다.

API Key 타입: 개발 단계
초당 최대 허용량: 5건 / 초
1일 최대 허용량: 1000건 / 일

이를 참고하여 아래에서 계속하여 개발 진행

4.1.1 Nexon OpenAPI 랭킹정보 조회 후 DB로 적재

코드 작성

4.1.2 MySQL airflow DB 내에 character_info 테이블 만들기

  1. 이전에 만든 유저로
    mysql -u hsk -p airflow
    비밀번호는 아까 썼던 1234 입력 해주고...
  2. 현재 DB 확인해주고
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| airflow    |
+------------+
1 row in set (0.00 sec)
  1. 아래 명령어를 통해서 테이블 생성
mysql> CREATE TABLE character_info (
    ->     character_name VARCHAR(255),
    ->     ranking BIGINT,
    ->     score BIGINT,
    ->     ocid VARCHAR(255),
    ->     character_exp BIGINT,
    ->     character_level BIGINT,
    ->     character_date_create TIMESTAMP,
    ->     character_last_login TIMESTAMP,
    ->     character_last_logout TIMESTAMP,
    ->     character_class_name VARCHAR(255),
    ->     character_gender VARCHAR(50),
    ->     cairde_name VARCHAR(255),
    ->     skill_awakening JSON,
    ->     title_count BIGINT,
    ->     id_title_count BIGINT,
    ->     total_title_count BIGINT,
    ->     title_stat JSON,
    ->     dress_total_point BIGINT,
    ->     dress_avatar_point BIGINT,
    ->     dress_back_point BIGINT,
    ->     dress_tail_point BIGINT,
    ->     dress_object_point BIGINT,
    ->     PRIMARY KEY (ocid)
    -> );
Query OK, 0 rows affected (0.08 sec)

4.1.3 db_connector.py 작성

코드작성

4.1.4 api_data_collection_dag 작성

코드작성

4.2 classification.py 작성

4.3 slack_notification.py 작성

4.4 classification_dag.py 작성

profile
헤매는 만큼 자기 땅이다.

0개의 댓글