将中间结果保存在Spark中

时间:2016-06-23 07:05:41

标签: hadoop apache-spark spark-dataframe

我使用Spark SQL 1.6.0创建处理管道。该管道由步骤/转换组成,一步的输出转发到下一步。在最后一步之后,生成的DataFrame将保存在HDFS中。我还需要在一些中间步骤中保存结果。执行此操作的代码为:

saveDataFrame(flushPath, flushFormat, isCoalesce, flushMode, previousDataFrame, sqlContext)
previousDataFrame

此处,previousDataFrame是最后一步的结果,saveDataFrame只是将DataFrame保存为给定位置,然后nextDataFrame将用于后续步骤/转换。最后,在最后一步之后,它将被保存在HDFS中。 saveDataFrame的代码是:

implicit def saveDataFrame(path: String, format: String, isCoalesce: Boolean, saveMode: SaveMode, dataFrame: DataFrame, sqlContext: SQLContext): Unit = {
val source = if (isCoalesce) dataFrame.coalesce(1) else dataFrame
if (format.equalsIgnoreCase("csv")) {
  source
    .write
    .mode(saveMode)
    .format("com.databricks.spark.csv")
    .option("header", "true")
    .option("inferSchema", "true")
    .save(path)
}
else if (format.equalsIgnoreCase("parquet") || format.equalsIgnoreCase("json")) {
  source
    .write
    .mode(SaveMode.Overwrite)
    .format(format)
    .save(path)
}
else {
  throw new Exception("%s input format is not supported".format(format))
}}

这很好用,只有火花应用程序比平常花费更长的时间。如果保存中间输出应用程序在20分钟内运行,那么使用此代码需要1小时。尽管根据Spark UI,作业和任务在20分钟内完成,但火花提交过程仍持续到1小时。

请帮助弄清楚结果。我也尝试了两种可能的解决方案:

  • 使用Future创建多线程来调用saveDataFrame。
  • 在保存之前缓存previousDataFrame并将其重新用于下一步。

1 个答案:

答案 0 :(得分:0)

问题是AWS S3路径,导致执行延迟。当我开始将输出保存到HDFS时,执行时间减少了。