Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark RDD.isEmpty花费了很多时间_Apache Spark - Fatal编程技术网

Apache spark Spark RDD.isEmpty花费了很多时间

Apache spark Spark RDD.isEmpty花费了很多时间,apache-spark,Apache Spark,我构建了一个火花簇。 工人:2名 核心:12 内存:总共32.0 GB,已使用20.0 GB 每个工人有1个cpu、6个内核和10.0 GB内存 我的程序从MongoDB集群获取数据源Spark和MongoDB集群位于同一LAN(1000Mbps)中。 MongoDB文档格式: {name:string,value:double,time:ISODate} 大约有1300万份文件 我想从包含60个文档的特殊时间中获取特殊名称的平均值。 这是我的关键功能 /* *rdd=sc.newAPIH

我构建了一个
火花簇

工人:2名
核心:12
内存:总共32.0 GB,已使用20.0 GB
每个工人有1个cpu、6个内核和10.0 GB内存

我的程序从MongoDB集群获取数据源
Spark
MongoDB集群
位于同一
LAN
(1000Mbps)中。
MongoDB文档
格式:
{name:string,value:double,time:ISODate}

大约有1300万份文件

我想从包含60个文档的特殊时间中获取特殊
名称的平均值。
这是我的关键功能

 /*
  *rdd=sc.newAPIHadoopRDD(configOriginal, classOf[com.mongodb.hadoop.MongoInputFormat], classOf[Object], classOf[BSONObject])
   Apache-Spark-1.3.1 scala doc: SparkContext.newAPIHadoopFile[K, V, F <: InputFormat[K, V]](path: String, fClass: Class[F], kClass: Class[K], vClass: Class[V], conf: Configuration = hadoopConfiguration): RDD[(K, V)]
  */
def findValueByNameAndRange(rdd:RDD[(Object,BSONObject)],name:String,time:Date): RDD[BasicBSONObject]={

val nameRdd = rdd.map(arg=>arg._2).filter(_.get("name").equals(name))
val timeRangeRdd1 = nameRdd.map(tuple=>(tuple, tuple.get("time").asInstanceOf[Date]))
val timeRangeRdd2 = timeRangeRdd1.map(tuple=>(tuple._1,duringTime(tuple._2,time,getHourAgo(time,1))))
val timeRangeRdd3 = timeRangeRdd2.filter(_._2).map(_._1)
val timeRangeRdd4 = timeRangeRdd3.map(x => (x.get("name").toString, x.get("value").toString.toDouble)).reduceByKey(_ + _)

if(timeRangeRdd4.isEmpty()){
  return basicBSONRDD(name, time)
}
else{
 return timeRangeRdd4.map(tuple => {
  val bson = new BasicBSONObject()
  bson.put("name", tuple._1)
  bson.put("value", tuple._2/60)
  bson.put("time", time)
   bson })
  }
} 
电话是34


我知道reduceByKey是一家全球性的公司,可能需要花费很多时间,但是它的成本超出了我的预算。我该如何改进它,否则这是Spark的缺陷。在相同的计算和硬件条件下,如果我使用java的多线程,只需几秒钟。

首先,
isEmpty
仅仅是RDD阶段结束的时间点。
map
s和
filter
s不需要随机播放,UI中使用的方法始终是触发阶段更改/随机播放的方法……在这种情况下,
是空的
。从这个角度看,它运行缓慢的原因并不容易辨别,尤其是在没有看到原始
RDD
的组成的情况下。我可以告诉您,
isEmpty
首先检查
分区的大小,然后执行
获取(1)
并验证是否返回了数据。因此,很可能网络中存在瓶颈或其他阻碍。这甚至可能是一个GC问题。。。点击
isEmpty
,看看你还能从中看到什么

贾斯汀,你说得对,大部分时间可能是由
reduceByKey
花费的。我已经更新了这个问题,你能给我更多的建议吗?很抱歉反应太晚了。如果您仍然需要帮助,那么我很好奇一张
地图
收集
/
需要多长时间(100)
需要多长时间?知道它是在地图上装瓶还是在reducebykey上。看着屏幕截图,我很有信心它是地图…这意味着它更像是一个数据库的东西。。。
 timeRangeRdd3.map(x => (x.get("name").toString, x.get("value").toString.toDouble)).reduceByKey(_ + _)