0
我寫了一個Spark腳本,依賴於six
和各種其他python包。用谷歌雲數據噴射器上的spark來管理python依賴關係
$ cat ./test_package/__init__.py
from six.moves.urllib.request import urlopen
def download_size(url):
return len(urlopen(url).read())
因此,我寫了一個setup.py
,它聲明這種依賴關係。
$ cat ./setup.py
from setuptools import setup
setup(
name="Test App",
packages=['test_package'],
version="0.1",
install_requires=['six>=1.0'],
然後在我的火花劇本,我有要求包裝
$ 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()
如果我運行
$ ./test.py
它工作正常代碼。但是,如果我嘗試使用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雲數據空間預配置的Apache Spark集羣上管理python依賴關係?
「你只是手動安裝了你的額外的python包」,但egg文件被添加到'sc.addPyFile(glob('dist/Test_App - *。egg')[0])''和' setup.py'列出了所需的軟件包,因此我希望每個工作人員都可以接收,解壓並安裝egg文件。爲什麼這隻會發生在Python 2? – charmoniumQ
在egg文件中打包python依賴關係是否比在每臺機器上運行配置shell腳本更優雅?這似乎是如此。讓我知道你是否感覺不同。 – charmoniumQ