Pyspark --py файлы не работают

Я использую это, поскольку документ предлагает http://spark.apache.org/docs/1.1.1/submitting-applications.html

spsark версия 1.1.0

./spark/bin/spark-submit --py-files /home/hadoop/loganalysis/parser-src.zip \
/home/hadoop/loganalysis/ship-test.py 

и conf в коде:

conf = (SparkConf()
        .setMaster("yarn-client")
        .setAppName("LogAnalysis")
        .set("spark.executor.memory", "1g")
        .set("spark.executor.cores", "4")
        .set("spark.executor.num", "2")
        .set("spark.driver.memory", "4g")
        .set("spark.kryoserializer.buffer.mb", "128"))

и подчиненный node жалобы ImportError

14/12/25 05:09:53 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-172-31-10-8.cn-north-1.compute.internal): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/home/hadoop/spark/python/pyspark/worker.py", line 75, in main
    command = pickleSer._read_with_length(infile)
  File "/home/hadoop/spark/python/pyspark/serializers.py", line 150, in _read_with_length
    return self.loads(obj)
ImportError: No module named parser

и parser-src.zip проверяется локально.

[[email protected] ~]$ python
Python 2.7.8 (default, Nov  3 2014, 10:17:30) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.insert(1, '/home/hadoop/loganalysis/parser-src.zip')
>>> from parser import parser
>>> parser.parse
<function parse at 0x7fa5ef4c9848>
>>> 

Я пытаюсь получить информацию о дистанционном работнике. посмотрите, копирует ли файл файлы. Как выглядит sys.path.. и это сложно.

UPDATE: Я использую это, что файл zip был отправлен. и sys.path. все еще импортировать ошибку.

data = list(range(4))
disdata = sc.parallelize(data)
result = disdata.map(lambda x: "sys.path:  {0}\nDIR: {1}   \n FILES: {2} \n parser: {3}".format(sys.path, os.getcwd(), os.listdir('.'), str(parser)))
result.collect()
print(result.take(4))

Кажется, мне нужно копать в cloudpickle.which означает, что мне нужно понять, как облачно работает и сработает сперва.

: An error occurred while calling o40.collect.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 4 in stage 0.0 failed 4 times, most recent failure: Lost task 4.3 in stage 0.0 (TID 23, ip-172-31-10-8.cn-north-1.compute.internal): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/home/hadoop/spark/python/pyspark/worker.py", line 75, in main
    command = pickleSer._read_with_length(infile)
  File "/home/hadoop/spark/python/pyspark/serializers.py", line 150, in _read_with_length
    return self.loads(obj)
  File "/home/hadoop/spark/python/pyspark/cloudpickle.py", line 811, in subimport
    __import__(name)
ImportError: ('No module named parser', <function subimport at 0x7f219ffad7d0>, ('parser.parser',))

UPDATE:

кто-то сталкивается с той же проблемой в искре 0,8 http://apache-spark-user-list.1001560.n3.nabble.com/pyspark-Importing-other-py-files-in-PYTHONPATH-td2301.html

но он поставил свою lib в python dist-packages и импортировал работы. который я пробовал и все еще получаю ошибку импорта.

UPDATE:

OH.gush.. Я думаю, что проблема вызвана не пониманием zip файла и поведения импорта python. Я передаю parser.py в -py файлы, он работает, жалуется на другую зависимость. и zip только файлы .py, не включая .pyc, тоже работают.

Но я не мог понять, почему.

Ответ 1

Попробуйте импортировать собственный модуль из самого метода, а не вверху драйвера script, например:

def parse_record(record):
    import parser
    p = parser.parse(record)
    return p

а не

import parser
def parse_record(record):
    p = parser.parse(record)
    return p

Cloud Pickle, похоже, не распознает, когда пользовательский модуль был импортирован, поэтому, похоже, он пытается рассортировать модули верхнего уровня вместе с другими данными, которые необходимы для запуска метода. По моему опыту, это означает, что модули верхнего уровня существуют, но они не имеют пригодных для использования членов, а вложенные модули не могут использоваться, как ожидалось. После импорта с помощью from A import * или внутри метода (import A.B) модули работали как ожидалось.

Ответ 2

Похоже, что один или несколько узлов неправильно настроены. У всех узлов в кластере есть одна и та же версия/конфигурация Python (т.е. Все они имеют установленный модуль парсера)?

Если вы не хотите проверять один за другим, вы можете написать script, чтобы проверить, установлен ли он/установить его для вас. Этот поток показывает несколько способов сделать это.

Ответ 3

Попробуйте выполнить эту функцию SparkContext

sc.addPyFile(path)

Согласно pyspark документации здесь

Добавьте зависимость .py или .zip для всех задач, которые будут выполняться в этом SparkContext в будущем. Прошедший путь может быть либо локальным файлом, либо файлом в HDFS (или другими файловыми системами, поддерживаемыми Hadoop), либо HTTP, HTTPS или FTP URI.

Попробуйте загрузить файл модуля python в общедоступное облачное хранилище (например, AWS S3) и передать URL-адрес этому методу.

Вот более подробный материал для чтения: http://www.cloudera.com/documentation/enterprise/5-5-x/topics/spark_python.html

Ответ 4

Вам нужно упаковать свой код Python с помощью таких инструментов, как setuptools. Это позволит вам создать файл .egg, похожий на java файл jar. Затем вы можете указать путь к этому файлу яйца с помощью -py-files

spark-submit --py файлы path_to_egg_file path_to_spark_driver_file

Ответ 5

Я столкнулся с подобной проблемой, мои рабочие узлы не смогли обнаружить модули, хотя я использовал переключатель --py-files.

Было несколько вещей, которые я сделал - сначала я попытался поставить оператор импорта после создания переменной SparkContext (sc), надеясь, что импорт должен произойти после того, как модуль отправлен на все узлы, но все же он не работает. Затем я попробовал sc.addFile добавить модуль внутри самого script (вместо отправки его как аргумент командной строки), а затем импортировал функции модуля. Это пошло по крайней мере в моем случае.

Ответ 6

PySpark на EMR настроен для Python 2.6 по умолчанию, поэтому убедитесь, что они не установлены для интерпретатора Python 2.7

Ответ 7

Создайте zip файлы (example- abc.zip), содержащие все ваши зависимости.

При создании контекста искры укажите имя файла zip как:

    sc = SparkContext(conf=conf, pyFiles=["abc.zip"])