我们正在 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 中再次使用它。但我还没有找到任何关于如何构建和导入它的资源。
最佳答案
您可能还没有在 AWS 环境中编译 caffe python 包装器。出于完全逃避我(和其他几个人,https://github.com/BVLC/caffe/issues/2440)的原因,pycaffe 不能作为 pypi 包使用,您必须自己编译它。如果您在 AWS EB 环境中,您应该遵循此处的编译/制作说明或使用 ebextensions 使其自动化:http://caffe.berkeleyvision.org/installation.html#python
关于python - Python 中导入的 Spark 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39824381/