2017-10-06 11 views
0

私は、DataFlow RunnerでApache Beamパイプラインの内部で使用したいローカルのPythonパッケージを持っています。 https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/(セクションローカルまたは非PyPI依存性)のドキュメントに記載された手順に従いましたが、成功しませんでした。 something.pyを含むファイルでApache BeamローカルPython依存関係

my_common 
├── __init__.py 
└── shared 
    ├── __init__.py 
    └── something.py 

私のパッケージには、以下の構造を有する

def hello_world(): 
    return "Hello" 

パッケージがビルドpython setup.py sdistコマンドを使用していました。

さて、私は次のように設定されたApacheビームパイプラインがあります。

from my_common.shared import something 
logging.info(something.hello_world()) 

私はスケジュールたびに:パイプラインマップ機能の

pipeline_parameters = [ 
    '--project', project_id, 
    '--staging_location', staging_location, 
    '--temp_location', temp_location, 
    '--max_num_workers', 1, 
    "--extra_package", "/absolute/path/to/my/package/my_common-1.0.tar.gz" 
] 


p = beam.Pipeline("DataFlowRunner", argv=pipeline_parameters) 
# rest of the pipeline definition 

一つは、私のモジュールを使用して、次のコードを、持っていますこのパイプラインをDataFlowに渡すと、次のエラーが発生します。

ImportError: No module named shared 

このパッケージ(.tar.gzから)を別の環境にインストールすると、問題なく関数をインポートして実行できます。 DataFlowは、パイプラインを実行する前にパッケージをインストールしないようです。

ローカルのPython依存関係をGoogle DataFlowに管理して展開する適切な方法は何ですか?

//更新: 私は私のパイプラインのために完全に別のフォルダとsetup.pyに私の地元のパッケージを持っている必要があるためhttps://stackoverflow.com/a/46605344/1955346で説明したソリューションは、私のユースケースには十分ではありませんが、すでに私が使用することはできません(一部のコンテンツを持っています外部パッケージのsetup.pyを参照)。

答えて

0

代わりのextra-packagesを通してそれを提供するには、あなたのsetup_fileを定義するために使用setuptoolssetup_file

を使用してそれを提供

from setuptools import setup 

setup(
    name="dataflow_pipeline_dependencies", 
    version="1.0.0", 
    author="Marcin Zablocki", 
    author_email="[email protected]", 
    description=("Custom python utils needed for dataflow cloud runner"), 
    packages=[ 
     'my_common' 
     ] 
) 

を次のように、それは多少なりますと

pipeline_parameters = [ 
    '--project', project_id, 
    '--staging_location', staging_location, 
    '--temp_location', temp_location, 
    '--max_num_workers', 1, 
    "--setup_file", "/absolute/path/to/your/package/my_common" 
] 


p = beam.Pipeline("DataFlowRunner", argv=pipeline_parameters) 
# rest of the pipeline definition 
を次のように --setup_fileパラメータを使用して、それを渡します

/absolute/path/to/your/package/my_commonパッケージが格納されているディレクトリへのパス

+0

問題は、私のパイプラインにいくつかのカスタムコマンドが定義されている '' 'setup.py''をすでに持っていることです。他の方法はありますか? '' 'extra_packages'''の目的は何ですか? –

+0

私はビームを1ヶ月間実験していますが、最初に「extra-packages」パラメータを使ってみましたが、それでも私はそれに恵まれませんでした。ドキュメンテーションは、それがどのように動作するかについて十分にはっきりしていません – Anuj

+0

また、カスタムコマンドとセットアップファイルに 'packages'を提供するのはまったく問題ありません。何らかの理由がありません。カスタムコマンドに影響します。 – Anuj