我对星火,SparkR和所有与HDFS相关的技术都很陌生.我最近安装了Spark1.5.0,并使用SparkR运行了一些简单的代码:
Sys.setenv(SPARK_HOME="/private/tmp/spark-1.5.0-bin-hadoop2.6")
.libPaths("/private/tmp/spark-1.5.0-bin-hadoop2.6/R/lib")
require('SparkR')
require('data.table')
sc <- sparkR.init(master="local")
sqlContext <- sparkRSQL.init(sc)
hiveContext <- sparkRHive.init(sc)
n = 1000
x = data.table(id = 1:n, val = rnorm(n))
Sys.time()
xs <- createDataFrame(sqlContext, x)
Sys.time()代码立即执行。但是,当我将其更改为n = 1000000时,大约需要4分钟(两个Sys.time()调用之间的时间)。当我在端口4040的控制台中检查这些作业时,n = 1000的作业持续时间为0.2s,n = 1000000为0.3s。我做错了什么吗?
发布于 2015-10-13 20:56:58
你没做错什么特别的事。这只是不同因素综合作用的结果:
createDataFrame (Spark1.5.1)的实现是缓慢的。这是火花-8277中描述的一个已知问题。data.table。在解决火花-8277之前,你没有什么可以做的,但是有两种选择可以尝试:
data.frame而不是data.table。使用航班数据集(227496行,14列):
df <- read.csv("flights.csv") flights.csv df),times=3) ##单元:秒## expr min lq均值## createDataFrame(sqlContext,df) 96.41565 97.19515 99.08441 ## uq max neval ## 100.4188 102.8629 3
与data.table相比
dt <- data.table::fread("flights.csv") flights.csv dt),times=3) ##单元:秒## expr均值## createDataFrame(sqlContext,dt) 378.8534 379.4482 381.2061 380.043 ## uq max neval ## 382.3825 384.722 3spark-csv将数据直接加载到火花DataFrame,而不与R直接交互,听起来很疯狂:
<- data.table::fread("flights.csv") write_and_read <- function() { write.csv( dt,tempfile(),row.names=FALSE) read.df(sqlContext,"flights.csv",source = "com.databricks.spark.csv",header = "true",inferSchema =“真”)} ##单位:秒## expr平均中位数## write_and_read() 2.924142 2.959085 2.983008 ## 2.994027 ## max neval ## 3.01244 3.030854 3我不太确定是否真的有必要把R中可以处理的数据推到火花上,但不要多说。
编辑
这个问题应该由火花-11086在Spark1.6.0中解决。
https://stackoverflow.com/questions/32888142
复制相似问题