Spark工作完成但应用程序需要时间才能完成

时间:2016-01-25 20:54:53

标签: scala amazon-s3 apache-spark

使用scala运行spark作业,正如预期的那样,所有作业都按时完成,但某些INFO日志会在作业停止前打印20-25分钟。

发布一些有助于解决问题的UI屏幕截图。

  1. 以下是4个阶段的时间:
  2. Time taken by 4 stages

    1. 以下是连续工作ID之间的时间 time between consecutive job ids
    2. 我不明白为什么两个工作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

3 个答案:

答案 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")

这解决了我遇到工作的问题