2017-04-06 13 views
0

내 행동oozie의 distcp 액션과 다른에 HDFS 디렉토리에서 파일을 복사

start_fair_usage는 상태 좋아요로 끝나는하지만 test_copy 반환 /user/comverse/data/${1}_B에서

Main class [org.apache.oozie.action.hadoop.DistcpMain], main() threw exception, null 

나는의 일부를 다른 파일을 많이 가지고 이 파일을 ${NAME_NODE}/user/evkuzmin/output에 복사하고 싶습니다. 그 때문에 나는 필요한 파일에 대한 경로 배열을 보유하고있는 copy_files.sh에서 paths을 전달하려고합니다.

<action name="start_fair_usage"> 
    <shell xmlns="uri:oozie:shell-action:0.1"> 
     <job-tracker>${JOB_TRACKER}</job-tracker> 
     <name-node>${NAME_NODE}</name-node> 
     <exec>${copy_file}</exec>  
     <argument>${today_without_dash}</argument> 
     <argument>${mta}</argument> 
     <!-- <file>${path}#${start_fair_usage}</file> --> 
     <file>${path}${copy_file}#${copy_file}</file> 
     <capture-output/> 
    </shell> 
    <ok to="test_copy"/> 
    <error to="KILL"/> 
    </action> 

    <action name="test_copy"> 
    <distcp xmlns="uri:oozie:distcp-action:0.2"> 
     <job-tracker>${JOB_TRACKER}</job-tracker> 
     <name-node>${NAME_NODE}</name-node> 
     <arg>${wf:actionData('start_fair_usage')['paths']}</arg> 
     <!-- <arg>${NAME_NODE}/user/evkuzmin/input/*</arg> --> 
     <arg>${NAME_NODE}/user/evkuzmin/output</arg> 
    </distcp> 
    <ok to="END"/> 
    <error to="KILL"/> 
    </action> 

start_fair_usage 여기 copy_file.sh

echo ${1} 
echo ${2} 

dirs=(
    /user/comverse/data/${1}_B 
    ) 
args=() 

for i in $(hadoop fs -ls "${dirs[@]}" | egrep ${2}.gz | awk -F " " '{print $8}') 
do 
    args+=("$i") 
    echo "copy file - "${i} 
done 

paths=${args} 
echo ${paths} 
+0

DistCp의 문제점은 무엇입니까? – franklinsijo

+0

@frank 나는'copy_file.sh'에서'test_copy'로 전달하는'paths'가 비어 있다고 생각합니다. 나는 이유를 모른다. –

+0

다른 질문에서 알 수 있듯이, 날짜를 기반으로 파일을 다른 디렉토리에 격리하려고합니다. 그것이 당신이 성취하고자하는 것과 동일하다면 왜 직접'경로 '를 전달하지 않겠습니까? – franklinsijo

답변

0

을 시작 나는 결국 한 것입니다.

<start to="start_copy"/> 

    <fork name="start_copy"> 
    <path start="copy_mta"/> 
    <path start="copy_rcr"/> 
    <path start="copy_sub"/> 
    </fork> 

    <action name="copy_mta"> 
    <distcp xmlns="uri:oozie:distcp-action:0.2"> 
     <prepare> 
     <delete path="${NAME_NODE}${dstFolder}mta/*"/> 
     </prepare> 
     <arg>${NAME_NODE}${srcFolder}/*mta.gz</arg> 
     <arg>${NAME_NODE}${dstFolder}mta/</arg> 
    </distcp> 
    <ok to="end_copy"/> 
    <error to="KILL"/> 
    </action> 

    <action name="copy_rcr"> 
    <distcp xmlns="uri:oozie:distcp-action:0.2"> 
     <prepare> 
     <delete path="${NAME_NODE}${dstFolder}rcr/*"/> 
     </prepare> 
     <arg>${NAME_NODE}${srcFolder}/*rcr.gz</arg> 
     <arg>${NAME_NODE}${dstFolder}rcr/</arg> 
    </distcp> 
    <ok to="end_copy"/> 
    <error to="KILL"/> 
    </action> 

    <action name="copy_sub"> 
    <distcp xmlns="uri:oozie:distcp-action:0.2"> 
     <prepare> 
     <delete path="${NAME_NODE}${dstFolder}sub/*"/> 
     </prepare> 
     <arg>${NAME_NODE}${srcFolder}/*sub.gz</arg> 
     <arg>${NAME_NODE}${dstFolder}sub/</arg> 
    </distcp> 
    <ok to="end_copy"/> 
    <error to="KILL"/> 
    </action> 

    <join name="end_copy" to="END"/> 

    <kill name="KILL"> 
    <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 
    <end name="END"/> 

distcp에서 와일드 카드를 사용하는 것이 가능했기 때문에 bash를 전혀 필요로하지 않았습니다.

또한. 어떤 사람들은 내가 그것을 스칼라로 적도록 권했다.

import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.fs.{FileSystem, Path, FileUtil} 

val conf = new Configuration() 
val fs = FileSystem.get(conf) 

val listOfFileTypes = List("mta", "rcr", "sub") 
val listOfPlatforms = List("B", "C", "H", "M", "Y") 

for(fileType <- listOfFileTypes){ 
    FileUtil.fullyDeleteContents(new File("/apps/hive/warehouse/arstel.db/fair_usage/fct_evkuzmin/file_" + fileType)) 
    for (platform <- listOfPlatforms) { 
    var srcPaths = fs.globStatus(new Path("/user/comverse/data/" + "20170404" + "_" + platform + "/*" + fileType + ".gz")) 
    var dstPath = new Path("/apps/hive/warehouse/arstel.db/fair_usage/fct_evkuzmin/file_" + fileType) 

    for(srcPath <- srcPaths){ 
     println("copying " + srcPath.getPath.toString) 
     FileUtil.copy(fs, srcPath.getPath, fs, dstPath, false, conf) 
    } 
    } 
} 

두 가지 모두 작동합니다. Oozie에서 스칼라 스크립트를 실행하지 않았다고 생각했습니다.