【问题标题】:Spark problems with imports in PythonPython中导入的Spark问题
【发布时间】:2016-10-03 03:54:02
【问题描述】:

我们正在 python 脚本上运行 spark-submit 命令,该脚本使用 Spark 在 Python 中使用 Caffe 并行化对象检测。如果在纯 Python 脚本中运行,该脚本本身运行得非常好,但在将其与 Spark 代码一起使用时会返回导入错误。我知道 spark 代码不是问题,因为它在我的家用机器上运行良好,但在 AWS 上运行不佳。我不确定这是否与环境变量有关,就好像它没有检测到它们一样。

设置了这些环境变量:

SPARK_HOME=/opt/spark/spark-2.0.0-bin-hadoop2.7
PATH=$SPARK_HOME/bin:$PATH
PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH
PYTHONPATH=/opt/caffe/python:${PYTHONPATH}

错误:

16/10/03 01:36:21 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, 172.31.50.167): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
 File "/opt/spark/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/worker.py", line 161, in main
   func, profiler, deserializer, serializer = read_command(pickleSer, infile)
 File "/opt/spark/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/worker.py", line 54, in read_command
   command = serializer._read_with_length(file)
 File "/opt/spark/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length
   return self.loads(obj)
 File "/opt/spark/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/serializers.py", line 422, in loads
   return pickle.loads(obj)
 File "/opt/spark/spark-2.0.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/cloudpickle.py", line 664, in subimport
   __import__(name)
ImportError: ('No module named caffe', <function subimport at 0x7efc34a68b90>, ('caffe',))

有谁知道为什么会出现这样的问题?

这个来自 Yahoo 的包通过将 Caffe 作为 jar 依赖项提供,然后在 Python 中再次使用它来管理我们正在尝试做的事情。但是我还没有找到任何关于如何自己构建和导入它的资源。

https://github.com/yahoo/CaffeOnSpark

【问题讨论】:

  • 也许您可以尝试使用.egg 加载python 包,如建议的here
  • 试过了,没用。我用谷歌搜索,显然我必须将其导出为 jar 包,但我不知道如何构建它然后将其导入 Python。
  • 如果您从源代码构建 caffe,您是否尝试手动将 caffe 库添加到 LD_LIBRARY_PATH?您是否尝试过从 python 终端导入 caffe?
  • 这可能是由于两个可能的原因:相应的模块,caffe 不在 PYTHONPATH 中,在 spark 模式下运行时(在导入模块之前检查 sys.path)以及由于某些原因spark进程没有caffe模块文件的权限(您可以尝试通过例如打开相应文件来检查权限)
  • 我已经在每个工作节点中打印了 PYTHONPATH,并且它正确设置了 caffe 路径“opt/caffe”,PATH 也是如此。我觉得你的第二个陈述可能是一个线索,我怀疑当工作人员出于某种原因运行任务时,他们没有权限或访问文件系统的其余部分。这可以通过将路径作为参数传递给 LD_LIBRARY_PATH 或其他一些确定任务在哪个用户下运行的 Spark 配置来解决?

标签: python apache-spark pyspark caffe pycaffe


【解决方案1】:

您可能尚未在您的 AWS 环境中编译 caffe python 包装器。由于我(以及其他几个人,https://github.com/BVLC/caffe/issues/2440)完全无法理解的原因,pycaffe 不能作为 pypi 包提供,您必须自己编译。如果您在 AWS EB 环境中,则应遵循此处的编译/制作说明或使用 ebextensions 将其自动化:http://caffe.berkeleyvision.org/installation.html#python

【讨论】:

  • 我有,我什至运行了 ipython 命令,然后执行了“import caffe”,它工作得很好。事实上,我可以在每个节点中单独运行纯 python 脚本,它们都可以完美地导入 caffe 并完成所有处理。只有在集群模式下,由于某种原因它会忽略所有 env var,并且不想拿起 caffe。
  • @alfredox: 你在哪里运行可以导入 caffe 的 ipython?
  • 在工作节点中作为“ubuntu”用户。所以你有你的主服务器,然后工作人员连接到主服务器以形成集群。我已经在每个工作节点上运行了它,并且一切正常。就好像当工作人员从 master 接收任务以运行该脚本时,他们正在某种容器中运行任务,该容器不允许他们访问文件系统的其余部分,例如 opt/caffe 路径,以便正确地在 python 中导入该库。
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多