簡體   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