【问题标题】:Numpy and static linkingNumpy 和静态链接
【发布时间】:2015-12-19 23:05:23
【问题描述】:

我在一个大型集群上运行 Spark 程序(我没有管理权限)。 numpy 未安装在工作程序节点上。因此,我将numpy 与我的程序捆绑在一起,但出现以下错误:

Traceback (most recent call last):
  File "/home/user/spark-script.py", line 12, in <module>
    import numpy
  File "/usr/local/lib/python2.7/dist-packages/numpy/__init__.py", line 170, in <module>
  File "/usr/local/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module>
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 8, in <module>
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/type_check.py", line 11, in <module>
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/__init__.py", line 6, in <module>
ImportError: cannot import name multiarray

脚本其实很简单:

from pyspark import SparkConf, SparkContext
sc = SparkContext()

sc.addPyFile('numpy.zip')

import numpy

a = sc.parallelize(numpy.array([12, 23, 34, 45, 56, 67, 78, 89, 90]))
print a.collect()

我了解发生错误是因为numpy 动态加载multiarray.so 依赖项,即使我的numpy.zip 文件包含multiarray.so 文件,不知何故动态加载不适用于Apache Spark。为什么这样?否则你如何创建一个带有静态链接的独立numpy 模块?

谢谢。

【问题讨论】:

  • 您能展示一下您是如何创建 zip 文件的吗?
  • @zero323: zip -r ~/numpy.zip /usr/local/lib/python2.7/dist-packages/numpy
  • 所以你想复制现有的安装?
  • @zero323:是的,现有的numpy 安装已通过运行以下命令安装在Ubuntu 机器上:sudo apt-get install python-numpy
  • 也许您可以设置LD_LIBRARY_PATH 以包含multiarray.so 所在的路径?您需要在 Python 启动之前执行此操作。

标签: python numpy apache-spark pyspark


【解决方案1】:

您的方法至少存在两个问题,并且都可以简化为一个简单的事实,即 NumPy 是一个重量级依赖项。

  • 首先,Debian 软件包带有多个依赖项,包括 libgfortranlibblasliblapacklibquadmath。因此,您不能简单地复制 NumPy 安装并期望一切正常(老实说,如果不是这种情况,您不应该做这样的事情)。从理论上讲,您可以尝试使用静态链接来构建它,并以这种方式将其与所有依赖项一起交付,但它会遇到第二个问题。

  • NumPy 本身就相当大。虽然 20MB 看起来并不特别令人印象深刻,并且由于所有依赖项,它不应该超过 40MB,但每次开始工作时都必须将其发送给工作人员。你拥有的工人越多,情况就越糟糕。如果您决定需要 SciPy 或 SciKit,情况会变得更糟。

可以说,这使得 NumPy 不适合使用 pyFile 方法。

如果您没有直接访问工作人员但所有依赖项(包括头文件和静态库)都存在,您可以简单地尝试从任务本身在用户空间中安装 NumPy(它假定 @987654329 @ 也已安装),类似这样:

try:
    import numpy as np

expect ImportError:
    import pip
    pip.main(["install", "--user", "numpy"])
    import numpy as np

您可以在 How to install and import Python modules at runtime? 中找到此方法的其他变体

由于您可以访问工作人员,因此更好的解决方案是创建一个单独的 Python 环境。可能最简单的方法是使用Anaconda,它也可用于打包非 Python 依赖项,并且不依赖于系统范围的库。您可以使用 Ansible 或 Fabric 等工具轻松自动执行此任务,它不需要管理权限,您真正需要的只是 bash 和一些获取基本安装程序(wget、curl、rsync、scp)的方法。

另见:shipping python modules in pyspark to other nodes?

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 2013-06-04
    • 2011-05-08
    • 2010-09-15
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多