我基本上有2个保存操作要在我的数据帧上执行。工作运行正常。但是当我在Spark UI中看到事件时间轴时,我理解第一个Action 1完成,然后Action 2开始并完成。
由于这两个动作彼此独立,有没有办法一起执行它们。以下是我的代码。
processedDF.write.format("ORC").options(Map("path" ->
integrationFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "."
+ hiveTableName + "_int")
errorDF.write.format("ORC").options(Map("path" ->
errorFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." +
hiveTableName + "_error")
我想处理" processDF"和" errorDF"同时写入HDFS。
答案 0 :(得分:1)
您可以在不同的主题中启动它们:
async: false
答案 1 :(得分:0)
请参阅日程安排文档here。逐字复制相关部分:
在给定的Spark应用程序(SparkContext实例)中,如果从单独的线程提交多个并行作业,它们可以同时运行。[...]默认情况下,Spark的调度程序以FIFO方式运行作业。每个工作分为“阶段”(例如地图和减少阶段),第一个工作优先考虑所有可用资源,而其阶段有任务要启动,然后第二个工作获得优先权等等。[...]从Spark 0.8,也可以配置作业之间的公平共享。在公平共享下,Spark以“循环”方式在作业之间分配任务,以便所有作业获得大致相等的群集资源份额。这意味着在长时间工作运行时提交的短工作可以立即开始接收资源,并且仍然可以获得良好的响应时间,而无需等待长时间的工作完成。
要启用公平调度程序,只需在配置SparkContext时将spark.scheduler.mode属性设置为FAIR:
val conf = new SparkConf().setMaster(...).setAppName(...)
conf.set("spark.scheduler.mode", "FAIR")
val sc = new SparkContext(conf)
答案 2 :(得分:0)
如果有人仍在寻找解决方案,我会使用Future进行相同的操作
@volatile var terminated = false
import scala.concurrent._
import ExecutionContext.Implicits.global
val f1= Future{processedDF.write.format("ORC").options(Map("path" ->
integrationFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "."
+ hiveTableName + "_int")}
val f2= Future{errorDF.write.format("ORC").options(Map("path" ->
errorFullPath)).mode(SaveMode.Overwrite).saveAsTable(HIVE_SCHEMA + "." +
hiveTableName + "_error")}
val aggregatedFuture = for{
f1Result <- f1
f2Result <- f2
} yield (f1Result, f2Result)
Thread.sleep(500)
terminated = true
val res = Await.result(aggregatedFuture, Duration.Inf)