SparkR:从R数据框收集数据不能与RStudio

时间:2016-01-21 18:27:03

标签: r apache-spark rstudio sparkr

我尝试执行一个非常基本的Spark动作(head())来收集我从R数据框创建的Spark DataFrame的输出。 我想在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 shell运行相同的代码时(总是在yarn-client中),一切正常。

我注意到,当我想从HDFS或HIVE源收集DataFrame时,这种差异并不会发生。

2 个答案:

答案 0 :(得分:0)

问题不在于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将启动R以及Spark Context(sc)和SQLContext(sqlContext),您应该能够运行它并获得结果。

答案 1 :(得分:0)

问题是在您的R脚本中包含master="yarn-client"

通常,运行SparkR脚本有两种不同且不同的方式:

  1. 互动(例如通过RStudio)或&#34;纯粹&#34; 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执行器和&amp;添加额外的参数。核心,因此您的SparkR.init()命令看起来像

    sc <- sparkR.init(appName = 'Spark Test',
                      sparkEnvir = list(spark.executor.cores='2',          
                                       spark.executor.instances='2'))
    
  3. 现在,如果您将此脚本保存为sparkr_test.R,则应该从shell运行它

    $ 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的详细指南here)。