복붙노트

[HADOOP] Hive가 실패하면 Bash 스크립트 중지

HADOOP

Hive가 실패하면 Bash 스크립트 중지

폴더를 반복하고 모든 * .hql 파일을 처리하는 bash 스크립트가 있습니다. 때로는 하이브 스크립트 중 하나가 실패하고 (구문, 리소스 제한 등) 스크립트가 실패하는 대신 다음 .hql 파일로 계속 진행됩니다.

어쨌든 bash가 나머지를 처리하지 못하게 할 수 있습니까? 아래는 내 샘플 bash입니다.

for i in `ls ${layer}/*.hql`; do
      echo "Processing $i ..."
      hive ${hiveconf_all} -hiveconf DATE=${date} -f ${i} &
    if [ $j -le 5 ]; then
       j=$(( j+1 ))
    else
      wait
      j=0
    fi
  done

해결법

  1. ==============================

    1.이전 명령의 프로세스 완료 상태를 확인하고 exit 명령을 호출하여 루프를 표시합니다.

    이전 명령의 프로세스 완료 상태를 확인하고 exit 명령을 호출하여 루프를 표시합니다.

     (( $? == 0 )) && exit 1
    

    하이브 명령 후 위의 줄을 소개하고 트릭을 수행해야합니다.

  2. ==============================

    2.더하다

    더하다

    set -e
    

    스크립트 상단으로

  3. ==============================

    3.병렬 프로세스를 실행하고 완료 될 때까지이 템플리트를 사용하십시오. 날짜, 레이어, hiveconf_all 및 기타 변수를 추가하십시오.

    병렬 프로세스를 실행하고 완료 될 때까지이 템플리트를 사용하십시오. 날짜, 레이어, hiveconf_all 및 기타 변수를 추가하십시오.

    #!/bin/bash
    set -e
    
    #Run parallel processes and write their logs
    log_dir=/tmp/my_script_logs
    for i in `ls ${layer}/*.hql`; do
          echo "Processing $i ..."
          #Run hive in parallel and redirect to the log file
          hive ${hiveconf_all} -hiveconf DATE=${date} -f ${i} 2>&1 | tee "log_dir/${i}".log &
    done
    
    #Now wait for all processes to complete
    FAILED=0
    
    for job in `jobs -p`
    do
       echo "job=$job"
       wait $job || let "FAILED+=1"
    done
    
    if [ "$FAILED" != "0" ]; then
        echo "Execution FAILED!  ($FAILED)"
        #Do something here, log or send message, etc
        exit 1
    fi
    
    #All processes are completed successfully!
    #Do something here
    echo "Done successfully"
    

    그런 다음 각 프로세스 로그를 개별적으로 검사 할 수 있습니다.

  4. from https://stackoverflow.com/questions/29082828/stop-bash-script-if-hive-fails by cc-by-sa and MIT license