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

Итак, две вещи были здесь не так.

  1. Не было молнии на верхнем уровне реж. это был основной пакет, который код планировал работать с
  2. Не было молнии нижнего уровня dirs.

Решено с 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. для пакета 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 обязательный позиционный аргумент: 'путь'