【问题标题】:SparkR : collect data from R data frame doesn't work with RStudioSparkR:从 R 数据框中收集数据不适用于 RStudio
【发布时间】:2016-04-28 03:44:43
【问题描述】:

我尝试执行一个非常基本的 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 时,这种差异不会发生。

【问题讨论】:

    标签: r apache-spark rstudio sparkr


    【解决方案1】:

    问题不是 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 Context (sc) 和 SQLContext (sqlContext),您应该能够运行它并获得结果。

    【讨论】:

      【解决方案2】:

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

      一般来说,有两 (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,您应该从 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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多