Pyspark с Zeppelin: распространение файлов на узлы кластера в сравнении с SparkContext.addFile () - PullRequest
0 голосов
/ 31 мая 2018

У меня есть библиотека, которую я создал, и которую я хочу сделать доступной для всех узлов кластера pyspark (1.6.3).Я запускаю тестовые программы на этом искровом кластере через Zeppelin (0.7.3).

Файлы, которые я хочу, находятся в репозитории github.Поэтому я клонировал этот репозиторий на все узлы кластера и создал скрипт через pssh, чтобы обновить их все одновременно.Таким образом, файлы существуют в заданном месте на каждом узле, и я хочу, чтобы они были доступны для каждого узла.

Я пробовал это

import sys
sys.path.insert(0, "/opt/repo/folder/")

from module import function
return_rdd = function(arguments)

Это привело к стеку ошибок:

  File "/usr/hdp/current/spark-client/python/pyspark/worker.py", line 98, in main
    command = pickleSer._read_with_length(infile)
  File "/usr/hdp/current/spark-client/python/pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
  File "/usr/hdp/current/spark-client/python/pyspark/serializers.py", line 439, in loads
    return pickle.loads(obj, encoding=encoding)
ImportError: No module named 'module'

Я нахожу эту ошибку необычной, поскольку она вызывается вызовом pickle.Код, по-видимому, загружает фрейм данных и разбивает его на части, но происходит сбой только тогда, когда вызывается другая функция в модуле для секционированной df, преобразованной в rdd.Я не уверен, где и почему здесь задействован маринованный колл;модуль pyscript не должен подвергаться травлению, поскольку рассматриваемые модули уже должны находиться в sys.path на каждом узле кластера.

С другой стороны, я смог заставить это работать

sc.addFile("/opt/repo/folder/module.py")
import sys
from pyspark import SparkFiles
sys.path.insert(0, SparkFiles.getRootDirectory())

from module import function
return_rdd = function(arguments)

Есть идеи, почему первый подход не работает?

...