2016-01-21 43 views
0

我嘗試執行一個非常基本的Spark動作(head())以收集我從R數據框創建的Spark DataFrame的輸出。 我想在yarn-client部署模式下執行此操作。我在羣集的所有節點上安裝了RSparkR:從R數據框收集數據不適用於RStudio

當我從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)一切正常。

我注意到,當我想從HDFS或HIVE來源收集數據幀時,這種差異不會發生。

回答

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 3與上述將與星火上下文(SC)和SQLContext(sqlContext)一起啓動R,你應該能夠運行它,並取得成果。

0

問題是在您的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. 火花應用程序,即有​​,在這種情況下,你又沒有包括在腳本中的master參數 - 您使用它作爲​​參數。該腳本可能再次同上,但在一般情況下,你可能會想包括額外的參數對於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的說法,也應該有​​而不是在腳本去運行它。

(我已經寫了關於SparkR here更詳細的指南)。