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クラスタをプロビジョニングしましたか?
"あなたは特別なpythonパッケージを手動でインストールしただけです"しかし、eggファイルは 'sc.addPyFile(glob/dist/Test_App - *。egg ')[0])でスパークコンテキストに追加され、 setup.py'は必要なパッケージをリストしているので、私は各作業員がeggファイルを受け取り、解凍し、インストールすることを期待しています。なぜこれはPython 2でのみ起こりますか? – charmoniumQ
eggファイルのpython依存関係をパッケージ化することは、各マシンで構成シェルスクリプトを実行するよりも洗練されたソリューションと考えられていますか?そうそうだ。あなたが違うと感じたら教えてください。 – charmoniumQ