Apache spark pyspark添加PyFile以添加.py文件的zip,但仍找不到模块

Apache spark pyspark添加PyFile以添加.py文件的zip,但仍找不到模块,apache-spark,pyspark,Apache Spark,Pyspark,使用addPyFiles()似乎并没有将设计文件添加到spark作业节点(spark是新手,因此可能缺少一些基本的使用知识) 试图使用pyspark运行脚本,但发现某些模块无法导入的错误。以前从未使用过spark,但其他帖子(来自相关软件包和)建议压缩模块并通过sparkContext.addPyFiles(mymodulefiles.zip)添加到spark作业中,但仍然出现错误。相关的代码片段正在 从distkeras.com导入* 从distkeras.predictors导入* 从dis

使用
addPyFiles()
似乎并没有将设计文件添加到spark作业节点(spark是新手,因此可能缺少一些基本的使用知识)

试图使用pyspark运行脚本,但发现某些模块无法导入的错误。以前从未使用过spark,但其他帖子(来自相关软件包和)建议压缩模块并通过
sparkContext.addPyFiles(mymodulefiles.zip)
添加到spark作业中,但仍然出现错误。相关的代码片段正在

从distkeras.com导入*
从distkeras.predictors导入*
从distkeras.transformers导入*
从distkeras.evaluators导入*
从distkeras.utils导入*
(我在这里进口的包裹可以在这里找到)

conf=SparkConf()
conf.set(“spark.app.name”,应用程序名称)
conf.set(“spark.master”,master)#master='warn-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”);
如果使用_spark_2:
从pyspark.sql导入SparkSession
sc=SparkSession.builder.config(conf=conf)\
.appName(应用程序名称)\
.getOrCreate()
sc.sparkContext.addPyFile(“/home/me/Downloads/distkeras.zip”)#参见https://github.com/cerndb/dist-keras/issues/36#issuecomment-378918484和https://forums.databricks.com/answers/10207/view.html
打印sc.version
(distkeras.zip是此目录的压缩文件。:),以及

transformer=OneHotTransformer(输出尺寸=nb\u类,输入列=“标签索引”,输出列=“标签”)
dataset=transformer.transform(数据集)
“”正在抛出错误。。。
.....
文件“/opt/mapr/spark/spark-2.1.0/python/pyspark/serializers.py”,第458行,加载
返回酸洗负荷(obj)
ImportError:没有名为distkeras.utils的模块
位于org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193)
.....
"""

从我能找到的文档和示例(和),上面的代码似乎对我来说应该是可行的(同样,以前从未使用过spark)。有人知道我做错了什么吗?可以发布更多对调试有用的信息吗

修复了问题。诚然,解决方案并非完全与spark相关,而是为了其他可能有类似问题的人而发布问题,因为给出的错误消息并没有从一开始就完全清楚我的错误

TLDR:确保加载的zip文件的包内容(因此它们应该在每个目录中包含一个_init.py_uu)按照代码预期的方式进行结构和命名


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

mypkg
    file1.py
    file2.py
    subpkg1
        file11.py
    subpkg2
        file21.py
运行
less mypkg.zip
时显示my zip

file1.py file2.py subpkg1 subpkg2

所以这里有两件事不对

  • 没有压缩顶级目录。这是编码人员希望使用的主要软件包
  • 没有压缩较低级别的目录
  • 解决
    zip-r mypkg.zip mypkg

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

  • 对于dist keras软件包:

    cd区keras;zip-r distkeras.zip distkeras

  • 对于distkeras使用的keras软件包(未在集群中安装):

    cd-keras;zip-r keras.zip keras

  • 所以宣布spark会话看起来像

    conf=SparkConf()
    conf.set(“spark.app.name”,应用程序名称)
    conf.set(“spark.master”,master)#master='warn-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”);
    #检查用户是否正在运行Spark 2.0+
    如果使用_spark_2:
    从pyspark.sql导入SparkSession
    sc=SparkSession.builder.config(conf=conf)\
    .appName(应用程序名称)\
    .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”)
    打印sc.version
    
    如果您的模块如下所示

    myModule\n
    -init.py
    -spark1.py
    -spark2.py

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

    相反,请跳出myModule文件夹。 右键单击并将myModule文件夹添加到zip,然后指定另一个名称

    这个想法是,当spark解压缩您的zip时,应该存在同名的myModule文件夹,Hyrachy

    只是想高亮显示,所以它们应该在每个目录中包含一个_init.py。。这对我来说是一个关键的难题,我的本地Python测试很高兴没有这一点。