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 раньше). Кто-нибудь знает, что я здесь делаю не так? Есть еще какая-нибудь информация, которая может быть опубликована и может быть полезна для отладки?
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
- не застегивал молнию на верхнем уровне реж. это был основной пакет, с которым кодировщик ожидал работать
- не застегивал молнию на Дирс нижнего уровня.
Решается с помощью
zip -r mypkg.zip mypkgТочнее, пришлось сделать 2 zip файла
- для пакета dist-keras:
cd dist-keras; zip -r distkeras.zip distkeras, см. https://github.com/cerndb/dist-keras/tree/master/distkeras- для пакета 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