我尝试执行一个非常基本的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时,这种差异并不会发生。
答案 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脚本有两种不同且不同的方式:
互动(例如通过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()
作为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'))
现在,如果您将此脚本保存为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)。