使用scala运行spark作业,正如预期的那样,所有作业都按时完成,但某些INFO日志会在作业停止前打印20-25分钟。
发布一些有助于解决问题的UI屏幕截图。
我不明白为什么两个工作ID之间花了这么多时间。
以下是我的代码段:
val sc = new SparkContext(conf)
for (x <- 0 to 10) {
val zz = getFilesList(lin);
val links = zz._1
val path = zz._2
lin = zz._3
val z = sc.textFile(links.mkString(",")).map(t => t.split('\t')).filter(t => t(4) == "xx" && t(6) == "x").map(t => titan2(t)).filter(t => t.length > 35).map(t => ((t(34)), (t(35), t(5), t(32), t(33))))
val way_nodes = sc.textFile(way_source).map(t => t.split(";")).map(t => (t(0), t(1)));
val t = z.join(way_nodes).map(t => (t._2._1._2, Array(Array(t._2._1._2, t._2._1._3, t._2._1._4, t._2._1._1, t._2._2)))).reduceByKey((t, y) => t ++ y).map(t => process(t)).flatMap(t => t).combineByKey(createTimeCombiner, timeCombiner, timeMerger).map(averagingFunction).map(t => t._1 + "," + t._2)
t.saveAsTextFile(path)
}
sc.stop()
更多跟进:spark-1.4.1 saveAsTextFile to S3 is very slow on emr-4.0.0
答案 0 :(得分:18)
在我发表评论时,我建议使用spark-csv软件包而不是sc.saveAsTextFile
,使用该软件包直接写入s3没有问题:)
我不知道您是使用s3还是s3n,但可能会尝试切换。我在Spark 1.5.2(EMR-4.2)上使用s3a遇到了问题,其中写入时间一直超时并且切换回s3解决了问题,所以值得一试。
其他一些应该加速写入s3的事情是使用DirectOutputCommiter
conf.set("spark.hadoop.mapred.output.committer.class","com.appsflyer.spark.DirectOutputCommitter")
并禁用_SUCCESS文件的生成:
sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")
请注意,必须在SparkContext
的hadoop配置上设置禁用_SUCCESS文件,而不是在SparkConf
上设置。
我希望这会有所帮助。
答案 1 :(得分:2)
我最终升级了我的火花版本并解决了问题。
答案 2 :(得分:1)
将文件写入S3时遇到了同样的问题。我使用spark 2.0版本,只是为了给你一个经过验证的答案的更新代码
在Spark 2.0中,您可以使用
val spark = SparkSession.builder().master("local[*]").appName("App_name").getOrCreate()
spark.conf.set("spark.hadoop.mapred.output.committer.class","com.appsflyer.spark.DirectOutputCommitter")
spark.conf.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")
这解决了我遇到工作的问题