【发布时间】:2018-07-24 00:39:09
【问题描述】:
我正在尝试运行依赖于某些 python3 库的 PySpark 作业。
我知道我可以在 Spark 集群上安装这些库,但由于我将集群重用于多个作业,我宁愿捆绑所有依赖项并通过 --py-files 指令将它们传递给每个作业。
为此,我使用:
pip3 install -r requirements.txt --target ./build/dependencies
cd ./build/dependencies
zip -qrm . ../dependencies.zip
这有效地压缩了所需包中的所有代码,以便在根级别使用。
在我的main.py 中,我可以导入依赖项
if os.path.exists('dependencies.zip'):
sys.path.insert(0, 'dependencies.zip')
并将 .zip 添加到我的 Spark 上下文中
sc.addPyFile('dependencies.zip')
到目前为止一切顺利。
但由于某种原因,这将在 Spark 集群上产生某种依赖地狱
例如跑步
spark-submit --py-files dependencies.zip main.py
main.py(或班级)我想在哪里使用熊猫。会触发这个错误的代码:
Traceback(最近一次调用最后一次):
文件“/Users/tomlous/Development/Python/enrichers/build/main.py”,第 53 行,在 job_module = importlib.import_module('spark.jobs.%s' % args.job_name) ...
文件“”,第 978 行,在 _gcd_import 中
文件“”,第 961 行,在 _find_and_load 中
文件“”,第 950 行,在 _find_and_load_unlocked 中
文件“”,第 646 行,在 _load_unlocked 中
文件“”,第 616 行,在 _load_backward_compatible
文件“dependencies.zip/spark/jobs/classify_existence.py”,第 9 行,
文件“dependencies.zip/enrich/existence.py”,第 3 行,在
文件“dependencies.zip/pandas/init.py”,第 19 行,
ImportError:缺少必需的依赖项 ['numpy']
看着熊猫的__init__.py 我看到类似__import__(numpy)的东西
所以我假设 numpy 没有加载。
但是,如果我将代码更改为显式调用 numpy 函数,它实际上会找到 numpy,但不是它的某些依赖项
import numpy as np
a = np.array([1, 2, 3])
代码返回
Traceback(最近一次调用最后一次):
文件“dependencies.zip/numpy/core/init.py”,第 16 行,
ImportError: cannot import name 'multiarray'
所以我的问题是:
我应该如何将 python3 库与我的 spark 作业捆绑在一起,而不必在 Spark 集群上 pip3 安装所有可能的库?
【问题讨论】:
-
我将从记录
sys.path开始了解 pyspark 节点看到的内容。 -
我将连接到工作节点,启动 python 并开始执行导入。
-
我会尝试日志记录,但连接到工作节点会破坏目的。 GCP 为集群提供了 init-actions,我现在将其用于解决方案,但我倾向于将集群用于多个 Spark 作业,现在我必须从所有作业中累积所有 python 包并在集群初始化时安装它们。所以从技术上讲,这是可行的,但似乎是 Scala/Java 通过创建具有捆绑依赖项的 fat-jars 提供的一个糟糕的替代品
标签: python python-3.x numpy apache-spark pyspark