私はoozieワークフローがそれを認識できるようにHDFSに保存されているシェルスクリプトを実行しています。私が使っているこのスクリプトを実行してください。
hadoop fs -cat script.sh |exec sh
ただし、インラインパラメータをスクリプトに渡す必要があります。 CLIではちょうどします。
./script.sh arg1
次に、$ 1で変数をエコーします。 HDFSに保存されているスクリプトで同じことを行う方法を見つけようとしています。
答え1
sh
標準入力ストリームから読み取るすべてのスクリプトを実行できますsh -s
。ただし、標準入力ストリームはスクリプトを読み取るために使用されるため、標準入力の入力を必要とするユーザー対話は期待どおりに機能せず、スクリプトは標準入力ストリームから他のデータを読み取ることはありません。
あなたの場合、hadoop
コマンドはそれを実行するために使用できるスクリプトを提供しますsh -s
。sh -s
シェルに渡すコマンドラインオプションを追加します。次のコードでは、ラッパースクリプトのコマンドライン引数が呼び出しスクリプトにそのまま渡されます。
#!/bin/sh
hadoop fs -cat script.sh | sh -s "$@"
パイプラインの各部分がサブシェルで実行されるため、exec
呼び出しを使用する必要はありません。sh -s
答え2
次の方法を試してみてください。 hadoop fs cat(プロセス置換から)への別々の呼び出しを使用して、各ファイルを検索して読み取り用に開くことができるように、script.shにファイル名として提供します。
# Adjust the hdfs: URLs as necessary
hadoop fs -cat hdfs://path_to_script/sample.sh | exec bash \
<(hadoop fs -cat hdfs://param1) \
<(hadoop fs -cat hdfs://param2) \
<(hadoop fs -cat hdfs://param3) \
<(hadoop fs -cat hdfs://param4)
script.sh がすでに hdfs から読み取る方法を知っていれば、
hadoop fs -cat hdfs://path_to_script/script.sh | exec bash -s param1 param2 param3 param4
それで十分だと思います。 -sオプションはbashに標準入力からスクリプトを読み取るように指示し、param1を実行するスクリプト名で間違えないようにします。