0

sixと他のさまざまなpythonパッケージに依存するSparkスクリプトを書いています。Googleのクラウドデータパイプでsparkを使ってpythonの依存関係を管理する

このように、私はそのような依存関係を述べているsetup.pyを書いています。

$ cat ./setup.py 
from setuptools import setup 
setup(
    name="Test App", 
    packages=['test_package'], 
    version="0.1", 
    install_requires=['six>=1.0'], 

はその後、私のスパークスクリプトで、私は

$ ./test.py 

を実行する場合、それは正常に動作

$ cat spark_script.py 
#!/usr/lib/spark/bin/spark-submit 
from pyspark import SparkContext 
from glob import glob 
from test_package import download_size 

sc = SparkContext() 
sc.addPyFile(glob('dist/Test_App-*.egg')[0]) 

... 

sc.parallelize(urls).map(download_size).collect() 

パッケージを必要とするコードを持っています。私は、のpython3を使用しようとする場合は、

$ PYSPARK_PYTHON=python3 ./test.py 

マスターノードはtest_packageをインポートすることができますが、マップリデュースの真ん中に私は、各ワーカーノードにこれを取得する:どのように行う

File "/hadoop/yarn/nm-local-dir/usercache/sam/appcache/application_1487279780844_0041/container_1487279780844_0041_01_000003/pyspark.zip/pyspark/serializers.py", line 419, in loads 
    return pickle.loads(obj, encoding=encoding) 
    File "./Test_App-0.1-py2.7.egg/test_package/__init__.py", line 2, in <module> 
    from six.moves.urllib.request import urlopen 
ImportError: No module named 'six' 

Googleのクラウドのpythonの依存関係を管理するdataprocはApache sparkクラスタをプロビジョニングしましたか?

答えて

1

ワーカー・タスクはワーカー・ノードで実行され、追加のPythonパッケージのみを手動でインストールするため、ワーカー・ノードはマスター・ノードと同じ構成を使用できません。

クラスタ展開時にクラスタのすべてのノードでカスタマイズスクリプトを実行するには、Dataproc initialization actionsを使用する必要があります。 PYSPARK_PYTHONのような環境変数の場合は、おそらくそれらの設定を/etc/spark/conf/spark-env.shに追加する必要があります。

+0

"あなたは特別なpythonパッケージを手動でインストールしただけです"しかし、eggファイルは 'sc.addPyFile(glob/dist/Test_App - *。egg ')[0])でスパークコンテキストに追加され、 setup.py'は必要なパッケージをリストしているので、私は各作業員がeggファイルを受け取り、解凍し、インストールすることを期待しています。なぜこれはPython 2でのみ起こりますか? – charmoniumQ

+0

eggファイルのpython依存関係をパッケージ化することは、各マシンで構成シェルスクリプトを実行するよりも洗練されたソリューションと考えられていますか?そうそうだ。あなたが違うと感じたら教えてください。 – charmoniumQ