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依賴關係?

回答

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依賴關係是否比在每臺機器上運行配置shell腳本更優雅?這似乎是如此。讓我知道你是否感覺不同。 – charmoniumQ