필요한 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