SparkR: сбор данных из фрейма данных R не работает с RStudio

Я пытаюсь выполнить очень простое действие Spark (head()) для сбора выходных данных из фрейма данных Spark, который я создал из фрейма данных R. Я хочу сделать это в режиме развертывания yarn-client. Я установил R на все узлы кластера.

Когда я запускаю это приложение из RStudio с помощью:

Sys.setenv(SPARK_HOME = "/usr/local/spark160")
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))

sc <- sparkR.init(master="yarn-client", appName = "Spark Test",
                  sparkHome = "/usr/local/spark160/")
sqlContext <- sparkRSQL.init(sc)
df <- createDataFrame(sqlContext, iris) 
head(df)

Я получаю эту ошибку на каждом узле

Java.net.SocketTimeoutException: время ожидания истекло

Но когда я запускаю тот же код напрямую из оболочки SparkR (всегда в yarn-client), все работает.

Я заметил, что эта разница не возникает для меня, когда я хочу собрать DataFrame из источников HDFS или HIVE.


person Villo    schedule 21.01.2016    source источник


Ответы (2)


Проблема не в RStudio, проблема в том, что вы начинаете выполнение, как показано ниже (пожалуйста, попробуйте все на терминале)

$ R
Sys.setenv(SPARK_HOME = "/usr/local/spark160")
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))

sc <- sparkR.init(master="yarn-client", appName = "Spark Test", sparkHome = "/usr/local/spark160/")
sqlContext <- sparkRSQL.init(sc)
df <- createDataFrame(sqlContext, iris) 
head(df)

Я знаю альтернативное решение, которое я получил для работы. Попробуйте ниже на терминале:

$ /usr/local/spark160/bin/sparkR --master yarn-client
df <- createDataFrame(sqlContext, iris) 
head(df)

Запуск R с помощью выше запустит R вместе с контекстом Spark (sc) и SQLContext (sqlContext), и вы сможете запустить его и получить результаты.

person Manu Batham    schedule 26.07.2016

Проблема заключается в включении master="yarn-client" в ваш сценарий R.

Как правило, существует два (2) различных способа запуска сценариев SparkR:

  1. Интерактивно (например, через RStudio) или как «чистые» R-скрипты (т. е. с помощью команды source()); в этом случае ваш код должен быть таким:

    Sys.setenv(SPARK_HOME = "/usr/local/spark160")
    library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))
    
    sc <- sparkR.init(appName = "Spark Test", sparkHome = "/usr/local/spark160/") # no 'master' argument
    sqlContext <- sparkRSQL.init(sc)
    df <- createDataFrame(sqlContext, iris) 
    print(head(df))
    #   Sepal_Length Sepal_Width Petal_Length Petal_Width Species
    # 1          5.1         3.5          1.4         0.2  setosa
    # 2          4.9         3.0          1.4         0.2  setosa
    # 3          4.7         3.2          1.3         0.2  setosa
    # 4          4.6         3.1          1.5         0.2  setosa
    # 5          5.0         3.6          1.4         0.2  setosa
    # 6          5.4         3.9          1.7         0.4  setosa
    sparkR.stop()
    
  2. Как приложения Spark, т.е. с spark-submit, и в этом случае вы снова не включаете аргумент master в скрипт — вы используете его как аргумент в spark-submit. Сценарий снова может быть таким, как указано выше, но в общем случае вы, вероятно, захотите включить дополнительные аргументы для исполнителей и ядер Spark, чтобы ваша команда SparkR.init() выглядела примерно так:

    sc <- sparkR.init(appName = 'Spark Test',
                      sparkEnvir = list(spark.executor.cores='2',          
                                       spark.executor.instances='2'))
    

Теперь, если вы сохраните этот скрипт как sparkr_test.R, вы должны запустить его из оболочки как

$ spark-submit --master yarn-client --driver-memory 2g /path/to/sparkr_test.R
[...]
   Sepal_Length Sepal_Width Petal_Length Petal_Width Species
 1          5.1         3.5          1.4         0.2  setosa
 2          4.9         3.0          1.4         0.2  setosa
 3          4.7         3.2          1.3         0.2  setosa
 4          4.6         3.1          1.5         0.2  setosa
 5          5.0         3.6          1.4         0.2  setosa
 6          5.4         3.9          1.7         0.4  setosa

Заметьте также, что аргумент driver-memory тоже должен идти с spark-submit, а не в сценарии.

(Более подробное руководство по SparkR я написал здесь).

person desertnaut    schedule 30.08.2016