Я пытаюсь распараллелить задачу прогнозирования машинного обучения через Spark. Я использовал Spark несколько раз ранее в других задачах и раньше не сталкивался с проблемой распараллеливания.
В этой конкретной задаче мой кластер имеет 4 рабочих. Я вызываю mapPartitions на RDD с 4 разделами. Функция map загружает модель с диска (bootstrap script распределяет все, что необходимо для этого, я проверял ее на каждом подчиненном компьютере) и выполняет прогнозирование точек данных в разделе RDD.
Код запускается, но используется только один исполнитель. Журналы для других исполнителей говорят "Выключенный крюк называется". При разных запусках кода он использует разные машины, но только по одному.
Как я могу заставить Spark использовать сразу несколько машин?
Я использую PySpark на Amazon EMR через ноутбук Zeppelin. Ниже приведены фрагменты кода.
%spark.pyspark
sc.addPyFile("/home/hadoop/MyClassifier.py")
sc.addPyFile("/home/hadoop/ModelLoader.py")
from ModelLoader import ModelLoader
from MyClassifier import MyClassifier
def load_models():
models_path = '/home/hadoop/models'
model_loader = ModelLoader(models_path)
models = model_loader.load_models()
return models
def process_file(file_contents, models):
filename = file_contents[0]
filetext = file_contents[1]
pred = MyClassifier.predict(filetext, models)
return (filename, pred)
def process_partition(file_list):
models = load_models()
for file_contents in file_list:
pred = process_file(file_contents, models)
yield pred
all_contents = sc.wholeTextFiles("s3://some-path", 4)
processed_pages = all_contents.mapPartitions(process_partition)
processedDF = processed_pages.toDF(["filename", "pred"])
processedDF.write.json("s3://some-other-path", mode='overwrite')
Есть четыре задачи, как ожидалось, но все они работают на одном и том же исполнителе!
Я запускаю кластер и могу предоставить журналы, доступные в диспетчере ресурсов. Я еще не знаю, где искать.