BASH 오퍼레이터 & 쉘 스크립트 수행

우상욱·2024년 3월 21일

Airflow Master Class

목록 보기
6/24

1. 쉘 스크립트란?


  • Unix/Linux Shell 명령을 이용해서 만들어지고, 인터프리터에 의해 한 줄씩 처리되는 파일
  • Echo, mkdir, cd, cp, tar, touch 등의 기본적인 쉘 명령어를 입력하여 작성하며 변수를 입력받거나 For문, if문 그리고 함수도 사용 가능
  • 확장자가 없어도 동작하지만, 주로 파일명에 .sh 확장자를 붙인다.

2. 왜 쉘 스크립트가 필요한가?


  • 쉘 명령어를 이용하여 복잡한 로직을 처리하는 경우
    ex) sftp를 통해 파일을 받은 후 DB에 Insert & tar.gz으로 압축해두기
  • 쉘 명령어 재사용을 위해

3. Worker 컨테이너가 쉘 스크립트를 수행하려면?


  • 문제점
    (1) 컨테이너는 외부의 파일을 인식할 수 없다
    (2) 컨테이너 안에 파일을 만들어주면 컨테이너 재시작시 파일이 사라진다
  • 해결방법
    커스텀한 쉘 파일, 커스텀한 파일들을 plugins에 모아두는 것을 에어플로우 공식적으로 추천한다.

4. 간단한 shell 이용하기


  • plugins/shell/select_fruit.sh
    간단하게 $1은 첫번째 입력 변수를 뜻합니다.
    아래의 명령은 첫번째 입력 변수를 출력하라는 뜻입니다.
echo $1
  • 파일을 만들면 .sh 파일은 처음엔 실행 권한이 없습니다.
ls -al

  • 실행 권한을 주려면 chmod 명령을 이용합니다.
    참고로 파일에 적용된 권한 또한, 도커 컨테이너에 업데이트 됩니다.
chmod +x ./select_fruit.sh
  • 권한을 받고 다음과 같이 입력해봅니다.
./select_fruit.sh WSW
  • 그러면 아까 명령어에 맞춰서, 첫번째 입력 변수를 출력합니다.

  • 그럼 쉘 스크립트를 조금 더 응용해보겠습니다.

FRUIT=$1
if [ $FRUIT == APPLE ]; then
        echo "You selected Apple!"
elif [ $FRUIT == ORANGE ]; then
        echo "You selected ORANGE!"
elif [ $FRUIT == GRAPE ]; then
        echo "You selected GRAPE!"
else
        echo "You selected Nothing!"
fi

5. bash operator 사용해보기


bash operator를 이용해서 DAG를 만들어봅니다.
DAG를 실행하는 주체는 Worker이기 때문에, Worker 컨테이너의 bash를 사용합니다.

from airflow import DAG
from airflow.operators.bash import BashOperator
import datetime
import pendulum

from airflow import DAG
from airflow.operators.bash import BashOperator
import datetime
import pendulum

with DAG(
    dag_id="dags_bash_select_fruit",
    schedule="10 0 * * 6#1",
    start_date=pendulum.datetime(2023, 3, 1, tz="Asia/Seoul"),
    catchup=False,
) as dag:
    t1_orange = BashOperator(
        task_id="t1_orange",
        bash_command="/opt/airflow/plugins/shell/select_fruit.sh ORANGE",
    )

    t2_avocado = BashOperator(
        task_id="t2_avocado",
        bash_command="/opt/airflow/plugins/shell/select_fruit.sh AVOCADO",
    )

t1_orange >> t2_avocado


6. DAG UNPAUSE 관련


만약 DAG를 UnPause 했을 때, 즉 DAG를 처음 실행했을 때, 오늘 날짜가 Data Interval 안에 있다면, 기본적으로 이전 execution_date로 DAG를 동작시킵니다.
반면 Data Interval보다 큰 End date보다 큰 시점에 있다면, DAG를 동작시키지 않습니다. 이 때 만약 실행시켜주고 싶다면, Trigger DAG를 이용해서 실행시켜줍니다.

profile
데이터엔지니어

0개의 댓글