Параллельное выполнение кода R с spark.lapply

Параллелизации кода R сложно, так как код R выполняется на драйвере и в данных R. кадры не распределяются. Часто существует код R, который выполняется локально и преобразуется для выполнения на Apache Spark. В других случаях некоторые функции Spark, используемые для расширенного статистического анализа и приемов машинного обучения, могут не поддерживать распределенные вычисления. В таких случаях для распределения необходимой рабочей нагрузки в кластере можно использовать API UDF для Spark.

Пример варианта использования: вы хотите обучить несколько моделей машинного обучения на одних и тех же данных, например для настройки параметров Hyper. Если набор данных умещается на каждом рабочем процессе, может оказаться более эффективным использовать API UDF для Spark для обучения нескольких версий модели одновременно.

spark.lapplyФункция позволяет выполнять одну и ту же задачу для нескольких рабочих ролей, выполняя функцию над списком элементов. Для каждого элемента в списке:

  1. Отправка функции в рабочую роль.
  2. Выполните функцию.
  3. Возврат результатов всех работников в виде списка в драйвер.

В следующем примере в наборе данных используется модель, поддерживающая векторную поддержку, iris с перекрестной проверкой, а затраты изменяются с 0,5 до 1 с шагом 0,1. Выходные данные представляют собой список с описанием моделей для различных параметров стоимости.

library(SparkR)

spark.lapply(seq(0.5, 1, by = 0.1), function(x) {
  library(e1071)
  model <- svm(Species ~ ., iris, cost = x, cross = 3)
  summary(model)
})

Примечание

Необходимо установить пакеты на всех рабочих процессах.