SparkR dubt和断管异常
嗨,我在用纱线簇的分布式模式开发SparkR 我有两个问题: 1)如果我制作了一个包含R行代码和SparkR行代码的脚本,它将只分发SparkR代码或简单的R? 这是剧本。我读了一个csv,只取了10万条第一条记录。 我清理它(使用R函数)删除NA值并创建一个SparkR数据帧SparkR dubt和断管异常,r,apache-spark,sparkr,R,Apache Spark,Sparkr,嗨,我在用纱线簇的分布式模式开发SparkR 我有两个问题: 1)如果我制作了一个包含R行代码和SparkR行代码的脚本,它将只分发SparkR代码或简单的R? 这是剧本。我读了一个csv,只取了10万条第一条记录。 我清理它(使用R函数)删除NA值并创建一个SparkR数据帧 它就是这样做的:foreach Lineset获取该行集出现的每个时间间隔,并对某些属性(数值属性)求和,然后将它们全部放入一个矩阵中 这是包含R和SparkR代码的脚本。在独立模式下需要7小时,在分布式模式下需要60小
它就是这样做的:foreach Lineset获取该行集出现的每个时间间隔,并对某些属性(数值属性)求和,然后将它们全部放入一个矩阵中 这是包含R和SparkR代码的脚本。在独立模式下需要7小时,在分布式模式下需要60小时(被
java.net.SocketException
:断管杀死)
linesSint请不要误会,但这不是一段写得特别好的代码。使用core R的效率已经很低,而将SparkR添加到等式中会使情况变得更糟
如果我制作了一个包含R行代码和SparkR行代码的脚本,它将只分发SparkR代码还是简单的R
除非您使用的是分布式数据结构和在这些结构上运行的函数,否则它只是在主服务器上的单个线程中执行的普通R代码
为什么仅仅在R中如此之快而在SparkR中如此之慢
for(i in 1:length(UniqueLineSet)){
SubSetID<-subset.data.frame(LineSmsInt,LINESET==UniqueLineSet[i])
for(j in 1:length(UniqueTime)){
SubTime<-subset.data.frame(SubSetID,TimeInterval==UniqueTime[j])
IntTemp[k,1]<-UniqueLineSet[i]
IntTemp[k,2]<-as.numeric(UniqueTime[j])
IntTemp[k,3]<-sum(SubTime$SmsIn,na.rm = TRUE)
IntTemp[k,4]<-sum(SubTime$SmsOut,na.rm = TRUE)
IntTemp[k,5]<-sum(SubTime$CallIn,na.rm = TRUE)
IntTemp[k,6]<-sum(SubTime$CallOut,na.rm = TRUE)
IntTemp[k,7]<-sum(SubTime$Internet,na.rm=TRUE)
k<-k+1
}
print(UniqueLineSet[i])
print(i)
}
对于初学者,您可以为行集
、UniqueTime
和列的每个组合执行单个作业。每次Spark扫描所有记录并向驱动程序获取数据时
此外,使用Spark处理可以在一台机器的内存中轻松处理的数据根本没有意义。在这种情况下运行作业的成本通常比实际处理的成本高得多
建议
如果您真的想使用SparkR,只需groupBy
和agg
:
group_by(Short, Short$LINESET, Short$TimeInterval) %>% agg(
sum(Short$SmsIn), sum(Short$SmsOut), sum(Short$CallIn),
sum(Short$CallOut), sum(Short$Internet))
如果您关心缺少(LINESET
,TimeInterval
)对,请使用join
或unionAll
填充这些对
实际上,它只需使用数据表
并在本地聚合:
Short[, lapply(.SD, sum, na.rm=TRUE), by=.(LINESET, TimeInterval)]
谢谢。我尝试了这个差分函数(我不知道),它当然可以工作。现在很快。我是斯巴克(sparkR)的新成员。你有关于sparkR的链接吗(通过sparkR官方文档)?没有,但我不使用sparkR,所以我从来没有找过类似的东西。不过,您可以使用任何通用的Spark/SparkSQL引用。这里没有区别。我有另一个dubt,createDataFrame是集群上的分发站点吗?如果我从hdfs或简单的csv读取文件,有什么区别吗?(对于发行版,我的意思是)是的,有区别。一般来说,除了原型设计和测试之外,您可能应该避免并行本地数据结构。
Short[, lapply(.SD, sum, na.rm=TRUE), by=.(LINESET, TimeInterval)]