티스토리 뷰

반응형

airflow 에서는 WebHdfsSensor 라는게 존재해서, api 를 통해 특정파일이 존재하는지 체크하고 loop 를 돌면서 체크하는 방법이 존재한다. 그렇다면 간단하게 쉘스크립트로 특정 파일이 생겼는지 확인하는 방법은 없을까? 결론부터 말하면 hadoop 명령어에 파일 존재여부를 테스트하는 명령어가 존재한다. 아래와 같이 명령하면 exit 코드가 0일 경우는 파일이 존재하지만, 그 이외에는 파일을 찾을수 없다는 의미가 된다. 하지만, 파일이 생성될때까지 sleep 하면서 기다리는 방법은 없을까?

hadoop fs -test -f <HDFS_파일경로>

 

hdfs 파일  생성여부 대기하기

위 방법을 응용하면, loop 를 돌리고 파일이 존재할때까지 sleep 을 주면서 주기적으로 체크하는것이 가능해진다.

이러면 특정 HDFS 경로에 .SUCCESS 파일이 생성되면 다음 로직을 실행하도록 대기를 거는것이 가능하다.

 

예를 들어, hdfs_sensor.sh 라는 쉘스크립트를 아래와 같은 만들어서 활용한다면 특정 파일이 생성될때까지 주기적으로 체크하면서 대기하는것이 가능하다.  (체크중 파일이 생성되면 아래와 같이 SUCCESS 로 끝나고, 타임아웃 넘으면 FAILED 메시지를 남긴다)

$ sh hdfs_sensor.sh hdfs://myhadoop/user/gildong/export/sample/ymd=2023-02-02/.SUCCESS 
[WAIT] INTERVAL 60 sec (1/10) : hdfs://myhadoop/user/gildong/export/sample/ymd=2023-02-02/.SUCCESS
[WAIT] INTERVAL 60 sec (2/10) : hdfs://myhadoop/user/gildong/export/sample/ymd=2023-02-02/.SUCCESS
[WAIT] INTERVAL 60 sec (3/10) : hdfs://myhadoop/user/gildong/export/sample/ymd=2023-02-02/.SUCCESS
[WAIT] INTERVAL 60 sec (4/10) : hdfs://myhadoop/user/gildong/export/sample/ymd=2023-02-02/.SUCCESS
[SUCCESS] FIle Exist : hdfs://myhadoop/user/gildong/export/sample/ymd=2023-02-02/.SUCCESS

 

 

- hdfs_sensor.sh

#!/bin/bash
# -----------------------------------
# HDFS 파일의 존재여부를 대기한다.
# ./hdfs_sensor.sh <HDFS_PATH> <TIMEOUT_SEC> <INTERVAL_SEC>
# -----------------------------------
HDFS_CHECK_OPTION=${HDFS_CHECK_OPTION:-"-f"}
INTERVAL_SEC=${3:-60}
TIMEOUT_SEC=${2:-$INTERVAL_SEC}
HDFS_PATH=$1
_LOOP_SIZE=$(expr ${TIMEOUT_SEC} / ${INTERVAL_SEC})
_CNT=0

# 체크할 HDFS 경로를 체크한다 (필수값)
if [ -z "$HDFS_PATH" ]; then
 echo "[ERROR] $0 <HDFS_PATH> <TIMEOUT_SEC> <INTERVAL_SEC>"
 exit -1
fi

while :
do
  _CNT=$(expr $_CNT + 1)
  hadoop fs -test ${HDFS_CHECK_OPTION} "${HDFS_PATH}" 2>/dev/null

  if [ "$?" == 0 ]; then
  	echo "[SUCCESS] File Exist : ${HDFS_PATH}"
    exit 0
  fi
  if [ $_CNT -ge $_LOOP_SIZE ]; then
    echo "[FAILED] INTERVAL ${INTERVAL_SEC} sec (${_CNT}/${_LOOP_SIZE}) : ${HDFS_PATH}"
    exit 1
  else
    echo "[WAIT] INTERVAL ${INTERVAL_SEC} sec (${_CNT}/${_LOOP_SIZE}) : ${HDFS_PATH}"
    sleep $INTERVAL_SEC
  fi
done
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함