2017-04-06 4 views
0

私の行動oozieのdistcpアクションで別のHDFSディレクトリからファイルをコピーする

start_fair_usageは、私は、のいくつかを異なるファイルがたくさんある状況オーケーで終わるが、/user/comverse/data/${1}_Btest_copy戻り

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

私はあなたの他の質問から、異なるディレクトリに日付に基づいてファイルを分離したいと思います!それが達成しようとしているのと同じ場合は、 'path'を直接渡すのはなぜですか? – 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でscalaスクリプトを実行しようとしていませんでした。

関連する問題