[英]spark RDD union action very slow
我有2个Spark RDD,dataRDD和newPairDataRDD用于Spark SQL查询。 当我的应用程序初始化时,dataRDD将被初始化。 一个指定的hbase实体中的所有数据将存储到dataRDD。
当客户端的sql查询到来时,我的APP将获取所有新更新并插入到newPairDataRDD中。 dataRDD将newPairDataRDD合并并在spark SQL上下文中注册为表。
我在dataRDD中甚至发现了0条记录,在newPairDataRDD中发现了1条新插入的记录。 工会需要4秒钟。 太慢了
我认为这是不合理的。 有人知道如何使其更快吗? 感谢下面的简单代码
// Step1: load all data from hbase to dataRDD when initial, this only run once.
JavaPairRDD<String, Row> dataRDD= getAllBaseDataToJavaRDD();
dataRDD.cache();
dataRDD.persist(StorageLevel.MEMORY_ONLY());
logger.info(dataRDD.count());
// Step2: when spark sql query coming, load latest updated and inserted data from db to newPairDataRDD
JavaPairRDD<String, Row> newPairDataRDD = getUpdateOrInstertBaseDataToJavaRDD();
// Step3: if count>0 do union and reduce
if(newPairDataRDD.count() > 0) {
JavaPairRDD<String, Row> unionedRDD =dataRDD.union(newPairDataRDD);
// if data was updated in DB, need to delete the old version from the dataRDD.
dataRDD = unionedRDD.reduceByKey(
new Function2<Row, Row, Row>() {
// @Override
public Row call(Row r1, Row r2) {
return r2;
}
});
}
//step4: register the dataRDD
JavaSchemaRDD schemaRDD = sqlContext.applySchema(dataRDD..values(), schema);
//step5: execute sql query
retRDD = sqlContext.sql(sql);
List<org.apache.spark.sql.api.java.Row> rows = retRDD.collect();
在spark web ui中,我可以看到以下内容。 显然,工会需要4秒
完成阶段(8)
StageId描述提交的持续时间任务:成功/总输入Shuffle读取Shuffle写入
6在SparkPlan收集.scala:85 + details 1/4/2015 8:17 2 s 8-Aug 156.0 B
在SparkSqlQueryForMarsNew.java处的7联合:389+细节1/4/2015 8:17 4 s 8-八月64.0 B 156.0 B
您正在监视的是两个.count()调用的时间,而不是.union()的时间,该时间由调度程序分组在同一阶段,并且实际上在Spark中是很长的调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.