pyspark addPyFile添加.py文件的zip文件,但仍未找到模块

时间:2018-07-20 21:15:32

标签: apache-spark pyspark

使用addPyFiles()似乎并没有添加想要的文件来激发作业节点(这是Spark的新增功能,因此这里可能缺少一些基本的使用知识)。

尝试使用pyspark运行脚本,并看到错误消息,指出找不到某些要导入的模块。以前从未使用过spark,但是其他帖子(来自问题https://github.com/cerndb/dist-keras/issues/36#issuecomment-378918484https://stackoverflow.com/a/39779271/8236733的软件包)建议压缩模块并通过sparkContext.addPyFiles(mymodulefiles.zip)添加到spark作业中,但仍然会出错。相关的代码片段是...

from distkeras.trainers import *
from distkeras.predictors import *
from distkeras.transformers import *
from distkeras.evaluators import *
from distkeras.utils import *

(在https://github.com/cerndb/dist-keras上找不到我要导入的软件包)

conf = SparkConf()
conf.set("spark.app.name", application_name)
conf.set("spark.master", master)  #master='yarn-client'
conf.set("spark.executor.cores", `num_cores`)
conf.set("spark.executor.instances", `num_executors`)
conf.set("spark.locality.wait", "0")
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");

if using_spark_2:
    from pyspark.sql import SparkSession

    sc = SparkSession.builder.config(conf=conf) \
            .appName(application_name) \
            .getOrCreate()
    sc.sparkContext.addPyFile("/home/me/Downloads/distkeras.zip") # see https://github.com/cerndb/dist-keras/issues/36#issuecomment-378918484 and https://forums.databricks.com/answers/10207/view.html
    print sc.version

(distkeras.zip是该目录的压缩文件:https://github.com/cerndb/dist-keras/tree/master/distkeras),

transformer = OneHotTransformer(output_dim=nb_classes, input_col="label_index", output_col="label")
dataset = transformer.transform(dataset)

"""throwing error...
.....
  File "/opt/mapr/spark/spark-2.1.0/python/pyspark/serializers.py", line 458, in loads
    return pickle.loads(obj)
ImportError: No module named distkeras.utils

    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193)
.....
"""

从我能找到的文档和示例(http://spark.apache.org/docs/2.1.0/api/python/pyspark.html#pyspark.SparkContext.addPyFilehttps://forums.databricks.com/questions/10193/the-proper-way-to-add-in-dependency-py-files.html)中,上面的代码似乎应该对我有用(再次,以前从未使用过spark)。有人知道我在做什么错吗?可以发布更多对调试有用的信息吗?

2 个答案:

答案 0 :(得分:9)

已解决问题。诚然,解决方案并不完全与火花相关,但是为了给其他可能有类似问题的人留下问题,因为给定的错误消息并没有使我的错误从一开始就很清楚。

TLDR :确保正在加载的zip文件的包内容(因此它们应在每个目录中包含__init.py__。)的结构和名称均与您的代码期望的方式相同。


我试图通过zip加载到spark上下文中的包的格式为

mypkg
    file1.py
    file2.py
    subpkg1
        file11.py
    subpkg2
        file21.py

运行less mypkg.zip时显示的我的zip

file1.py file2.py subpkg1 subpkg2

所以这里有两件事是错误的。

  1. 未压缩顶级目录。那是编码人员期望使用的主要软件包
  2. 未压缩较低级别的目录。

解决了 zip -r mypkg.zip mypkg

更具体地说,必须制作2个zip文件

  1. 用于dist-keras软件包:

    cd dist-keras; zip -r distkeras.zip distkeras

请参阅https://github.com/cerndb/dist-keras/tree/master/distkeras

  1. 用于distkeras使用的keras软件包(未在整个集群中安装):

    cd keras; zip -r keras.zip keras

请参阅https://github.com/keras-team/keras/tree/master/keras

因此,声明启动会话看起来像

conf = SparkConf()
conf.set("spark.app.name", application_name)
conf.set("spark.master", master)  #master='yarn-client'
conf.set("spark.executor.cores", `num_cores`)
conf.set("spark.executor.instances", `num_executors`)
conf.set("spark.locality.wait", "0")
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");

# Check if the user is running Spark 2.0 +
if using_spark_2:
    from pyspark.sql import SparkSession

    sc = SparkSession.builder.config(conf=conf) \
            .appName(application_name) \
            .getOrCreate()
    sc.sparkContext.addPyFile("/home/me/projects/keras-projects/exploring-keras/keras-dist_test/dist-keras/distkeras.zip")
    sc.sparkContext.addPyFile("/home/me/projects/keras-projects/exploring-keras/keras-dist_test/keras/keras.zip")
    print sc.version

答案 1 :(得分:0)

如果您的模块如下所示

myModule \ n
-初始化 .py
-spark1.py
-spark2.py

不要进入myModule文件夹并添加到zip。您提到的这个错误。

相反,请移出myModule文件夹。 右键单击,然后将myModule文件夹添加到zip文件中,并命名。

这个想法是当spark提取您的zip时,应该存在具有相同名称和名字的myModule文件夹