0

次のようなスクリプトがあります。

#!/bin/bash

function func1() {
  echo "HELLO!"
}
export -f func1

function func2() {
  echo "HI!!"
  func1
}
export -f func2

Hadoop タスクトラッカーをローカルで起動すると、/usr/lib/hadoop/conf/hadoop-env.sh は次のようになります。

# .. few configuration params
# source my_shell_file.sh
# my_function

タスクトラッカーを起動すると、すべて問題ありません。my_function 内にあるいくつかの echo ステートメントを出力します。「mapper.py」ファイルを使用して Hadoop ジョブを開始すると、正常に動作します。my_function に存在する構成パラメーターも使用します。マッパーを次のように宣言すると、問題が発生します

-mapper 'bash -c "func1 ; python mapper.py"'

次に、次のエラーがスローされます。

/bin/bash: func2: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `func2'
/bin/bash: func1: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `func1'

ここで何が起こっているのかわかりません。「bash -c」の代わりに「sh -c」を試しましたが、同じ問題が発生します。

編集:コンソールで「ソース」を取得すると、シェルスクリプトは正常に機能します。コンソール上のシェル ファイルで定義された関数を認識します。

EDIT2: シェル ファイルの正確な内容を追加しました。

4

1 に答える 1

2

これは Hadoop のバグです。

Bash 関数は通常の環境変数として渡されるため、エクスポートはプロセス間で機能します。

foo='() { echo "hello world"; }' bash -c 'foo'

bash で生成された環境変数には複数の行が含まれますが、通常はこれで問題ありません。

ただし、Hadoop Streaming には不適切に記述されたEnvironment クラスSystem.getenv()があり、 の出力を単純に解析して再実装しようとしますenv

複数行の変数を処理しないため、関数が破壊されます。

バグ レポートを送信しようとしましたが、バグ トラッカーのユーザーがいなかったので、メーリング リストに登録したくありませんでした。この修正が必要な場合は、独自のものを提出することをお勧めします。

于 2013-11-01T18:04:54.350 に答える