我有一个由多个文件组成的spark应用程序。
当我使用:
启动Spark时../hadoop/spark-install/bin/spark-submit main.py --py-files /home/poiuytrez/naive.py,/home/poiuytrez/processing.py,/home/poiuytrez/settings.py --master spark://spark-m:7077
我收到错误:
15/03/13 15:54:24 INFO TaskSetManager: Lost task 6.3 in stage 413.0 (TID 5817) on executor spark-w-3.c.databerries.internal: org.apache.spark.api.python.PythonException (Traceback (most recent call last): File "/home/hadoop/spark-install/python/pyspark/worker.py", line 90, in main
command = pickleSer._read_with_length(infile) File "/home/hadoop/spark-install/python/pyspark/serializers.py", line 151, in _read_with_length
return self.loads(obj) File "/home/hadoop/spark-install/python/pyspark/serializers.py", line 396, in loads
return cPickle.loads(obj) ImportError: No module named naive
这很奇怪,因为我没有序列化任何东西。 naive.py也可以在同一条路径的每台机器上使用。
对可能发生的事情有任何见解?我的笔记本电脑上没有这个问题。
PS:我使用的是Spark 1.2.0。
答案 0 :(得分:6)
您可能在类或脚本的顶部导入模块,然后在RDD转换中使用该模块中的内容。这可能与您的代码中的内容类似:
import naive
def my_fxn(record):
naive.some_obj_or_fxn()
...etc...
...etc..
myRdd.map(my_fxn)
如果您编写这样的函数,PySpark会尝试挑选和取消导入在类/脚本顶部导入的所有模块。相反,您应该在使用它们的函数中导入模块,如下所示:
def my_fxn(record):
import naive
naive.some_obj_or_fxn()
...etc...
答案 1 :(得分:3)
首先,您不需要将naive.py
放到任何奴隶身上。我用2种方法解决了这个问题:
方式-1 强>
只需将main.py
放在cmd行的末尾。
../hadoop/spark-install/bin/spark-submit --master spark://spark-m:7077 --py-files /home/poiuytrez/naive.py,/home/poiuytrez/processing.py,/home/poiuytrez/settings.py main.py
或方法-2
在sc.addPyFile('py_file_name')
main.py
sc.addPyFile('/home/poiuytrez/naive.py')
sc.addPyFile('/home/poiuytrez/processing.py')
sc.addPyFile('/home/poiuytrez/settings.py')
答案 2 :(得分:0)
首先,您的导入软件包必须是python软件包,即您的软件包应包含__init__.py
。然后,您的代码将运行良好!
最后,包括python file(-py-files,sc.addPyFile)不是必需的,我使用spark 2.3进行了测试。