我从mongo提取数据。处理数据,然后将数据存储在hdfs中。
提取和处理1m条记录的时间不到1.1分钟。
提取代码
JavaRDD<Document> rdd = MongoSpark.load(jsc);
处理代码
JavaRDD<String> fullFile = rdd.map(new Function<Document, String>() {
public String call(Document s) {
// System.out.println(" About to Transform Json ----- " + s.toJson());
return JsonParsing.returnKeyJson(JsonParsing.returnFlattenMapJson(s.toJson()),args[3].split(","),extractionDetails);
}
});
System.out.println("Records Downloaded - " + fullFile.count());
完成时间不到1.1分钟。当我在那一点得到rdd的计数时。
之后我保存命令如下,
fullFile
.coalesce(1)
.saveAsTextFile(args[4], GzipCodec.class);
这至少需要15到20分钟才能将其保存到hdfs中。
不知道为什么要花很多时间。如果有什么办法可以加快进程,请告诉我。
我使用以下选项来运行它,-num executors 4--executor memory 4g--executor cores 4
如果我增加执行者或记忆的#,仍然没有任何区别。我已经将分区的#设置为70,不确定是否提高了这个值,是否有性能?
任何减少储蓄时间的建议都是有用的。
提前谢谢
1条答案
按热度按时间zynd9foi1#
这是你用的
coalesce(1)
意味着你要把分区数减少到1,这就是为什么它需要更多的时间。由于它们在写入时只有一个分区,因此只有一个任务/执行器将整个数据写入所需的位置。如果您想写得比coalesce中增加分区值快。只需删除coalesce
或增值coalesce
. 在spark ui中写入数据时,不能进行分区。