SparkR dubt和Broken管道异常

时间:2016-01-11 10:06:04

标签: r apache-spark sparkr

您好我在使用纱线集群的分销模式下使用SparkR。

我有两个问题:

1)如果我创建了一个包含R行代码和SparkR行代码的脚本,那么它也只会分发SparkR代码或简单的R?

这是脚本。我读了一张csv,只拿了100k的第一张唱片。 我清理它(使用R函数)删除NA值并创建SparkR数据帧。
它就是这样做的:foreach Lineset将每个TimeInterval放在LineSet出现的位置并加上一些属性(数字属性),然后将它们全部放入Matrix中。

这是带有R和SparkR代码的脚本。在独立模式下需要7h,在分布式模式下需要60h(被java.net.SocketException杀死:管道破裂)

LineSmsInt<-fread("/home/sentiment/Scrivania/LineSmsInt.csv")
Short<-LineSmsInt[1:100000,]
Short[is.na(Short)] <- 0
Short$TimeInterval<-Short$TimeInterval/1000
ShortDF<-createDataFrame(sqlContext,Short)
UniqueLineSet<-unique(Short$LINESET)
UniqueTime<-unique(Short$TimeInterval)
UniqueTime<-as.numeric(UniqueTime)
Row<-length(UniqueLineSet)*length(UniqueTime)
IntTemp<-matrix(nrow =Row,ncol=7)
k<-1

colnames(IntTemp)<-c("LINESET","TimeInterval","SmsIN","SmsOut","CallIn","CallOut","Internet")
Sys.time()
for(i in 1:length(UniqueLineSet)){
  SubSetID<-filter(ShortDF,ShortDF$LINESET==UniqueLineSet[i])
  for(j in 1:length(UniqueTime)){
    SubTime<-filter(SubSetID,SubSetID$TimeInterval==UniqueTime[j])       
    IntTemp[k,1]<-UniqueLineSet[i]
    IntTemp[k,2]<-as.numeric(UniqueTime[j])
    k3<-collect(select(SubTime,sum(SubTime$SmsIn)))
    IntTemp[k,3]<-k3[1,1]
    k4<-collect(select(SubTime,sum(SubTime$SmsOut)))
    IntTemp[k,4]<-k4[1,1]
    k5<-collect(select(SubTime,sum(SubTime$CallIn)))
    IntTemp[k,5]<-k5[1,1]
    k6<-collect(select(SubTime,sum(SubTime$CallOut)))
    IntTemp[k,6]<-k6[1,1]
    k7<-collect(select(SubTime,sum(SubTime$Internet)))
    IntTemp[k,7]<-k7[1,1]
    k<-k+1
  }
  print(UniqueLineSet[i])
  print(i)
}

这是脚本R,唯一改变的是子集函数,当然是普通的R data.frame而不是SparkR数据帧。 独立模式需要1.30分钟 为什么它只是在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)
}

2)处于分配模式的第一个脚本被:

杀死
  

java.net.SocketException:Broken Pipe

这有时也会出现:

  

java.net.SocketTimeoutException:接受超时

它可能来自错误的配置?建议吗

感谢。

1 个答案:

答案 0 :(得分:2)

不要采取错误的方式,但这不是一个特别好的代码。使用核心R已经效率低下,并且将SparkR添加到等式中会使其更糟糕。

  

如果我创建了一个包含R行代码和SparkR行代码的脚本,它只会分发SparkR代码或简单的R?

除非您使用在这些结构上运行的分布式数据结构和函数,否则它只是在主服务器上的单个线程中执行的简单R代码。

  

为什么它只是在R中如此之快而且它在SparkR中如此之慢?

对于初学者,您为LINESETUniqueTime和列的每个组合执行一项作业。 Spark每次扫描所有记录并将数据提取给驱动程序。

此外,使用Spark来处理可以在单个机器的内存中轻松处理的数据根本没有意义。在这种情况下运行工作的成本通常远高于实际处理的成本。

  

建议?

如果您真的只想使用SparkR groupByagg

group_by(Short, Short$LINESET, Short$TimeInterval) %>% agg(
  sum(Short$SmsIn), sum(Short$SmsOut), sum(Short$CallIn),
  sum(Short$CallOut), sum(Short$Internet))

如果您关心遗失(LINESETTimeInterval),请使用joinunionAll填充这些内容。

在实践中,它只会坚持使用data.table并在本地聚合:

Short[, lapply(.SD, sum, na.rm=TRUE), by=.(LINESET, TimeInterval)]
相关问题