Oozieを通じてsh
スクリプトを実行しようとしていますが、問題が発生しています。
プログラム "script.sh"を実行できません(ディレクトリ "/ mapred/local/taskTracker/Dell/jobcache/job_201312061003_0001/attempt_201312061003_0001_m_000000_0/work"):Java.io.IOException:error = 2、No such file or directory。
必要な手順を教えてください。
このエラーは本当にあいまいです。この問題の解決に役立ったいくつかの問題を次に示します。
-Kerberos化されたクラスターでoozieワークフローを実行している場合は、Kerberos Keytabを引数として渡して認証を行ってください。
...
<Shell>
<exec>scriptPath.sh</exec>
<file>scriptPath.sh</file>
<file>yourKeytabFilePath</file>
</Shell>
...
-シェルファイル(scriptPath.sh)で、最初の行のシェル参照を削除するようにしてください。
#!usr/bin/bash
実際、このシェル参照がすべてのデータノードにデプロイされていない場合、このエラーコードが発生する可能性があります。
次のようなHDFSの完全なパスを与えるようにしてください
<exec>/user/nathalok/run.sh</exec>
<file>/user/nathalok/run.sh#run.sh</file>
そして、job.propertiesでライブラリのパスが正しく記述されていることを確認し、workflow.xml
oozie.libpath=hdfs://server/user/oozie/share/lib/lib_20150312161328/oozie
oozie.wf.application.path=hdfs://bcarddev/user/budaledi/Teradata_Flow
他の人が言ったことに加えて、これはシェルスクリプトが間違った行末を持っていることが原因である可能性があります(WindowsのCRLFなど)。少なくともこれは私に起こりました:)
workflow.xml:
...
<Shell>
<exec>script.sh</exec>
<file>scripts/script.sh</file>
</Shell>
...
Hdfsの同じフォルダーにscripts/script.shがあることを確認してください。
Oozie Shellアクションは、ランダムなHadoopノードで実行されます。つまり、Oozieサーバーが実行されているマシン上でローカルに実行されません。 Oleksiiが言うように、スクリプトがジョブを実行するノード上にあることを確認する必要があります。
シェルアクションとsshアクションを実行する次の完全な例を参照してください。
https://github.com/airawat/OozieSamples/tree/master/oozieProject/workflowShellActionhttps://github.com/airawat/OozieSamples/tree/master/oozieProject/workflowSshAction
shellファイルがプロジェクトの相関ディレクトリに存在する場合。その後、それはあなたのシェルファイル形式がこのエラーの原因です。 dos2linux:dos2linux xxxx.shを使用して、形式をdosからlinuxに変換する必要があります。
また、シェルスクリプトがUNIXに準拠していることを確認してください。これらのシェルスクリプトがWindows環境で記述されている場合、ウィンドウ固有の行末(EOL)が追加され、これらのスクリプトはoozieによって認識されません。そのため、oozie Shellアクションで「そのようなファイルまたはディレクトリが見つかりません」と表示されます。