如何在spark中触发2个写操作

时间:2016-10-03 02:46:05

标签: apache-spark apache-spark-sql spark-dataframe

我基本上有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。

3 个答案:

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