0

Я написал скрипт Spark, который зависит от six и различных других пакетов python.Управление зависимостями на python с искрою на google cloud dataproc

$ 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, но в середине MapReduce я получаю это на каждом узле работника:

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' 

Как я управлять зависимостями python с облачным источником данных, установленным в Google cloud-пакете Apache?

ответ

1

Поскольку рабочие задачи выполняются на рабочих узлах, и вы только вручную устанавливали дополнительные пакеты python, рабочие узлы не имеют такой же конфигурации, что и ваш главный узел.

Вы должны использовать Dataproc initialization actions для запуска сценариев настройки на всех узлах кластера при развертывании кластера. Для переменных окружения, таких как PYSPARK_PYTHON, вам, вероятно, необходимо добавить эти настройки в /etc/spark/conf/spark-env.sh.

+0

«Вы только вручную установили дополнительные пакеты python», однако файл яиц добавлен в контекст искры с помощью sc_addPyFile (glob ('dist/Test_App - *. Egg') [0]) 'и' setup.py' перечисляет необходимые пакеты, поэтому я ожидаю, что каждый рабочий получит, распакует и установит файл яйца. Почему это происходит только с python 2? – charmoniumQ

+0

Является ли упаковка зависимостей python в файле яйца более элегантным решением, чем запуск сценария оболочки конфигурации на каждой машине? Казалось бы, так. Дайте мне знать, если вы чувствуете себя иначе. – charmoniumQ

Смежные вопросы