Jost Do It.

그냥 IT해.

서버 및 환경/Utils

[Airflow] 에어플로우 BashOperator 에러 발생 안할 때 해결 방법

그냥하Jo. 2023. 1. 25. 14:47
반응형

문제 상황

 

에어플로우 BashOperator를 통해 작업을 dag에 걸어줬을 때, 에러가 발생했음에도 정상적으로 작동됐다고 체크된 경우가 있었다.

 

 

 

위 경우도 원래 4초짜리 task가 절대 아님에도 4초만에 정상적으로 작동이 완료됐다고 나와 에러 발생이 의심되는 상황이었다.

 

 

 

 

 

그래서 로그를 살펴보니 특정 라이브러리 로드를 안해줘서 에러가 발생함을 알 수 있었다.

 

그럼 왜 Airflow는 해당 dag에서 에러가 발생했음에도 정상적으로 작동했다고 결과를 출력한 것일까?

 

 

 

 

문제 발생 이유

 

파이썬같이 우리가 익숙한 프로그래밍 코드는 순차적으로 코드를 실행하다가 특정 line에서 에러가 발생하면

 

해당 line에서 에러를 발생시키고 실행을 멈추게 된다. 즉, 뒷 line은 실행하지 않는다.

 

 

 

하지만 Bash shell에서는 각 line을 실행하다가 에러가 발생하더라도, 해당 line의 상태만 변경시키고 뒷 line들은 실행한다.

 

그래서 마지막 line이 정상적으로 실행되면, 해당 shell의 상태는 정상적으로 실행됐다고 판단하는 것이다.

 

 

 


 

 

bash shell에서 종료 상태를 확인하는 예제를 통해서 확인해보자.

 

 

 

 

다음으로 간단한 shell script 파일 test.sh 을 만들어보자.

 

# test.sh

eeee # 없는 명령어를 입력해 에러 발생시키기

 

그리고 shell에서 test.sh를 실행하고 상태를 확인하면 아래와 같이 나온다.

sh test.sh 	# test.sh 쉘파일 실행
>>> test.sh: 1: test.sh: eeee: not found	# 해당 명령어를 찾을 수 없다는 에러메시지 출력

echo $?		# 마지막 실행한 명령어의 상태 확인
>>> 127	# 명령어 실행 상태가 127임을 출력

 

test.sh 를 실행하고 명령어 상태를 확인하면 127이 출력된다.

 

보통 종료 상태가 성공(success)일 때 0을 출력하고, 그 외 에러는 1~255로 출력된다.

 

즉 위 sh파일이 에러(127) 상태임을 출력한다.

 

 

 

 

 

다음은 위 test 파일에서 2를 출력하는 정상 명령어를 추가한 test2.sh 파일을 실행해보자.

 

# test2.sh

eeee # 없는 명령어를 입력해 에러 발생시키기
echo 2 # 2를 출력

 

 

그리고 상태를 확인하면 아래와 같이 나온다.

sh test2.sh 	# test2.sh 쉘파일 실행
>>> run.sh: 1: run.sh: eeee: not found
>>> 2


echo $?		# 마지막 실행한 명령어의 상태 확인
>>> 0

 

그러면 상태가 0으로 출력된다.

 

즉, 위 eee 명령어에서 에러가 발생했더라도 다음 line의 echo 명령어가 정상적으로 동작했기 때문에 해당 쉘 상태는

 

최종적으로 0(정상)으로 출력된다.

 


 

결국 중간에 에러가 발생하더라도 쉘 상태는 마지막 line에 의해 상태가 결정된다.

 

따라서 에어플로우는 마지막 line이 정상적으로 동작했으면 해당 shell이 정상적으로 작동했다고 판단하는 것이다.

 

 

 

해결 방법

 

해결방법은 간단하다.

 

에어플로우 bash operator 내 명령어 앞에 set -e 옵션을 앞에 걸어주면 중간에 발생하는 에러를 인식하고 failed 메시지가 출력된다.

 

test_dag = BashOperator(
    task_id = "test_dag",
    bash_command="set -e; /home/user/run.sh")

 

 

이외에도 shell script 내에 조건문을 주고, 에러 발생 시 특정 상태로 종료(exit) 시킬 수 있으나, 에어플로우에서는 위 방법이 가장 간단해 보인다.

 

 

참조

반응형