728x90
반응형

에러 발생

airlfow 를 사용하다가 아래와 같은 에러가 발생했다.

airflow.exceptions.AirflowException: Invalid arguments were passed to _PythonDecoratedOperator (task_id: check_steps__1). Invalid arguments were:
**kwargs: {'provide_context': False}

 

에러 내용은 Invalid arguments were: **kwargs: {'provide_context': False}  라는 내용으로 default_args 에 설정해준 provide_context 의 값이 False 되어있어서 발생한 에러로 보였다.

 

에러가 났을 때 dag default_args 의 내용은 다음과 같았다.

default_args={
	...,
	"provide_context": False,
	...,
},

 

그래서 provide_context 의 값을 True 로 변경해주었더니 바로 에러가 사라졌다.
예상되는 내용으로는 arguments 로 context 의 값을 사용하고 싶다면 True 로 설정해주어야 하는 것 같다는 추측일뿐 정확하게 이해하지 못한 것 같아서 찾아보려고 한다.

 

default_args 가 무엇인지

사용한 부분을 보면 default_args 에서 설정해주는 것으로 보인다.

 

이 글을 작성하기 전에 airflow default_args 에 대해서 무엇인지 간단하게 정리해두었다.

 

airflow Default Arguments

airflow 에서 DAG 를 생성할 때 사용되는 default arguments 에 대해서 정리해보려고 한다. Default Arguments default_args 에 대해서 이해하기 위해 airflow concept 에서 다음과 같이 확인할 수 있었다. https://airflow.a

jaynamm.tistory.com

 

따라서, 위에서 내가 DAG 에 provide_context 라는 매개변수를 설정했다는 말은
모든 Operator 에게 provide_context 를 적용한다는 말이고 왜 적용해주어야 하는지 찾아봐야겠다.

 

provide_context 에 대해서 찾아보려고 했는데 내가 구글에서 잘 찾지 못하는 것 같아서 결국에는 GPT 에게 물어보았다.
이 내용이 정확한지는 알 수 없지만 어느 정도 맥락 정도는 이해하는데 참고할 수 있을 것이라고 생각한다.

 

 

provide_context 가 무엇을 의미하지

먼저 provide_context 는 사용자 정의 Operator 나 Task 를 정의할 때 사용되는 매개변수라고 한다. 
Airflow 는 각 Task 가 실행될 때 context 라는 dictionary 타입의 정보를 전달한다. 
이 context 에는 Task 의 실행환경에 대한 다양한 메타데이터와 정보가 포함되어 있다고 한다. provide_context 매개변수를 사용하면 context 를 사용자 정의 Operator 나 Task 의 함수에 인수로 포함시킬 수 있고 실행 날짜나 Task 인스턴스의 세부 정보 등을 접근할 수 있다.

 

간단하게 정리해보자면 Airflow 에서 DAG 를 실행하게 되면 context 에 DAG 에 대한 정보가 들어있고 context 를 통해서 DAG 의 정보를 가지고 올 수 있다는 것을 알 수 있다.

따라서 default_args 에 provide_context 를 설정하게 되면 모든 Operator 에서 DAG 에 대한 정보를 context 를 통해서 가져올 수 있다는 말이다.

 

결론은 보다 더 이해하기 위해서는 context 에 대한 이해도 필요하다고 느꼈다.

 

 

provide_context 가 왜 필요하지

그럼 추가로 provide_context 가 왜 필요한지에 대해서도 찾아보았다.

 

provide_context 가 필요한 이유는 Apache Airflow 의 동작 방식과 관련이 있다고 한다.
Airflow 는 Task 간의 의존성을 정의하고 실행하기 위한 워크플로우 관리 도구라고 알고 있다. 여러 Task 가 동일한 DAG 에서 실행될 때 각 Task 는 실행 환경에 대한 정보를 가지고 있어야 한다. 

 

따라서 provide_context=True 로 설정하게 되면 Airflow 가 각 Task 에 실행 환경에 대한 정보를 제공할 수 있고 Task 가 실행되는 동안 유연하고 동적인 작업을 수행할 수 있게 도와준다고 한다. 또한 Task 간 상호작용을 조율하는 역할도 하고 필요한 정보에 쉽게 접근할 수 있게 도와준다고 한다.

 

 

에러가 발생한 이유

그럼 내가 겪은 에러를 다시 확인해보면 provide_context=False 로 설정해주었기 때문에 각 Task 이 실행 환경에 대한 정보에 접근할 수 없었기 때문에 Task 를 실행하는 과정에서 에러가 발생했던 것으로 보인다.

 

 

airflow 기본 설정은 어떻게 되어있지

그럼 default_args 에 설정하지 않더라도 provide_context 에 대한 기본 값이 True 로 설정되어있는지 궁금해서 찾아보니 다음과 같았다.

 

Airflow 의 기본 동작은 일반적으로 provide_context=True 로 설정이 되어있다고 한다.
따라서 일반적인 경우에는 provide_context 를 명시적으로 설정해주지 않아도 된다고 한다. ㅎㅎ

 

하지만 사용자가 직접 정의한 Operator 등에 대해서는 명시적으로 provide_context=True 라는 설정을 해주는 것이 좋다.
설정을 해야 다른 Operator 와 동일하게 실행 환경에 대한 정보에 접근할 수 있기 때문이다.

 

 

정리하기

자 그럼, 지금까지 알아본 내용에 대해서 정리해보자.

Airflow provide_context 는 DAG 에서 여러 Task 나 Operator 가 실행될 때 context 를 전달해준다.
context 에는 실행 환경에 대한 정보가 들어있고 이 context 를 통해 Task 나 Operator 는 실행 환경에 대한 메타데이터에 대한 정보에 접근할 수 있게 된다.

Airflow 에서 기본적으로 provide_context=True 로 설정되어 동작한다고 한다. 
다만 provide_context 설정이 필요한 경우는 사용자가 직접 정의한 Operator 등에 대해서 명시적으로 설정해주는 것이 좋다고 한다.

 

결과적으로 나는 직접 정의한 Operator 를 사용하지 않았기 때문에 굳이 default_args 에 명시할 필요가 없었기 때문에 제거해주었다.
물론 airflow 의 동작 과정에 대한 이해가 많이 부족하다는 것을 느꼈던 것 같다.

추가로 provide_context 에 대해서 찾아보니 PythonOperator 에 대한 이슈가 많이 보였고 Airflow 를 사용하면서 PythonOperator 에 provide_context 와 관련된 에러가 발생한다면 해당 내용에 대해서 찾아보면 좋을 것 같다.

 

뭔가 두서 없이 적은 것 같은데 더 이해하고나서 다시 한 번 정리하는 시간을 가져야 할 것 같다.

728x90
반응형
복사했습니다!