我使用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小时。
请帮助弄清楚结果。我也尝试了两种可能的解决方案:
答案 0 :(得分:0)
问题是AWS S3路径,导致执行延迟。当我开始将输出保存到HDFS时,执行时间减少了。