繁体   English   中英

使用多个python文件时出错spark-submit

[英]Error when using multiple python files spark-submit

我有一个由多个文件组成的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。

您可能在类或脚本的顶部导入模块,然后在RDD转换中使用该模块中的内容。 这可能与您的代码中的内容类似:

import naive

def my_fxn(record):
    naive.some_obj_or_fxn()
    ...etc...

...etc..
myRdd.map(my_fxn)

如果您编写这样的函数,PySpark会尝试对在类/脚本顶部导入的所有模块进行pickle和unpickle。 相反,您应该在使用它们的函数内导入模块,如下所示:

def my_fxn(record):
    import naive
    naive.some_obj_or_fxn()
    ...etc...

首先,您不需要将naive.py放到任何奴隶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

main.py使用sc.addPyFile('py_file_name')

sc.addPyFile('/home/poiuytrez/naive.py')
sc.addPyFile('/home/poiuytrez/processing.py')
sc.addPyFile('/home/poiuytrez/settings.py')

首先,你的import包必须是python包,即你的包应该包含__init__.py 那么,你的代码运行良好!

最后,包括python文件( - py-files,sc.addPyFile)不是必不可少的,我用spark 2.3测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM