PySpark addPyFile добавить zip of.py файлы, но модуль все еще не найден



Использование addPyFiles(), похоже, не добавляет нужные файлы к узлам задания spark (new to spark so может отсутствовать некоторое базовое знание использования здесь).



Пытался запустить скрипт с помощью pyspark и видел ошибки, что некоторые модули не найдены для импорта. Никогда не использовал spark раньше, но другие сообщения (из пакета в вопросе https://github.com/cerndb/dist-keras/issues/36#issuecomment-378918484 и https://stackoverflow.com/a/39779271/8236733 ) рекомендуется застегивать модуль и добавление к заданию spark через sparkContext.addPyFiles(mymodulefiles.zip), но все еще получая ошибку. Соответствующие фрагменты кода являются...



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.addPyFile и https://forums.databricks.com/questions/10193/the-proper-way-to-add-in-dependency-py-files.html), код выше кажется, что он должен работать для меня (опять же, никогда не использовал spark раньше). Кто-нибудь знает, что я здесь делаю не так? Есть еще какая-нибудь информация, которая может быть опубликована и может быть полезна для отладки?

601   1  

1 ответ:

Исправлена проблема. По общему признанию, решение не полностью связано с искрой, но оставляет вопрос опубликованным ради других, у которых может быть подобная проблема, так как данное сообщение об ошибке не сделало мою ошибку полностью ясной с самого начала.

TLDR : убедитесь, что содержимое пакета (таким образом, они должны включать __init.py__ в каждом реж.) загружаемого zip-файла структурированы и названы так, как ожидает ваш код.


Пакет, который я пытался загрузить в контекст spark через zip имел вид

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

Мой zip при запуске less mypkg.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
  2. для пакета keras, используемого distkeras (который не установлен в кластере): cd keras; zip -r keras.zip keras, см. https://github.com/keras-team/keras/tree/master/keras

Таким образом, объявление сеанса spark выглядело как

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

Comments

    Ничего не найдено.