pyspark addPyFile для добавления zip файлов.py, но модуль еще не найден
Использование addPyFiles()
видимому, не добавляет желаемые файлы к узлам рабочих мест addPyFiles()
поэтому здесь могут отсутствовать некоторые базовые знания об использовании).
Попытка запустить скрипт с использованием pyspark и обнаружила ошибки, из-за которых определенные модули не были найдены для импорта. Никогда не использовал spark раньше, но другие посты (из пакета в вопросе https://github.com/cerndb/dist-keras/issues/36#issuecomment-378918484 и qaru.site/info/7381677/...) рекомендуются архивирование модуля и добавление к искровому заданию через 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/info/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
мой почтовый индекс при запуске less mypkg.zip
, показал
file1.py file2.py subpkg1 subpkg2
Итак, две вещи были здесь не так.
- Не было молнии на верхнем уровне реж. это был основной пакет, который код планировал работать с
- Не было молнии нижнего уровня dirs.
Решено с
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
Таким образом, объявление сессии искры было похоже на
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
Ответ 2
Когда я запускаю spark на своей машине локально, простая установка библиотеки через Pip и импорт ее работает хорошо. Однако когда я пытаюсь запустить Spark в AWS EMR, она не импортирует библиотеку, даже если она установлена в кластере. При попытке предоставить решение, которое вы предоставили, он выдает следующую ошибку:
addPyFile() отсутствует 1 обязательный позиционный аргумент: 'путь'