A agregação de pacotes Python3 ao PySpark resulta na falta de importações

Estou tentando executar um trabalho PySpark que depende de determinadas bibliotecas python3. Eu sei que posso instalar essas bibliotecas no Spark Cluster, mas como estou reutilizando o cluster para vários trabalhos, gostaria de agrupar todas as dependências e passá-las para cada trabalho por meio do--py-files directiva.

Para fazer isso, eu uso:

pip3 install -r requirements.txt --target ./build/dependencies
cd ./build/dependencies
zip -qrm . ../dependencies.zip

Que efetivamente fecha todo o código dos pacotes necessários para serem usados no nível raiz.

No meumain.py Eu posso importar as dependências

if os.path.exists('dependencies.zip'):
    sys.path.insert(0, 'dependencies.zip')

E também adicione o .zip ao meu contexto do Spark

sc.addPyFile('dependencies.zip')

Por enquanto, tudo bem.

Mas, por alguma razão, isso vai evoluir em algum tipo de dependência infernal no Spark Cluster

Por exemplo, correndo

spark-submit --py-files dependencies.zip main.py

Ondemain.py (ou classe) Eu quero usar um panda. O código que irá disparar este erro:

Traceback (última chamada mais recente):

Arquivo "/Users/tomlous/Development/Python/enrichers/build/main.py", linha 53, em job_module = importlib.import_module ('spark.jobs.% S'% args.job_name) ...

Arquivo "", linha 978, em _gcd_import

Arquivo "", linha 961, em _find_and_load

Arquivo "", linha 950, em _find_and_load_unlocked

Arquivo "", linha 646, em _load_unlocked

Arquivo "", linha 616, em _load_backward_compatible

O arquivo "dependencies.zip/spark/jobs/classify_existence.py", linha 9, em

O arquivo "dependencies.zip/enrich/existence.py", linha 3, em

Arquivo "dependencies.zip/pandas/iniciar.py ", linha 19, em

ImportError: dependências necessárias ausentes ['numpy']

Olhando para o panda__init__.py Eu vejo algo como__import__(numpy)

Então, eu assumo que numpy não está carregado.

Mas se eu mudar meu código para chamar explicitamente funções numpy, ele realmente encontra numpy, mas não algumas de suas dependências

import numpy as np
a = np.array([1, 2, 3])

O código retorna

Traceback (última chamada mais recente):

Arquivo "dependencies.zip/numpy/core/iniciar.py ", linha 16, em

ImportError: não é possível importar o nome 'multiarray'

Então, minha pergunta é:

Como devo agrupar as bibliotecas python3 com meu trabalho do spark de uma maneira que não precise instalar o pip3 todas as bibliotecas possíveis em um cluster Spark?

questionAnswers(2)

yourAnswerToTheQuestion