La agrupación de paquetes Python3 para PySpark resulta en importaciones faltantes
Estoy tratando de ejecutar un trabajo de PySpark que depende de ciertas bibliotecas de python3. Sé que puedo instalar estas bibliotecas en el Spark Cluster, pero como estoy reutilizando el clúster para varios trabajos, me gustaría agrupar todas las dependencias y pasarlas a cada trabajo a través del--py-files
directiva.
Para hacer esto uso:
pip3 install -r requirements.txt --target ./build/dependencies
cd ./build/dependencies
zip -qrm . ../dependencies.zip
Que efectivamente comprime todo el código de los paquetes requeridos para ser utilizado a nivel raíz.
En mimain.py
Puedo importar las dependencias
if os.path.exists('dependencies.zip'):
sys.path.insert(0, 'dependencies.zip')
Y también agregue el .zip a mi contexto de chispa
sc.addPyFile('dependencies.zip')
Hasta aquí todo bien.
Pero por alguna razón, esto se convertirá en una especie de dependencia del infierno en el Spark Cluster
Ej. Correr
spark-submit --py-files dependencies.zip main.py
Donde enmain.py
(o clase) Quiero usar un panda. El código activará este error:
Rastreo (llamadas recientes más última):
Archivo "/Users/tomlous/Development/Python/enrichers/build/main.py", línea 53, en job_module = importlib.import_module ('spark.jobs.% S'% args.job_name) ...
Archivo "", línea 978, en _gcd_import
Archivo "", línea 961, en _find_and_load
Archivo "", línea 950, en _find_and_load_unlocked
Archivo "", línea 646, en _load_unlocked
Archivo "", línea 616, en _load_backward_compatible
Archivo "dependencies.zip/spark/jobs/classify_existence.py", línea 9, en
Archivo "dependencies.zip/enrich/existence.py", línea 3, en
Archivo "dependencies.zip/pandas/en eso.py ", línea 19, en
ImportError: faltan dependencias requeridas ['numpy']
Mirando a los pandas__init__.py
Veo algo como__import__(numpy)
Así que supongo que numpy no está cargado.
Pero si cambio mi código para llamar explícitamente a funciones numpy, en realidad se encuentra numpy, pero no algunas de sus dependencias
import numpy as np
a = np.array([1, 2, 3])
El código vuelve
Rastreo (llamadas recientes más última):
Archivo "dependencies.zip/numpy/core/en eso.py ", línea 16, en
ImportError: no se puede importar el nombre 'multiarray'
Entonces mi pregunta es:
¿Cómo debo agrupar las bibliotecas de python3 con mi trabajo de modo que no tenga que instalar pip3 todas las bibliotecas posibles en un clúster de Spark?