2016-08-11 1 views
1

플랫 파일을 구문 분석하는 쉘 스크립트가 있고 그 안에있는 각 행에 대해 하이브 스크립트를 병렬로 실행합니다.xargs 병렬 캡처 종료 코드

xargs -P 5 -d $'\n' -n 1 bash -c ' 
    IFS='\t' read -r arg1 arg2 arg 3<<<"$1" 
    eval "hive -hiveconf tableName=$arg1 -f ../hive/LoadTables.hql" 2> ../path/LogFile-$arg1 
    ' _ < ../path/TableNames.txt 

상담자가 하나 개의 자식 프로세스가 실패 그래서 경우에도 각 병렬 처리에서 종료 코드를 캡처 오류 코드 끝에 스크립트를 종료 할 수있는 방법입니다.

불행히도 gnu 병렬을 사용할 수 없습니다.

+0

GNU 병렬을 사용할 수없는 이유에 대해 자세히 설명해 주실 수 있습니까? 이유는 https://oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html에서 다룹니까? –

+1

정보 주셔서 감사합니다. 우리는 gnu를 병렬로 설치해야한다고 생각 했었습니다. (소프트웨어를 설치하는 것은 허용되지 않습니다). 병렬 파일을 복사하여 사용하는 옵션이 있다는 것을 깨닫지 못했습니다. – snate

+0

우리 환경에서 gnu가 병렬로 설치되었습니다. 현재 위의 스크립트는 xargs를 사용합니다. 어떻게 병렬로 바꾸고, 플랫 파일을 구문 분석하고, 각 행에 대해 같은 작업을 수행하고, 종료 상태 캡처와 병렬로 하이브 스크립트를 실행하고 논리를 실패합니다. 감사. – snate

답변

1

나는 당신이 애호가 무언가를보고 있다고 가정하지만, 간단한 해결책은 tmp 파일에 가능한 오류를 저장하고 나중에 그것을 보는 것입니다 :

FilewithErrors=/tmp/errors.txt 
FinalError=0 

xargs -P 5 -d $'\n' -n 1 bash -c ' 
IFS='\t' read -r arg1 arg2 arg 3<<<"$1" 
eval "hive -hiveconf tableName=$arg1 -f ../hive/LoadTables.hql || echo $args1 > $FilewithErrors" 2> ../path/LogFile-$arg1 
' _ < ../path/TableNames.txt 

if [ -e $FilewithErrors ]; then FinalError=1; fi 

rm $FilewithErrors 

return $FinalError 
0

을 의견에 따라 경찰 : A와 설치 사용 GNU의 병렬 man parallel

종료 상태에서 http://git.savannah.gnu.org/cgit/parallel.git/tree/README

의 설명에 따라 개인 또는 최소 설치

Exit status depends on --halt-on-error if one of these are used: success=X, 
    success=Y%, fail=Y%. 

    0  All jobs ran without error. If success=X is used: X jobs ran without 
     error. If success=Y% is used: Y% of the jobs ran without error. 

    1-100 Some of the jobs failed. The exit status gives the number of failed jobs. 
     If Y% is used the exit status is the percentage of jobs that failed. 

    101 More than 100 jobs failed. 

    255 Other error. 

작업이 실패했는지 여부가 아닌 정확한 오류 코드가 필요하면 --joblog mylog을 사용하십시오.

당신은 아마 같은 작업을 수행 할 수 있습니다

cat ../path/TableNames.txt | 
    parallel --colsep '\t' --halt now,fail=1 hive -hiveconf tableName={1} -f ../hive/LoadTables.hql '2>' ../path/LogFile-{1} 

fail=1 하나의 작업이 실패 할 경우 새로운 일자리를 산란 중지하고 작업의 종료 코드로 종료됩니다.

now은 나머지 작업을 종료합니다. 남은 작업을 "자연적인 원인"으로 종료하려면 soon을 대신 사용하십시오.