본문 바로가기
Airflow

[Airflow] Airflow Webserver Daemon TroubleShooting

by heed159 2023. 6. 21.

V2.6.2

필요한 Operator를 설치하고 이를 반영하기 위해 Airflow를 재구동하였는데 Airflow Webserver를 실행하니 프로세스가 정상적으로 올라오지 않고 종료되었다.

airflow-webserver에 대한 에러 로그를 기록하는 airflow-webserver.err 파일을 확인해보니 아래와 같은 에러가 발생하였다.

 

Traceback (most recent call last):
  File "/data2/airflow/lib/python3.7/site-packages/lockfile/pidlockfile.py", line 77, in acquire
    write_pid_to_pidfile(self.path)
  File "/data2/airflow/lib/python3.7/site-packages/lockfile/pidlockfile.py", line 161, in write_pid_to_pidfile
    pidfile_fd = os.open(pidfile_path, open_flags, open_mode)
FileExistsError: [Errno 17] File exists: '/data2/airflow/airflow-webserver-monitor.pid'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/data2/airflow/bin/airflow", line 8, in <module>
    sys.exit(main())
  File "/data2/airflow/lib/python3.7/site-packages/airflow/__main__.py", line 48, in main
    args.func(args)
  File "/data2/airflow/lib/python3.7/site-packages/airflow/cli/cli_config.py", line 52, in command
    return func(*args, **kwargs)
  File "/data2/airflow/lib/python3.7/site-packages/airflow/utils/cli.py", line 112, in wrapper
    return f(*args, **kwargs)
  File "/data2/airflow/lib/python3.7/site-packages/airflow/cli/commands/webserver_command.py", line 481, in webserver
    with ctx:
  File "/data2/airflow/lib/python3.7/site-packages/daemon/daemon.py", line 365, in __enter__
    self.open()
  File "/data2/airflow/lib/python3.7/site-packages/daemon/daemon.py", line 357, in open
    self.pidfile.__enter__()
  File "/data2/airflow/lib/python3.7/site-packages/lockfile/__init__.py", line 197, in __enter__
    self.acquire()
  File "/data2/airflow/lib/python3.7/site-packages/daemon/pidfile.py", line 49, in acquire
    super().acquire(timeout, *args, **kwargs)
  File "/data2/airflow/lib/python3.7/site-packages/lockfile/pidlockfile.py", line 88, in acquire
    self.path)
lockfile.AlreadyLocked: /data2/airflow/airflow-webserver-monitor.pid is already locked
Exception ignored in: <bound method Signal._cleanup_receiver of <blinker.base.NamedSignal object at 0x7ff968a40048; 'before-render-template'>>
Traceback (most recent call last):
  File "/data2/airflow/lib/python3.7/site-packages/blinker/base.py", line 433, in _cleanup_receiver
TypeError: 'NoneType' object is not callable

자세히 살펴보니 

FileExistsError: [Errno 17] File exists: '/data2/airflow/airflow-webserver-monitor.pid'

위와 같은 내용이 있다. 이는 이미 Webserver 관련 pid가 존재하기 때문에 발생한 에러이다. 해당 파일을 살펴보자

 

(airflow) [root@pb6 airflow]# cat airflow-webserver-monitor.pid
23043

scheduler 관련 pid도 이미 존재하고 있었다.

(airflow) [root@pb6 airflow]# cat airflow-scheduler.pid
23327

Airflow를 실행하면 기본 경로에 각 서비스별 프로세스 ID가 담긴 .pid 파일들이 생성되고 종료되면 해당 파일들이 삭제되는 구조를 가지고 있다. 하지만 강제적으로 Airflow를 종료(kill)하였을 때는 해당 파일들이 삭제되지 않고 남아 있는 것을 볼 수 있다. 본인 역시 Airflow를 종료할 때 관련 프로세스를 kill 하는 방식으로 종료하였기 때문에 위와 같은 에러가 발생하였던 것이다. 이를 해결하기 위해서는 남아 있는 pid 파일들을 삭제해주면 된다.

이후 Airflow Webserver를 실행하니 정상적으로 올라오는 것을 볼 수 있다.

(airflow) [root@pb6 airflow]# airflow webserver -D
(airflow) [root@pb6 airflow]# airflow scheduler -D > /dev/null