-
[Airflow] 에어플로우 Main, MySQL 서버 IP 주소 변경으로 인한 Airflow woker 실행 문제 해결(Feat. Docker container)Airflow 2021. 9. 7. 23:50
🙊 배경설명
추천 Airflow를 1.10.9버전에서 1.10.14버전으로 upgrade하면서
Airflow main 서버와 Airflow MySQL 서버 IP 주소가 바뀌었고,
그로인해 이전 IP 주소를 보고 있던 worker는 실행되지 못하고 있었다.
🙈 문제점
keyword_train은 keyword_product 라는 ec2 서버 안의 컨테이너에서 worker로 실행되고 있었고,
새로운 서버의 IP 주소를 설정하기 위해서는 airflow를 처음 실행할 때 생성되는 airflow.cfg에 바뀐 주소값들로 변경해야 했다.
그러나, 문제는 처음 이미지로 빌드되어 컨테이너가 실행될 때 Dockerfile의 기본 명령어가 반영된다는 점이다.
즉, 컨테이너 실행의 베이스가 되는 Dockerfile 내부의 CMD/ENTRYPOINT에 airflow worker의 queue를 지정하는 명령어가 담긴 airflow.sh를 최초(initial) 실행 명령어로 설정되어 있는 듯 하다.
따라서 컨테이너에 접속하여 아래 명령어를 쳐보면,
$ ps -ef
이렇게 PID 1번으로 airflow.sh 파일이 실행되고 있는 것을 볼 수 있다.
airflow.sh $NAME은 아래의 airflow.sh keyword_train과 같은 것으로 echo 명령어로 확인할 수 있다.
아마 이 NAME 변수 또한 Dockerfile 혹은 컨테이너 실행시에 keyword_train이라는 값을 할당하여 설정한 것으로 보인다.
이 airflow.sh 뒤에 오는 $NAME의 역할을 알기 위해서는 airflow.sh 파일의 코드를 볼 필요가 있다.
airflow worker -q $1에서 worker의 queue를 설정할 때 큐 이름을 지정할 수 있고,
큐 이름을 $1, 즉 airflow.sh 파일을 실행하는 명령어에 처음 오는 변수가 $1으로 들어간다.
따라서 airflow.sh $NAME 은 airflow.sh keyword_train과 같은 의미로
컨테이너를 실행할 때, keyword_train이라는 이름의 큐를 설정하여 airflow worker를 실행한다는 것이다.
이때, airflow worker를 실행하기 위한 정보는 airflow.cfg 파일에 있으므로, airflow 버전 up을 하면서 바뀐 IP 주소를 변경해주면 되지만, 이 파일의 정보를 반영하기 위해서는 worker를 재가동해야 한다.
But, 여기서 진짜 문제는! 이미 PID 1에서 airflow.sh 파일이 실행되고 있으므로!
OSError: [Errno 98] Address already in use
다음과 같은 에러메세지를 만나게 된다.
그렇다면, PID 1의 프로세스를 종료하고 다시 실행하는 방법이 있지만,
$ sudo kill -9 1
이렇게 강제 종료해버리면, 해당 컨테이너의 첫 번째 프로세스인 PID 1번이 죽어버렸으므로, 컨테이너도 같이 죽어버리는 문제가 발생한다.
https://brunch.co.kr/@jehovah/35
컨테이너 자세히 뜯어보기
Container 내부가 궁금해서 뜯어보았습니다. | 컨테이너의 시대 최근 쿠버네티스에 대한 관심이 높아지면서 컨테이너를 사용하는 기업들이 점차 늘어나고 있습니다. 컨테이너는 독립적인 공간을
brunch.co.kr
따라서 처음 컨테이너를 띄울 때, 첫 번째 실행 명령어를 주어 Dockerfiled의 CMD를 대체할 방법으로 생각했다.
그 전에, 현재 컨테이너 안에서 airflow.cfg의 airflow main과 airflow mysql IP 주소를 바꾼다음 모든 설정을 반영한 컨테이너 전체를 고대로 docker 이미지로 만들기 위해 docker commit 명령어를 찾아봤다.
🙉 해결방안
docker commit {contianerID} {newImageID}
이렇게하면, 컨테이너의 설정을 담은 새로운 이미지가 생성되어, 해당 이미지를 활용한 새로운 컨테이너를 띄웠다.
docker run -it -d -p 8793:8793 --name airflow_new_recomm -v /var/run/docker.sock:/var/run/docker.sock airflow_new_recomm ./airflow.sh keyword_train
🌟 docker image, container 이름: airflow_new_recomm
이렇게하면, airflow.cfg의 바뀐 IP 주소를 참조하여 airflow worker가 정상적으로 실행될줄 알았지만, error 가 났고, 관련 로그들을 확인하기 위해 아래 명령어를 실행했다.
# docker container 바깥에서 docker logs -f {containerID}
로그 내역을 보면 MySQLdb 접속에서 에러가 난 것 같았고, 관련 내용으로 구글링을 한 결과
비밀번호 설정 문제라고 해서 airflow.cfg에 비밀번호 정보도 같이 추가했다.
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yeo31014&logNo=220323630913
#1045 - Access denied for user: (Using password: YES) 에러시 해결방법. phpmyadmin
안녕하세요, 텍스트뷰 입니다 :) 오랫만에 포스팅 하는군요. pma 접속오류가 나서 직접 해결했는데, 어떻게...
blog.naver.com
이후 정상적으로 실행은 됐지만, 그러나 또 다시 같은 error가 나오면서 성공과 실패가 같이 진행되고 있는 찝찝함이 있었다.
결국, 마지막으로 해결했던 문제는 fernet_key 정보도 추가적으로 넣어줘야 했다.
https://yahwang.github.io/posts/86
Airflow 보안 설정하기 (with RBAC) - YA-Hwang 기술 블로그
FAB가 제공하는 기능을 통해 Airflow에 기본 보안을 설정한다.
yahwang.github.io
- db 안에서의 암호화된 통신을 위한 키
- 서로 다른 서버(webserver, scheduler, woker)에서 MySQLdb에 연결해야 하는 상황이기 때문에, 키를 통일시켜줘야 함
- 이상 오늘의 삽질일기 끝!
여기저기 삽질도 해보고
날려도 먹으면서
배우는 게
결국 남는거다
- Z.Sabziller
반응형'Airflow' 카테고리의 다른 글
[Airflow] 에어플로우 worker 중단 현상 해결 (0) 2021.11.19 [Airflow] 에어플로우 DAG Dynamically Generate Serial Tasks (feat. 직렬화 처리) (0) 2021.09.24 [Airflow] Airflow ExternalTask Sensor 생성하기 (0) 2021.08.09 [Airflow] 에어플로우 execution_date DAG 스케줄러 에러(feat.run_id) (0) 2021.07.08 [Airflow] DAG 작성법(Feat. 오늘 날짜/시간 출력하기) (0) 2021.04.21