이 글은 우분투 기준으로 작성되었습니다.
$ docker pull jo1013/pyspark:0.05
$ docker pull jo1013/airflow:0.07
$ docker pull mysql:8.0.17
$ git clone https://github.com/jo1013/pyspark.git
$ cd pyspark
$ docker-compose up ## mysql pyspark airflow(postgresql) 컨테이너실행
- (docker-compose.yml에서 3개의 container는 본인의 volumes에 맞게 수정한다.)
$ docker exec -it airflow bash
$ docker exec -it [설정이름] bash
- postgreqs 시작
$ service postgresql start
- 로컬 터미널에서
$ docker exec -it -d airflow service postgresql start
$ nano /root/airflow/airflow.cfg
# dags_folder = /root/airflow/dags
dags_folder = /home/pyspark/airflow/dags
# base_log_folder = /root/airflow/logs
base_log_folder = /home/pyspark/airflow/logs
# plugins_folder = /root/airflow/plugins
plugins_folder = /home/pyspark/airflow/plugins
# default_timezone = utc
default_timezone = Asia/Seoul
# executor = SequentialExecutor
executor = LocalExecutor
$ airflow webserver
- 로컬 터미널에서
$ docker exec -it -d airflow airflow webserver
-
https://localhost:8090으로 접속하면 airflow화면을 볼 수 있다.
-
id : admin
-
password : admin
$ cd Airflow
$ docker run -it -d -p 8090:8080 -v ~/workspace:/home -e LC_ALL=C.UTF-8 --name airflow6 jo1013/airflowex:0.06
$ docker run -it -d -p [연결로컬포트]:[연결도커포트] -v [로컬디렉터리]:[컨테이너디렉터리] -e LC_ALL=C.[인코딩방식] --name [설정할이름] [dockerhubid]/[imagename]:[tag]
$ sudo su - postgres
$ psql
$ CREATE DATABASE airflow;
$ CREATE USER timmy with ENCRYPTED password '0000';
$ GRANT all privileges on DATABASE airflow to timmy;
$ \c airflow
$ GRANT all privileges on all tables in schema public to timmy;
$ \q
$ exit
$ pg_createcluster 13 main
$ pg_ctlcluster 13 main start
# $ cd /etc/postgresql/13/main
# $ nano pg_hba.conf
# IPv4 local connections:
host all all 0.0.0.0/0 md5
$ service postgresql restart
# sql_alchemy_conn = sqlite:////root/airflow/airflow.db
# sql_alchemy_conn = postgresql+psycopg2://timmy:[email protected]/airflow
# docker hub에서는 가능햇으나 docker-compose에서는 단일 컨테이너과 IP Adress가 달라진다.
sql_alchemy_conn = postgresql+psycopg2://timmy:0000@localhost/airflow
# --> 같은 docker (컨테이너) 내에서 postgresql이 작동하므로 localhost로 고친다.
- sql_alchemy_conn에 localhost를 적으면 해당 컨테이너를 찾아가지 못하기 때문에 postgres컨테이너의 IP를 넣어줘야한다.
$ ifconfig
$ cd /etc/postgresql/13/main
$ nano pg_hba.conf
IPv4 local connections:
host all all 0.0.0.0/0 md5
$ service postgresql restart
$ cd Airflow
$ mkdir dags
$ mkdir logs
$ airflow db init
$ docker commit postgres postgres:airflow
$ cd home
$ nano makeuser.py
makeuser.py를 ~/airflow_home 위치로 수정
$ cp makeuser.py airflow
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user.email = '[email protected]'
user.password = 'sunny'
user.superuser = True
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
$ airflow users create \
--username admin \
--firstname FIRST_NAME \
--lastname LAST_NAME \
--role Admin \
--email [email protected]
- db 초기화 (postgres 'airflow' table )
airflow db init
- In file system terms, a database cluster is a single directory under which all data will be stored. We call this the data directory or data area. It is completely up to you where you choose to store your data. There is no default, although locations such as /usr/local/pgsql/data or /var/lib/pgsql/data are popular. The data directory must be initialized before being used, using the program initdb which is installed with PostgreSQL.
- 보통 위의 글중에 나온 경로와 같이 경로 설정을 하지만 꼭 그럴 필요는 없다는 내용~
---
-
Airflow DAG는 태스크로 구성된다.
-
각 태스크는 오퍼레이터 클래스를 인스턴스화하여 만든다. 구성한 오퍼레이터 인스턴스는 다음과 같이 태스크가 된다. my_task = MyOperator(...)
-
DAG가 시작되면 Airflow는 데이터베이스에 DAG 런 항목을 만든다.
-
특정 DAG 런 맥락에서 태스크를 실행하면 태스크 인스턴스가 만들어진다.
-
AIRFLOW_HOME은 DAG 정의 파일과 Airflow 플러그인을 저장하는 디렉터리이다.
-> 버전이 달라서인지 위 출처의 튜토리얼을 따라하다보면 import 오류가 발생하는데 dags/test_operators.py 에서
from airflow.operators import MyFirstOperator
를
from my_operators import MyFirstOperator
from [filename] import [classname]
으로 고쳐주면 된다.
버전 변경으로 인한 오류로 보인다.?
$ docker run -it --rm -p 8888:8888 -p 8000:8000 -v ~/workspace:/home jo1013/pyspark:0.05
$ docker exec -it py_spark bash
$ docker exec -it [container id or container name] bash
$ jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser
$ docker run -n db-mysql -e MYSQL_DATABASE=testdb - MYSQL_ROOT_PASSWORD=root - TZ=Asia/Seoul -p 3306:3306 -c --character-set-server=utf8mb4 -c --collation-server=utf8mb4_unicode_ci
$ docker run --name db-mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql
$ airflow dags list
$ airflow tasks list
$ jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser
로컬터미널에서 ip 주소 확인
$ ifconfig
*그전에 해당컨테이너와 명령어 받는 컨테이너에 ssh 설치하고명령어 받는 컨테이너에 /etc/ssh/sshd_config 에서 PermitRootLogin 을 yes로 고쳐주어야함 (절대X) (보안 위험)
- Airflow DB에 접속정보를 저장하고 operator에서는 불러서 쓸 수 있는 SSH Connection을 설정해서 사용
- 추가로 가능하다면 외부 secret manager 형 서비스를 사용하시는 것을 권장드립니다.
$ ssh-keygen -t rsa
- id_rsa: 비밀키
- id_rsa.pub: 공개키
실행하는 컨테이너에서 사용자를 추가
$ useradd airflow
$ useradd [유저]
su - airflow
$ mkdir .ssh
$ chown -R airflow:airflow /home/workspace
$ chown -R 계정명:계정명 [홈디렉터리경로]