我用这个作为文件建议http://spark.apache.org/docs/1.1.1/submitting-applications.html
spsark版本1.1.0
./spark/bin/spark-submit --py-files /home/hadoop/loganalysis/parser-src.zip \
/home/hadoop/loganalysis/ship-test.py
和密码:
conf = (SparkConf()
.setMaster("yarn-client")
.setAppName("LogAnalysis")
.set("spark.executor.memory", "1g")
.set("spark.executor.cores", "4")
.set("spark.executor.num", "2")
.set("spark.driver.memory", "4g")
.set("spark.kryoserializer.buffer.mb", "128"))
以及从节点
14/12/25 05:09:53 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-172-31-10-8.cn-north-1.compute.internal): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/home/hadoop/spark/python/pyspark/worker.py", line 75, in main
command = pickleSer._read_with_length(infile)
File "/home/hadoop/spark/python/pyspark/serializers.py", line 150, in _read_with_length
return self.loads(obj)
ImportError: No module named parser
parser-src.zip在本地进行测试。
[hadoop@ip-172-31-10-231 ~]$ python
Python 2.7.8 (default, Nov 3 2014, 10:17:30)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.insert(1, '/home/hadoop/loganalysis/parser-src.zip')
>>> from parser import parser
>>> parser.parse
<function parse at 0x7fa5ef4c9848>
>>>
我想得到远程工作者的信息。看看它是否复制了文件。sys.path是什么样子的..这很棘手。
更新:我用这个发现zip文件已经寄出了。设置了sys.path。仍然导入获取错误。
data = list(range(4))
disdata = sc.parallelize(data)
result = disdata.map(lambda x: "sys.path: {0}\nDIR: {1} \n FILES: {2} \n parser: {3}".format(sys.path, os.getcwd(), os.listdir('.'), str(parser)))
result.collect()
print(result.take(4))
似乎我必须深入研究cloudpickle,这意味着我需要先了解cloudpickle是如何工作和失败的。
: An error occurred while calling o40.collect.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 4 in stage 0.0 failed 4 times, most recent failure: Lost task 4.3 in stage 0.0 (TID 23, ip-172-31-10-8.cn-north-1.compute.internal): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/home/hadoop/spark/python/pyspark/worker.py", line 75, in main
command = pickleSer._read_with_length(infile)
File "/home/hadoop/spark/python/pyspark/serializers.py", line 150, in _read_with_length
return self.loads(obj)
File "/home/hadoop/spark/python/pyspark/cloudpickle.py", line 811, in subimport
__import__(name)
ImportError: ('No module named parser', <function subimport at 0x7f219ffad7d0>, ('parser.parser',))
更新:
有人在spark 0.8中遇到同样的问题http://apache-spark-user-list.1001560.n3.nabble.com/pyspark-importing-other-py-files-in-pythonpath-td2301.html
但他把他的lib放在python dist包和import works中。我试过了,但还是出现了导入错误。
更新:
哦。喷啊。。我认为这个问题是由于不理解zip文件和python导入行为造成的。我将parser.py传递给--py文件,它可以工作,并抱怨另一个依赖关系。而且只压缩.py文件[不包括.pyc]似乎也可以。
但我不太明白为什么。
7条答案
按热度按时间mo49yndu1#
尝试从方法本身内部而不是从驱动程序脚本的顶部导入自定义模块,例如:
而不是
cloudpickle似乎无法识别何时导入了自定义模块,因此它似乎试图将顶级模块与运行该方法所需的其他数据一起pickle。根据我的经验,这意味着顶级模块似乎存在,但它们缺少可用的成员,并且嵌套模块不能按预期使用。一次导入
from A import *
或者从方法内部(import A.B
),模块工作正常。rt4zxlrg2#
试试这个函数
SparkContext
```sc.addPyFile(path)
wgxvkvu93#
创建包含所有依赖项的zip文件(例如-.zip)。
在创建spark上下文时,请将zip文件名提到:
2vuwiymt4#
我面临着类似的问题,我的工作节点无法检测到模块,即使我正在使用
--py-files
开关。我做了两件事-首先,我尝试在创建sparkcontext(sc)变量后放入import语句,希望导入应该在模块发送到所有节点后进行,但仍然无法工作。然后我试着
sc.addFile
将模块添加到脚本本身中(而不是作为命令行参数发送),然后导入模块的函数。至少对我来说,这是个好办法。fcg9iug35#
听起来好像一个或多个节点配置不正确。集群上的所有节点是否都具有相同的python版本/配置(即,它们都安装了解析器模块)?
如果你不想一个接一个地检查,你可以写一个脚本来检查它是否被安装/为你安装。这篇文章展示了几种方法。
llmtgqce6#
默认情况下,emr上的pyspark是为python2.6配置的,因此请确保没有为python2.7解释器安装它们
zz2j4svz7#
您需要使用setuptools之类的工具来打包python代码。这将允许您创建一个类似于javajar文件的.egg文件。然后可以使用--py文件指定这个egg文件的路径
spark submit--py files path到egg文件path到spark驱动程序文件