首页 > 解决方案 > Pyspark 在没有 Internet 的集群中使用 .so 文件分发依赖项

问题描述

我想使用 Pyspark 并在无法访问 Internet 的集群中分发一组依赖项。我尝试pip install -t dependencies -r requirements.txt了然后压缩了依赖项文件夹。我传递了 zipspark.submit.pyFiles并且它可以工作,除非模块内部有 .so 文件(例如 numpy)。在那种情况下,我会收到此错误。如果在将 PYTHONPATH 指向 zip 文件后打开本地新的 python 控制台,我会得到完全相同的错误:看起来它可以找到除 .so 文件之外的 python 包,因此它与 pyspark 并没有真正的关系,而是与一般的 python 机制有关从 zip 文件加载包。如果我解压缩文件并将 PYTHONPATH 指向解压缩的文件夹,则一切正常。

我已经阅读了这个答案,所以我尝试了 egg 文件,结果相同:在 pip install 到依赖项目标文件夹之后,我使用 setuptools 创建了一个单独的 egg 文件,首先在依赖项文件夹中创建一个 setup.py,像这样:

from setuptools import setup, find_packages

setup(
    name = "dependencies",
    version = "0.1",
    packages = find_packages()
)

然后调用python setup.py bdist_egg. 我在 pyFiles 参数中分发生成的 .egg 文件,但同样的错误。我尝试创建一个native_libs.txt文件,在其中手动写入 numpy/core 子文件夹内的 .so 文件的路径,但是当我运行 bdist 命令时似乎没有效果:.so 没有复制到 numpy 子文件夹中鸡蛋,所以我在那里手动复制它们,但没有成功。将 PYTHONPATH 指向 egg 文件,但得到完全相同的错误。

当我创建鸡蛋时,我的 python 版本是 3.7.6,在 Spark 工作人员中是 3.7.7,但我几乎可以肯定这不会导致问题。

有没有办法做到这一点?也许使用与 pyFiles 不同的另一个 spark 参数?

谢谢

注意:此JIRA 票证也与此问题有关。

标签: pythonapache-sparkpysparkpythonpathegg

解决方案


推荐阅读