Инициализация SparkContext внутри другого объекта SparkContext

Я использую PySpark для распространения операции машинного обучения, состоящей из следующих шагов:

  1. Чтение данных
  2. Разделите данные на основе столбца (~ 100 столбцов, разделив один столбец с 50 уникальными значениями, поэтому необходимо распределить процесс по этому столбцу). Я распараллеливаю этот процесс, используя метод sc.parallelize.

  3. Для каждых данных инициализируйте классификатор через конвейер и используйте GridSearchCV из spark_sklearn для распараллеливания этой операции. Поскольку для этого требуется собственный искровой контекст, я создаю для этого еще один объект искрового контекста внутри небольшой функции.

Пример кода ниже

образец кода

sc = SparkContext('local', appName="abc")

def sample():
    ## some code

    ## read data and extract text features using pipeline
    ## use grid search CV from spark_sklearn package -- this requires its own sparkcontext
    sc1 = SparkContext('local', appName="xyz")
    grid_search = sp_GridSearchCV(sc1, clf, parameters, n_jobs=-1, cv=cv, verbose=1, scoring='f1_macro')
    grid_search.fit(X, y)
    sc1.stop()
    return grid_search

results = sc.parallelize(labels).map(sample).collect()
sc.stop()

Я хотел бы знать, будет ли это правильным способом сделать это, и если нет, то каким будет лучший способ. Я думаю, что этот процесс, безусловно, можно улучшить. Например, инициализация sparkobject каждый раз добавляет дополнительные накладные расходы, которые можно минимизировать.

Любые направления будут оценены. Спасибо!


person nEO    schedule 19.10.2017    source источник


Ответы (2)


Это не то, как работает Spark.

Когда вы создаете SparkContext, вы настраиваете свой кластер, получая всю информацию от YARN о том, как работает ваш кластер. Сколько ресурсов и материалов.

SparkContext отвечает за обработку этих ресурсов, хранение метаданных для ваших RDD, DataFrames, DataSets. И он будет распределен между вашими работниками. Вы можете увидеть ниже:

введите здесь описание изображения

Подробнее об этом можно узнать по этой ссылке.

Но почему это не сработает, и почему, если сработает, вы потеряете ресурсы.

Почему это не сработает

Вызывая контекст искры на рабочей стороне, вы создаете новый «драйвер», и в соответствии с архитектурой искры вы можете просто иметь драйверы в главном узле.

Почему это не улучшит производительность

Spark всегда пытается использовать все ресурсы вашего кластера, если вы используете динамическое распределение для его запуска. А благодаря Catalysis Optimizer это создаст план выполнения, который в большинстве случаев будет лучше, чем тот, который мы привыкли строить вручную. И если бы вы могли создать SparkContext на рабочей стороне, вы потеряли бы этого исполнителя только для драйвера, потеряв ресурсы.

person Thiago Baldim    schedule 19.10.2017
comment
это имеет смысл, и я имел в виду то же самое. Есть идеи, как распределить gridsearch для нескольких моделей в Pyspark. Спасибо - person nEO; 20.10.2017
comment
Вы определенно можете запустить драйвер на рабочем узле. Это называется кластер --deploy-mode. - person user4601931; 20.10.2017
comment
@nEO Вы можете одновременно отправлять несколько заданий Spark в YARN и запускать их одновременно. Вам просто нужно настроить ресурсы, которые требует каждое задание, а также, возможно, настроить YARN, чтобы лучше справляться с вашим общим пулом ресурсов. - person user4601931; 20.10.2017
comment
но запуск драйвера на каждом из рабочих узлов - это хорошая практика, и даст ли это повышение производительности, как то, что я ищу. - person nEO; 20.10.2017

Мне нравится ваше мышление, но после того, как у вас появится Spark Context, считайте его ленивой одиночной машиной, которая выполняет одну работу за раз. Единственная разница между обычной одиночной машиной и одиночной машиной искрового контекста заключается в удивительности (RAM/обработка/координация/устойчивость).

В значительной степени считается плохой идеей отправлять карту с функцией, содержащей ParamGrid. Но вышеприведенная логика вам поможет :)

person sam    schedule 20.10.2017