12

からモジュールmain.pyをインポートする MapReduce ジョブが で定義されています。次のように、Hadoop ストリーミングを使用して、このジョブを Hadoop クラスターに送信します。liblib.py

hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -files lib.py,main.py 
    -mapper "./main.py map" -reducer "./main.py reduce" 
    -input input -output output

私の理解では、これによりmain.pyとの両方が各コンピューティング マシンlib.py分散キャッシュ フォルダーlibに配置され、モジュールが で利用できるようになりmainます。しかし、それは起こりません: ログから、ファイルが実際には同じディレクトリにコピーさmainれていることがわかりますが、インポートできずlibImportError.

なぜこれが起こり、どうすれば修正できますか?

アップデート。現在のディレクトリをパスに追加しても機能しませんでした:

import sys    
sys.path.append(os.path.realpath(__file__))
import lib
# ImportError

ただし、モジュールを手動でロードするとうまくいきました。

import imp
lib = imp.load_source('lib', 'lib.py')

しかし、それは私が望むものではありません。では、Python インタープリター.pyが同じディレクトリ内の他のファイルを認識しているのに、それらをインポートできないのはなぜでしょうか? __init__.py空のファイルを同じディレクトリに追加しようとしても効果がないことに注意してください。

4

3 に答える 3

5

Hadoop-Streaming が Python スクリプトを開始するとき、Python スクリプトのパスはスクリプト ファイルが実際にある場所です。ただし、hadoop はそれらを './' で開始し、lib.py (シンボリック リンク) も './' にあります。したがって、次のように lib.py をインポートする前に「sys.path.append("./")」を追加してみてください。 import sys sys.path.append('./') import lib

于 2015-01-27T09:25:20.403 に答える
1

-filesおよび-archiveスイッチは、Hadoop の分散キャッシュ(DC) への単なるショートカットです。これは、zip、tar、および tgz/tar.gz 形式のアーカイブをアップロードして自動的に解凍することもできる、より一般的なメカニズムです。ライブラリが単一のモジュールではなく、構造化された Python パッケージによって実装されている場合は、後者の機能が必要です。

リリース 1.0.0-rc1 以降、 Pydoopでこれを直接サポートしており、mypkg.tgzアーカイブを構築してプログラムを次のように実行できます。

pydoop submit --upload-archive-to-cache mypkg.tgz [...]

関連するドキュメントはhttp://crs4.github.io/pydoop/self_contained.htmlにあり、ここに完全に機能する例があります ( wheelが必要です): https://github.com/crs4/pydoop/tree/master/examples/自己完結型

于 2015-01-27T09:58:47.790 に答える